diff --git a/finecms/.htaccess b/finecms/.htaccess deleted file mode 100644 index 2db7750..0000000 --- a/finecms/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ -Options +FollowSymLinks -RewriteEngine On -RewriteBase / -RewriteCond %{REQUEST_FILENAME} !-f -RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css|css3)$ index.php [NC,L] \ No newline at end of file diff --git a/finecms/.idea/compiler.xml b/finecms/.idea/compiler.xml deleted file mode 100644 index 96cc43e..0000000 --- a/finecms/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/.idea/copyright/profiles_settings.xml b/finecms/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/finecms/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/finecms/.idea/misc.xml b/finecms/.idea/misc.xml deleted file mode 100644 index c51e6c5..0000000 --- a/finecms/.idea/misc.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/finecms/.idea/workspace.xml b/finecms/.idea/workspace.xml deleted file mode 100644 index 59532a1..0000000 --- a/finecms/.idea/workspace.xml +++ /dev/null @@ -1,1159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - logo.png - - - - - - - - - - - - true - DEFINITION_ORDER - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - project - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1535091435722 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/README.md b/finecms/README.md deleted file mode 100644 index bc5f49e..0000000 --- a/finecms/README.md +++ /dev/null @@ -1,22 +0,0 @@ -**FineCMS企业网站管理系统** - -FineCMS企业网站管理系统(简称企业版)是一款基于PHP+MySql+CI框架开发的高效简洁的中小型内容管理系统,面向多终端包括Pc端网页和移动端网页,支持自定义内容模型和会员模型,并且可以自定义字段,可面向中小型站点提供重量级网站建设解决方案,适用于小型站点、企业级网站、新闻内容网站等,个人站长及中小企业的首选建站系统。 - - -**免费开源无任何商业限制** -> FineCMS企业网站管理系统免费并开放源代码,推荐开发者或公司在此基础上进行二次开发或者发行,支持修改程序版权并发行新的程序(如改成xiaocms、dacms、haocms、huaicms都行),我们一直提倡免费开源,希望在此基础上开发的开发者也能保持免费开源,为本土的开源事业做一点贡献 - - - -**官方网站** - -http://www.finecms.net - - - -**官方论坛** - -http://www.finecms.net/bbs - - - diff --git a/finecms/admin.php b/finecms/admin.php deleted file mode 100644 index 4483a3c..0000000 --- a/finecms/admin.php +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/anchor/anchor.html b/finecms/api/ueditor/dialogs/anchor/anchor.html deleted file mode 100644 index f277847..0000000 --- a/finecms/api/ueditor/dialogs/anchor/anchor.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - -
- -
- - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/attachment/attachment.css b/finecms/api/ueditor/dialogs/attachment/attachment.css deleted file mode 100644 index 548b428..0000000 --- a/finecms/api/ueditor/dialogs/attachment/attachment.css +++ /dev/null @@ -1,681 +0,0 @@ -@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/finecms/api/ueditor/dialogs/attachment/attachment.html b/finecms/api/ueditor/dialogs/attachment/attachment.html deleted file mode 100644 index 2ae9282..0000000 --- a/finecms/api/ueditor/dialogs/attachment/attachment.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - ueditor图片对话框 - - - - - - - - - - - - - - -
-
- - -
-
- -
-
-
-
- 0% - -
-
-
-
-
-
-
-
-
-
-
-
    -
  • -
-
-
- - -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/attachment/attachment.js b/finecms/api/ueditor/dialogs/attachment/attachment.js deleted file mode 100644 index 0f3ad0b..0000000 --- a/finecms/api/ueditor/dialogs/attachment/attachment.js +++ /dev/null @@ -1,758 +0,0 @@ -/** - * 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'); - for (i = 0; i < this.fileList.length; i++) { - data = this.fileList[i]; - link = data.url; - list.push({ - id: data.id, - title: data.original || link.substr(link.lastIndexOf('/') + 1), - url: prefix + link - }); - } - 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('id', urlPrefix + list[i].id); - 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 id = lis[i].getAttribute('id'); - var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); - list.push({ - title: title, - url: url, - id: id - }); - } - } - return list; - } - }; - - -})(); \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif deleted file mode 100644 index 9ca4fb6..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_default.png b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_default.png deleted file mode 100644 index 50ac1cb..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_default.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif deleted file mode 100644 index 206fede..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif deleted file mode 100644 index 2e3b7a2..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif deleted file mode 100644 index 5d5dec0..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif deleted file mode 100644 index b351a1f..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif deleted file mode 100644 index 26019b0..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif deleted file mode 100644 index bbb65c8..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif deleted file mode 100644 index ccb26fb..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif deleted file mode 100644 index 2e8743a..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif deleted file mode 100644 index 5359e46..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif deleted file mode 100644 index e7b8dd2..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif b/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif deleted file mode 100644 index e86c1c6..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/alignicon.gif b/finecms/api/ueditor/dialogs/attachment/images/alignicon.gif deleted file mode 100644 index 005a5ac..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/alignicon.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/alignicon.png b/finecms/api/ueditor/dialogs/attachment/images/alignicon.png deleted file mode 100644 index 4b6c444..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/alignicon.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/bg.png b/finecms/api/ueditor/dialogs/attachment/images/bg.png deleted file mode 100644 index 580be0a..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/bg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/file-icons.gif b/finecms/api/ueditor/dialogs/attachment/images/file-icons.gif deleted file mode 100644 index d8c02c2..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/file-icons.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/file-icons.png b/finecms/api/ueditor/dialogs/attachment/images/file-icons.png deleted file mode 100644 index 3ff82c8..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/file-icons.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/icons.gif b/finecms/api/ueditor/dialogs/attachment/images/icons.gif deleted file mode 100644 index 78459de..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/icons.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/icons.png b/finecms/api/ueditor/dialogs/attachment/images/icons.png deleted file mode 100644 index 12e4700..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/icons.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/image.png b/finecms/api/ueditor/dialogs/attachment/images/image.png deleted file mode 100644 index 19699f6..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/image.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/progress.png b/finecms/api/ueditor/dialogs/attachment/images/progress.png deleted file mode 100644 index 717c486..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/progress.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/success.gif b/finecms/api/ueditor/dialogs/attachment/images/success.gif deleted file mode 100644 index 8d4f311..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/success.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/attachment/images/success.png b/finecms/api/ueditor/dialogs/attachment/images/success.png deleted file mode 100644 index 94f968d..0000000 Binary files a/finecms/api/ueditor/dialogs/attachment/images/success.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/background/background.css b/finecms/api/ueditor/dialogs/background/background.css deleted file mode 100644 index 5c41fe9..0000000 --- a/finecms/api/ueditor/dialogs/background/background.css +++ /dev/null @@ -1,94 +0,0 @@ -.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/finecms/api/ueditor/dialogs/background/background.html b/finecms/api/ueditor/dialogs/background/background.html deleted file mode 100644 index 3cc2ac1..0000000 --- a/finecms/api/ueditor/dialogs/background/background.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - -
    -
    - - -
    -
    -
    -
    - -
    -
    - - -
    -
    -
    - : -
    -
    -
    -
    -
    - -
    -
    - : -
    -
    - :x:px  y:px -
    -
    -
    - -
    -
    -
    -
    -
    -
    - - - diff --git a/finecms/api/ueditor/dialogs/background/background.js b/finecms/api/ueditor/dialogs/background/background.js deleted file mode 100644 index 9a4a131..0000000 --- a/finecms/api/ueditor/dialogs/background/background.js +++ /dev/null @@ -1,376 +0,0 @@ -(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/finecms/api/ueditor/dialogs/background/images/bg.png b/finecms/api/ueditor/dialogs/background/images/bg.png deleted file mode 100644 index 580be0a..0000000 Binary files a/finecms/api/ueditor/dialogs/background/images/bg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/background/images/success.png b/finecms/api/ueditor/dialogs/background/images/success.png deleted file mode 100644 index 94f968d..0000000 Binary files a/finecms/api/ueditor/dialogs/background/images/success.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/charts/chart.config.js b/finecms/api/ueditor/dialogs/charts/chart.config.js deleted file mode 100644 index 678b00d..0000000 --- a/finecms/api/ueditor/dialogs/charts/chart.config.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 图表配置文件 - * */ - - -//不同类型的配置 -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/finecms/api/ueditor/dialogs/charts/charts.css b/finecms/api/ueditor/dialogs/charts/charts.css deleted file mode 100644 index ac3c764..0000000 --- a/finecms/api/ueditor/dialogs/charts/charts.css +++ /dev/null @@ -1,165 +0,0 @@ -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/finecms/api/ueditor/dialogs/charts/charts.html b/finecms/api/ueditor/dialogs/charts/charts.html deleted file mode 100644 index 70e2314..0000000 --- a/finecms/api/ueditor/dialogs/charts/charts.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - chart - - - - - -
    -
    -

    -
    -

    -
    -
    -
    - -
    - - -
    -
    -
    -
    - -
    - - - - -
    -
    -
    - -
    - -

    -
    -
    -
    - -
    - -

    -
    -
    -
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    - - - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/charts/charts.js b/finecms/api/ueditor/dialogs/charts/charts.js deleted file mode 100644 index 37344fd..0000000 --- a/finecms/api/ueditor/dialogs/charts/charts.js +++ /dev/null @@ -1,519 +0,0 @@ -/* - * 图片转换对话框脚本 - **/ - -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/finecms/api/ueditor/dialogs/charts/images/charts0.png b/finecms/api/ueditor/dialogs/charts/images/charts0.png deleted file mode 100644 index 9485e5e..0000000 Binary files a/finecms/api/ueditor/dialogs/charts/images/charts0.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/charts/images/charts1.png b/finecms/api/ueditor/dialogs/charts/images/charts1.png deleted file mode 100644 index b5a0039..0000000 Binary files a/finecms/api/ueditor/dialogs/charts/images/charts1.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/charts/images/charts2.png b/finecms/api/ueditor/dialogs/charts/images/charts2.png deleted file mode 100644 index 7c91a39..0000000 Binary files a/finecms/api/ueditor/dialogs/charts/images/charts2.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/charts/images/charts3.png b/finecms/api/ueditor/dialogs/charts/images/charts3.png deleted file mode 100644 index a6bc29b..0000000 Binary files a/finecms/api/ueditor/dialogs/charts/images/charts3.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/charts/images/charts4.png b/finecms/api/ueditor/dialogs/charts/images/charts4.png deleted file mode 100644 index 742006a..0000000 Binary files a/finecms/api/ueditor/dialogs/charts/images/charts4.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/charts/images/charts5.png b/finecms/api/ueditor/dialogs/charts/images/charts5.png deleted file mode 100644 index c49a296..0000000 Binary files a/finecms/api/ueditor/dialogs/charts/images/charts5.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/emotion.css b/finecms/api/ueditor/dialogs/emotion/emotion.css deleted file mode 100644 index f801105..0000000 --- a/finecms/api/ueditor/dialogs/emotion/emotion.css +++ /dev/null @@ -1,43 +0,0 @@ -.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/finecms/api/ueditor/dialogs/emotion/emotion.html b/finecms/api/ueditor/dialogs/emotion/emotion.html deleted file mode 100644 index fca0850..0000000 --- a/finecms/api/ueditor/dialogs/emotion/emotion.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - -
    -
    - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/emotion/emotion.js b/finecms/api/ueditor/dialogs/emotion/emotion.js deleted file mode 100644 index 6e158a9..0000000 --- a/finecms/api/ueditor/dialogs/emotion/emotion.js +++ /dev/null @@ -1,186 +0,0 @@ -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/finecms/api/ueditor/dialogs/emotion/images/0.gif b/finecms/api/ueditor/dialogs/emotion/images/0.gif deleted file mode 100644 index 6964168..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/0.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/bface.gif b/finecms/api/ueditor/dialogs/emotion/images/bface.gif deleted file mode 100644 index 14fe618..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/bface.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/cface.gif b/finecms/api/ueditor/dialogs/emotion/images/cface.gif deleted file mode 100644 index bff947f..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/cface.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/fface.gif b/finecms/api/ueditor/dialogs/emotion/images/fface.gif deleted file mode 100644 index 0d8a6af..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/fface.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/jxface2.gif b/finecms/api/ueditor/dialogs/emotion/images/jxface2.gif deleted file mode 100644 index a959c90..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/jxface2.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/neweditor-tab-bg.png b/finecms/api/ueditor/dialogs/emotion/images/neweditor-tab-bg.png deleted file mode 100644 index 8f398b0..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/neweditor-tab-bg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/tface.gif b/finecms/api/ueditor/dialogs/emotion/images/tface.gif deleted file mode 100644 index 1354f54..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/tface.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/wface.gif b/finecms/api/ueditor/dialogs/emotion/images/wface.gif deleted file mode 100644 index 5667160..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/wface.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/emotion/images/yface.gif b/finecms/api/ueditor/dialogs/emotion/images/yface.gif deleted file mode 100644 index 51608be..0000000 Binary files a/finecms/api/ueditor/dialogs/emotion/images/yface.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/gmap/gmap.html b/finecms/api/ueditor/dialogs/gmap/gmap.html deleted file mode 100644 index c4cbfe6..0000000 --- a/finecms/api/ueditor/dialogs/gmap/gmap.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - -
    - - - - - - -
    -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/help/help.css b/finecms/api/ueditor/dialogs/help/help.css deleted file mode 100644 index 4478475..0000000 --- a/finecms/api/ueditor/dialogs/help/help.css +++ /dev/null @@ -1,7 +0,0 @@ -.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/finecms/api/ueditor/dialogs/help/help.html b/finecms/api/ueditor/dialogs/help/help.html deleted file mode 100644 index 9e50060..0000000 --- a/finecms/api/ueditor/dialogs/help/help.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - 帮助 - - - - - -
    -
    - - -
    -
    -
    -

    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/finecms/api/ueditor/dialogs/help/help.js b/finecms/api/ueditor/dialogs/help/help.js deleted file mode 100644 index 9a2272e..0000000 --- a/finecms/api/ueditor/dialogs/help/help.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * 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/finecms/api/ueditor/dialogs/image/image.css b/finecms/api/ueditor/dialogs/image/image.css deleted file mode 100644 index 52c2295..0000000 --- a/finecms/api/ueditor/dialogs/image/image.css +++ /dev/null @@ -1,894 +0,0 @@ -@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/finecms/api/ueditor/dialogs/image/image.html b/finecms/api/ueditor/dialogs/image/image.html deleted file mode 100644 index 08ca022..0000000 --- a/finecms/api/ueditor/dialogs/image/image.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - ueditor图片对话框 - - - - - - - - - - - - - - -
    -
    - - - - -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    - - -
    -
    -
    -
    - -   px -   px - -
    -
    - - px -
    -
    - - px -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - 0% - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
    -
    -
    - - -
    -
    -
    - - - - -
    -
    - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/image/image.js b/finecms/api/ueditor/dialogs/image/image.js deleted file mode 100644 index c7cf59a..0000000 --- a/finecms/api/ueditor/dialogs/image/image.js +++ /dev/null @@ -1,1145 +0,0 @@ -/** - * 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 = $G('width').value, - oh = $G('height').value, - border = $G('border').value, - title = $G('title').value, - preview = $G('preview'), - width, - height; - - 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({ - id: data.id, - 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); - img.setAttribute('id', list[i].id); - 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, - id = img.getAttribute('id'), - src = img.getAttribute('_src'); - list.push({ - id: id, - 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('id', list[i].id); - 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({ - id: child.id, - src: src, - _src: src, - alt: src.substr(src.lastIndexOf('/') + 1), - floatStyle: align - }); - } - } - return list; - } - }; - -})(); diff --git a/finecms/api/ueditor/dialogs/image/images/alignicon.jpg b/finecms/api/ueditor/dialogs/image/images/alignicon.jpg deleted file mode 100644 index 754755b..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/alignicon.jpg and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/bg.png b/finecms/api/ueditor/dialogs/image/images/bg.png deleted file mode 100644 index 580be0a..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/bg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/icons.gif b/finecms/api/ueditor/dialogs/image/images/icons.gif deleted file mode 100644 index 78459de..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/icons.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/icons.png b/finecms/api/ueditor/dialogs/image/images/icons.png deleted file mode 100644 index 12e4700..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/icons.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/image.png b/finecms/api/ueditor/dialogs/image/images/image.png deleted file mode 100644 index 19699f6..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/image.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/progress.png b/finecms/api/ueditor/dialogs/image/images/progress.png deleted file mode 100644 index 717c486..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/progress.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/success.gif b/finecms/api/ueditor/dialogs/image/images/success.gif deleted file mode 100644 index 8d4f311..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/success.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/image/images/success.png b/finecms/api/ueditor/dialogs/image/images/success.png deleted file mode 100644 index 94f968d..0000000 Binary files a/finecms/api/ueditor/dialogs/image/images/success.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/insertframe/insertframe.html b/finecms/api/ueditor/dialogs/insertframe/insertframe.html deleted file mode 100644 index 7f1f3e9..0000000 --- a/finecms/api/ueditor/dialogs/insertframe/insertframe.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - -
    - - -
    px
    px
    - -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/internal.js b/finecms/api/ueditor/dialogs/internal.js deleted file mode 100644 index 44dc17f..0000000 --- a/finecms/api/ueditor/dialogs/internal.js +++ /dev/null @@ -1,81 +0,0 @@ -(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/finecms/api/ueditor/dialogs/link/link.html b/finecms/api/ueditor/dialogs/link/link.html deleted file mode 100644 index 55ab4d1..0000000 --- a/finecms/api/ueditor/dialogs/link/link.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - - - diff --git a/finecms/api/ueditor/dialogs/map/map.html b/finecms/api/ueditor/dialogs/map/map.html deleted file mode 100644 index e763b8e..0000000 --- a/finecms/api/ueditor/dialogs/map/map.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - -
    - - - - - - - - - -
    ::
    -
    - -
    - - - - - diff --git a/finecms/api/ueditor/dialogs/map/show.html b/finecms/api/ueditor/dialogs/map/show.html deleted file mode 100644 index 329cfeb..0000000 --- a/finecms/api/ueditor/dialogs/map/show.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - 百度地图API自定义地图 - - - - - - - -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/music/music.css b/finecms/api/ueditor/dialogs/music/music.css deleted file mode 100644 index 8fb7a94..0000000 --- a/finecms/api/ueditor/dialogs/music/music.css +++ /dev/null @@ -1,30 +0,0 @@ -.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/finecms/api/ueditor/dialogs/music/music.html b/finecms/api/ueditor/dialogs/music/music.html deleted file mode 100644 index e7ef04f..0000000 --- a/finecms/api/ueditor/dialogs/music/music.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - 插入音乐 - - - - -
    - -
    - -
    -
    -
    -
    - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/music/music.js b/finecms/api/ueditor/dialogs/music/music.js deleted file mode 100644 index 1c538bf..0000000 --- a/finecms/api/ueditor/dialogs/music/music.js +++ /dev/null @@ -1,192 +0,0 @@ -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/finecms/api/ueditor/dialogs/preview/preview.html b/finecms/api/ueditor/dialogs/preview/preview.html deleted file mode 100644 index f6b433b..0000000 --- a/finecms/api/ueditor/dialogs/preview/preview.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - -
    - -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/scrawl/images/addimg.png b/finecms/api/ueditor/dialogs/scrawl/images/addimg.png deleted file mode 100644 index 03a8713..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/addimg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/brush.png b/finecms/api/ueditor/dialogs/scrawl/images/brush.png deleted file mode 100644 index efa6fdb..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/brush.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/delimg.png b/finecms/api/ueditor/dialogs/scrawl/images/delimg.png deleted file mode 100644 index 5a892e4..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/delimg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/delimgH.png b/finecms/api/ueditor/dialogs/scrawl/images/delimgH.png deleted file mode 100644 index 2f0c5c9..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/delimgH.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/empty.png b/finecms/api/ueditor/dialogs/scrawl/images/empty.png deleted file mode 100644 index 0375196..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/empty.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/emptyH.png b/finecms/api/ueditor/dialogs/scrawl/images/emptyH.png deleted file mode 100644 index 838ca72..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/emptyH.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/eraser.png b/finecms/api/ueditor/dialogs/scrawl/images/eraser.png deleted file mode 100644 index 63e87ce..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/eraser.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/redo.png b/finecms/api/ueditor/dialogs/scrawl/images/redo.png deleted file mode 100644 index 12cd9bb..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/redo.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/redoH.png b/finecms/api/ueditor/dialogs/scrawl/images/redoH.png deleted file mode 100644 index d9f33d3..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/redoH.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/scale.png b/finecms/api/ueditor/dialogs/scrawl/images/scale.png deleted file mode 100644 index 935a3f3..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/scale.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/scaleH.png b/finecms/api/ueditor/dialogs/scrawl/images/scaleH.png deleted file mode 100644 index 72e64a9..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/scaleH.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/size.png b/finecms/api/ueditor/dialogs/scrawl/images/size.png deleted file mode 100644 index 8366845..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/size.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/undo.png b/finecms/api/ueditor/dialogs/scrawl/images/undo.png deleted file mode 100644 index 084c7cc..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/undo.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/images/undoH.png b/finecms/api/ueditor/dialogs/scrawl/images/undoH.png deleted file mode 100644 index fde7eb3..0000000 Binary files a/finecms/api/ueditor/dialogs/scrawl/images/undoH.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/scrawl/scrawl.css b/finecms/api/ueditor/dialogs/scrawl/scrawl.css deleted file mode 100644 index b18430d..0000000 --- a/finecms/api/ueditor/dialogs/scrawl/scrawl.css +++ /dev/null @@ -1,72 +0,0 @@ -/*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/finecms/api/ueditor/dialogs/scrawl/scrawl.html b/finecms/api/ueditor/dialogs/scrawl/scrawl.html deleted file mode 100644 index 9371abd..0000000 --- a/finecms/api/ueditor/dialogs/scrawl/scrawl.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - -
    -
    -
    - -
    -
    -
    - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    - - 1 - 3 - 5 - 7 -
    -
    - - 1 - 3 - 5 - 7 -
    -
    -
    - - -
    - -
    - -
    -
    -
    - - - - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/scrawl/scrawl.js b/finecms/api/ueditor/dialogs/scrawl/scrawl.js deleted file mode 100644 index d8bcf9d..0000000 --- a/finecms/api/ueditor/dialogs/scrawl/scrawl.js +++ /dev/null @@ -1,672 +0,0 @@ -/** - * 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 || ''; - imgObj.id = responseObj.id || ''; - 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/finecms/api/ueditor/dialogs/searchreplace/searchreplace.html b/finecms/api/ueditor/dialogs/searchreplace/searchreplace.html deleted file mode 100644 index b91f190..0000000 --- a/finecms/api/ueditor/dialogs/searchreplace/searchreplace.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - -
    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    :
    - -
    - - -
    -   -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    :
    :
    - -
    - - - - -
    -   -
    - -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/searchreplace/searchreplace.js b/finecms/api/ueditor/dialogs/searchreplace/searchreplace.js deleted file mode 100644 index 1b52857..0000000 --- a/finecms/api/ueditor/dialogs/searchreplace/searchreplace.js +++ /dev/null @@ -1,164 +0,0 @@ -/** - * 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/finecms/api/ueditor/dialogs/snapscreen/snapscreen.html b/finecms/api/ueditor/dialogs/snapscreen/snapscreen.html deleted file mode 100644 index cf8209e..0000000 --- a/finecms/api/ueditor/dialogs/snapscreen/snapscreen.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - -
    -

    -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/spechars/spechars.html b/finecms/api/ueditor/dialogs/spechars/spechars.html deleted file mode 100644 index 0b5c416..0000000 --- a/finecms/api/ueditor/dialogs/spechars/spechars.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - -
    -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/spechars/spechars.js b/finecms/api/ueditor/dialogs/spechars/spechars.js deleted file mode 100644 index f4c155e..0000000 --- a/finecms/api/ueditor/dialogs/spechars/spechars.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 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/finecms/api/ueditor/dialogs/table/dragicon.png b/finecms/api/ueditor/dialogs/table/dragicon.png deleted file mode 100644 index f26203b..0000000 Binary files a/finecms/api/ueditor/dialogs/table/dragicon.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/table/edittable.css b/finecms/api/ueditor/dialogs/table/edittable.css deleted file mode 100644 index c6f9396..0000000 --- a/finecms/api/ueditor/dialogs/table/edittable.css +++ /dev/null @@ -1,84 +0,0 @@ -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/finecms/api/ueditor/dialogs/table/edittable.html b/finecms/api/ueditor/dialogs/table/edittable.html deleted file mode 100644 index 3c412fb..0000000 --- a/finecms/api/ueditor/dialogs/table/edittable.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
      -
    • - -
    • -
    • - -
    • -
    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -

    -
      -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -

    -
      -
    • - - -
    • -
    -
    -
    -
    -
    -
    -

    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/table/edittable.js b/finecms/api/ueditor/dialogs/table/edittable.js deleted file mode 100644 index 11dbee7..0000000 --- a/finecms/api/ueditor/dialogs/table/edittable.js +++ /dev/null @@ -1,237 +0,0 @@ -/** - * 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/finecms/api/ueditor/dialogs/table/edittd.html b/finecms/api/ueditor/dialogs/table/edittd.html deleted file mode 100644 index 49a52f7..0000000 --- a/finecms/api/ueditor/dialogs/table/edittd.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - -
    - - -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/table/edittip.html b/finecms/api/ueditor/dialogs/table/edittip.html deleted file mode 100644 index 954f7bb..0000000 --- a/finecms/api/ueditor/dialogs/table/edittip.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - 表格删除提示 - - - - -
    -
    - -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/template/config.js b/finecms/api/ueditor/dialogs/template/config.js deleted file mode 100644 index 417b8f7..0000000 --- a/finecms/api/ueditor/dialogs/template/config.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * 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/finecms/api/ueditor/dialogs/template/images/bg.gif b/finecms/api/ueditor/dialogs/template/images/bg.gif deleted file mode 100644 index 8c1d10a..0000000 Binary files a/finecms/api/ueditor/dialogs/template/images/bg.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/template/images/pre0.png b/finecms/api/ueditor/dialogs/template/images/pre0.png deleted file mode 100644 index 8f3c16a..0000000 Binary files a/finecms/api/ueditor/dialogs/template/images/pre0.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/template/images/pre1.png b/finecms/api/ueditor/dialogs/template/images/pre1.png deleted file mode 100644 index 5a03f96..0000000 Binary files a/finecms/api/ueditor/dialogs/template/images/pre1.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/template/images/pre2.png b/finecms/api/ueditor/dialogs/template/images/pre2.png deleted file mode 100644 index 5a55672..0000000 Binary files a/finecms/api/ueditor/dialogs/template/images/pre2.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/template/images/pre3.png b/finecms/api/ueditor/dialogs/template/images/pre3.png deleted file mode 100644 index d852d29..0000000 Binary files a/finecms/api/ueditor/dialogs/template/images/pre3.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/template/images/pre4.png b/finecms/api/ueditor/dialogs/template/images/pre4.png deleted file mode 100644 index 0d7bc72..0000000 Binary files a/finecms/api/ueditor/dialogs/template/images/pre4.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/template/template.css b/finecms/api/ueditor/dialogs/template/template.css deleted file mode 100644 index 6c1608d..0000000 --- a/finecms/api/ueditor/dialogs/template/template.css +++ /dev/null @@ -1,18 +0,0 @@ -.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/finecms/api/ueditor/dialogs/template/template.html b/finecms/api/ueditor/dialogs/template/template.html deleted file mode 100644 index d9903a4..0000000 --- a/finecms/api/ueditor/dialogs/template/template.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    - - - - diff --git a/finecms/api/ueditor/dialogs/template/template.js b/finecms/api/ueditor/dialogs/template/template.js deleted file mode 100644 index 80a334b..0000000 --- a/finecms/api/ueditor/dialogs/template/template.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * 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/finecms/api/ueditor/dialogs/video/images/bg.png b/finecms/api/ueditor/dialogs/video/images/bg.png deleted file mode 100644 index 580be0a..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/bg.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/center_focus.jpg b/finecms/api/ueditor/dialogs/video/images/center_focus.jpg deleted file mode 100644 index 262b029..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/center_focus.jpg and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/file-icons.gif b/finecms/api/ueditor/dialogs/video/images/file-icons.gif deleted file mode 100644 index d8c02c2..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/file-icons.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/file-icons.png b/finecms/api/ueditor/dialogs/video/images/file-icons.png deleted file mode 100644 index 3ff82c8..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/file-icons.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/icons.gif b/finecms/api/ueditor/dialogs/video/images/icons.gif deleted file mode 100644 index 78459de..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/icons.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/icons.png b/finecms/api/ueditor/dialogs/video/images/icons.png deleted file mode 100644 index 12e4700..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/icons.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/image.png b/finecms/api/ueditor/dialogs/video/images/image.png deleted file mode 100644 index 19699f6..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/image.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/left_focus.jpg b/finecms/api/ueditor/dialogs/video/images/left_focus.jpg deleted file mode 100644 index 7886d27..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/left_focus.jpg and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/none_focus.jpg b/finecms/api/ueditor/dialogs/video/images/none_focus.jpg deleted file mode 100644 index 7c768dc..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/none_focus.jpg and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/progress.png b/finecms/api/ueditor/dialogs/video/images/progress.png deleted file mode 100644 index 717c486..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/progress.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/right_focus.jpg b/finecms/api/ueditor/dialogs/video/images/right_focus.jpg deleted file mode 100644 index 173e10d..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/right_focus.jpg and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/success.gif b/finecms/api/ueditor/dialogs/video/images/success.gif deleted file mode 100644 index 8d4f311..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/success.gif and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/images/success.png b/finecms/api/ueditor/dialogs/video/images/success.png deleted file mode 100644 index 94f968d..0000000 Binary files a/finecms/api/ueditor/dialogs/video/images/success.png and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/video/video.css b/finecms/api/ueditor/dialogs/video/video.css deleted file mode 100644 index 5870e7a..0000000 --- a/finecms/api/ueditor/dialogs/video/video.css +++ /dev/null @@ -1,635 +0,0 @@ -@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/finecms/api/ueditor/dialogs/video/video.html b/finecms/api/ueditor/dialogs/video/video.html deleted file mode 100644 index 5007882..0000000 --- a/finecms/api/ueditor/dialogs/video/video.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - 0% - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
      -
    • -
    -
    -
    -
    -
    - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/video/video.js b/finecms/api/ueditor/dialogs/video/video.js deleted file mode 100644 index db8d3d6..0000000 --- a/finecms/api/ueditor/dialogs/video/video.js +++ /dev/null @@ -1,791 +0,0 @@ -/** - * 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; - 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); - - $G("preview").innerHTML = '
    '+lang.urlError+'
    '+ - '' + - ''; - } - - - /* 插入上传视频 */ - function insertUpload(){ - var videoObjs=[], - uploadDir = editor.getOpt('videoUrlPrefix'), - width = $G('upload_width').value || 420, - height = $G('upload_height').value || 280, - align = findFocus("upload_alignment","name") || 'none'; - for(var key in uploadVideoList) { - var file = uploadVideoList[key]; - videoObjs.push({ - url: uploadDir + file.url, - id:file.id, - 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({ - 'id': json.id, - '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(); - } - }; - -})(); \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/webapp/webapp.html b/finecms/api/ueditor/dialogs/webapp/webapp.html deleted file mode 100644 index 1614377..0000000 --- a/finecms/api/ueditor/dialogs/webapp/webapp.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - -
    -
    -
    - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/wordimage/fClipboard_ueditor.swf b/finecms/api/ueditor/dialogs/wordimage/fClipboard_ueditor.swf deleted file mode 100644 index ac5d27f..0000000 Binary files a/finecms/api/ueditor/dialogs/wordimage/fClipboard_ueditor.swf and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/wordimage/imageUploader.swf b/finecms/api/ueditor/dialogs/wordimage/imageUploader.swf deleted file mode 100644 index 2a554ca..0000000 Binary files a/finecms/api/ueditor/dialogs/wordimage/imageUploader.swf and /dev/null differ diff --git a/finecms/api/ueditor/dialogs/wordimage/tangram.js b/finecms/api/ueditor/dialogs/wordimage/tangram.js deleted file mode 100644 index ba4e067..0000000 --- a/finecms/api/ueditor/dialogs/wordimage/tangram.js +++ /dev/null @@ -1,1495 +0,0 @@ -// 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/finecms/api/ueditor/dialogs/wordimage/wordimage.html b/finecms/api/ueditor/dialogs/wordimage/wordimage.html deleted file mode 100644 index 6cf6067..0000000 --- a/finecms/api/ueditor/dialogs/wordimage/wordimage.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - -
    - : -
    -
    -
    - - - - - - \ No newline at end of file diff --git a/finecms/api/ueditor/dialogs/wordimage/wordimage.js b/finecms/api/ueditor/dialogs/wordimage/wordimage.js deleted file mode 100644 index 98f3a22..0000000 --- a/finecms/api/ueditor/dialogs/wordimage/wordimage.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * 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/finecms/api/ueditor/lang/en/en.js b/finecms/api/ueditor/lang/en/en.js deleted file mode 100644 index c7e22f5..0000000 --- a/finecms/api/ueditor/lang/en/en.js +++ /dev/null @@ -1,684 +0,0 @@ -/** - * 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/finecms/api/ueditor/lang/en/images/addimage.png b/finecms/api/ueditor/lang/en/images/addimage.png deleted file mode 100644 index 3a2fd17..0000000 Binary files a/finecms/api/ueditor/lang/en/images/addimage.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/alldeletebtnhoverskin.png b/finecms/api/ueditor/lang/en/images/alldeletebtnhoverskin.png deleted file mode 100644 index 355eeab..0000000 Binary files a/finecms/api/ueditor/lang/en/images/alldeletebtnhoverskin.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/alldeletebtnupskin.png b/finecms/api/ueditor/lang/en/images/alldeletebtnupskin.png deleted file mode 100644 index 61658ce..0000000 Binary files a/finecms/api/ueditor/lang/en/images/alldeletebtnupskin.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/background.png b/finecms/api/ueditor/lang/en/images/background.png deleted file mode 100644 index d5bf5fd..0000000 Binary files a/finecms/api/ueditor/lang/en/images/background.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/button.png b/finecms/api/ueditor/lang/en/images/button.png deleted file mode 100644 index 098874c..0000000 Binary files a/finecms/api/ueditor/lang/en/images/button.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/copy.png b/finecms/api/ueditor/lang/en/images/copy.png deleted file mode 100644 index f982e8b..0000000 Binary files a/finecms/api/ueditor/lang/en/images/copy.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/deletedisable.png b/finecms/api/ueditor/lang/en/images/deletedisable.png deleted file mode 100644 index c8ee750..0000000 Binary files a/finecms/api/ueditor/lang/en/images/deletedisable.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/deleteenable.png b/finecms/api/ueditor/lang/en/images/deleteenable.png deleted file mode 100644 index 26acc88..0000000 Binary files a/finecms/api/ueditor/lang/en/images/deleteenable.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/listbackground.png b/finecms/api/ueditor/lang/en/images/listbackground.png deleted file mode 100644 index 4f82ccd..0000000 Binary files a/finecms/api/ueditor/lang/en/images/listbackground.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/localimage.png b/finecms/api/ueditor/lang/en/images/localimage.png deleted file mode 100644 index 12c8e6a..0000000 Binary files a/finecms/api/ueditor/lang/en/images/localimage.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/music.png b/finecms/api/ueditor/lang/en/images/music.png deleted file mode 100644 index 2f495fe..0000000 Binary files a/finecms/api/ueditor/lang/en/images/music.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/rotateleftdisable.png b/finecms/api/ueditor/lang/en/images/rotateleftdisable.png deleted file mode 100644 index 741526e..0000000 Binary files a/finecms/api/ueditor/lang/en/images/rotateleftdisable.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/rotateleftenable.png b/finecms/api/ueditor/lang/en/images/rotateleftenable.png deleted file mode 100644 index e164ddb..0000000 Binary files a/finecms/api/ueditor/lang/en/images/rotateleftenable.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/rotaterightdisable.png b/finecms/api/ueditor/lang/en/images/rotaterightdisable.png deleted file mode 100644 index 5a78c26..0000000 Binary files a/finecms/api/ueditor/lang/en/images/rotaterightdisable.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/rotaterightenable.png b/finecms/api/ueditor/lang/en/images/rotaterightenable.png deleted file mode 100644 index d768531..0000000 Binary files a/finecms/api/ueditor/lang/en/images/rotaterightenable.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/en/images/upload.png b/finecms/api/ueditor/lang/en/images/upload.png deleted file mode 100644 index 7bb15b3..0000000 Binary files a/finecms/api/ueditor/lang/en/images/upload.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/zh-cn/images/copy.png b/finecms/api/ueditor/lang/zh-cn/images/copy.png deleted file mode 100644 index b2536aa..0000000 Binary files a/finecms/api/ueditor/lang/zh-cn/images/copy.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/zh-cn/images/localimage.png b/finecms/api/ueditor/lang/zh-cn/images/localimage.png deleted file mode 100644 index 7303c36..0000000 Binary files a/finecms/api/ueditor/lang/zh-cn/images/localimage.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/zh-cn/images/music.png b/finecms/api/ueditor/lang/zh-cn/images/music.png deleted file mode 100644 index 354edeb..0000000 Binary files a/finecms/api/ueditor/lang/zh-cn/images/music.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/zh-cn/images/upload.png b/finecms/api/ueditor/lang/zh-cn/images/upload.png deleted file mode 100644 index 08d4d92..0000000 Binary files a/finecms/api/ueditor/lang/zh-cn/images/upload.png and /dev/null differ diff --git a/finecms/api/ueditor/lang/zh-cn/zh-cn.js b/finecms/api/ueditor/lang/zh-cn/zh-cn.js deleted file mode 100644 index 8ec7e5b..0000000 --- a/finecms/api/ueditor/lang/zh-cn/zh-cn.js +++ /dev/null @@ -1,669 +0,0 @@ -/** - * 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/finecms/api/ueditor/php/Uploader.class.php b/finecms/api/ueditor/php/Uploader.class.php deleted file mode 100644 index b497c37..0000000 --- a/finecms/api/ueditor/php/Uploader.class.php +++ /dev/null @@ -1,371 +0,0 @@ - "临时文件错误", - "ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件", - "ERROR_SIZE_EXCEED" => "文件大小超出网站限制", - "ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许", - "ERROR_CREATE_DIR" => "目录创建失败", - "ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限", - "ERROR_FILE_MOVE" => "文件保存时出错", - "ERROR_FILE_NOT_FOUND" => "找不到上传文件", - "ERROR_WRITE_CONTENT" => "写入文件内容错误", - "ERROR_UNKNOWN" => "未知错误", - "ERROR_DEAD_LINK" => "链接不可用", - "ERROR_HTTP_LINK" => "链接不是http链接", - "ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确", - "INVALID_URL" => "非法 URL", - "INVALID_IP" => "非法 IP" - ); - - /** - * 构造函数 - * @param string $fileField 表单名称 - * @param array $config 配置项 - * @param bool $base64 是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名 - */ - public function __construct($fileField, $config, $type = "upload") - { - $this->fileField = $fileField; - $this->config = $config; - $this->type = $type; - if ($type == "remote") { - $this->saveRemote(); - } else if($type == "base64") { - $this->upBase64(); - } else { - $this->upFile(); - } - - //$this->stateMap['ERROR_TYPE_NOT_ALLOWED'] = iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED']); - } - - /** - * 上传文件的主处理方法 - * @return mixed - */ - private function upFile() - { - $file = $this->file = $_FILES[$this->fileField]; - if (!$file) { - $this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND"); - return; - } - if ($this->file['error']) { - $this->stateInfo = $this->getStateInfo($file['error']); - return; - } else if (!is_file($file['tmp_name'])) { - $this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND"); - return; - } else if (!is_uploaded_file($file['tmp_name'])) { - $this->stateInfo = $this->getStateInfo("ERROR_TMPFILE"); - return; - } - - $this->oriName = $file['name']; - $this->fileSize = $file['size']; - $this->fileType = $this->getFileExt(); - $this->fullName = $this->getFullName(); - $this->filePath = $this->getFilePath(); - $this->fileName = $this->getFileName(); - $dirname = dirname($this->filePath); - - //检查文件大小是否超出限制 - if (!$this->checkSize()) { - $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); - return; - } - - //检查是否不允许的文件格式 - if (!$this->checkType()) { - $this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED"); - return; - } - - //创建目录失败 - if (!is_dir($dirname) && !mkdir($dirname, 0777, true)) { - $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); - return; - } else if (!is_writeable($dirname)) { - $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); - return; - } - - //移动文件 - if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && is_file($this->filePath))) { //移动失败 - $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE"); - } else { //移动成功 - $this->stateInfo = $this->stateMap[0]; - } - } - - /** - * 处理base64编码的图片上传 - * @return mixed - */ - private function upBase64() - { - $base64Data = $_POST[$this->fileField]; - $img = base64_decode($base64Data); - - $this->oriName = $this->config['oriName']; - $this->fileSize = strlen($img); - $this->fileType = $this->getFileExt(); - $this->fullName = $this->getFullName(); - $this->filePath = $this->getFilePath(); - $this->fileName = $this->getFileName(); - $dirname = dirname($this->filePath); - - //检查文件大小是否超出限制 - if (!$this->checkSize()) { - $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); - return; - } - - //创建目录失败 - if (!is_dir($dirname) && !mkdir($dirname, 0777, true)) { - $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); - return; - } else if (!is_writeable($dirname)) { - $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); - return; - } - - //移动文件 - if (!(file_put_contents($this->filePath, $img) && is_file($this->filePath))) { //移动失败 - $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT"); - } else { //移动成功 - $this->stateInfo = $this->stateMap[0]; - } - - } - - /** - * 拉取远程图片 - * @return mixed - */ - private function saveRemote() - { - $imgUrl = htmlspecialchars($this->fileField); - $imgUrl = str_replace("&", "&", $imgUrl); - - //http开头验证 - if (strpos($imgUrl, "http") !== 0) { - $this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK"); - return; - } - - preg_match('/(^https*:\/\/[^:\/]+)/', $imgUrl, $matches); - $host_with_protocol = count($matches) > 1 ? $matches[1] : ''; - - // 判断是否是合法 url - if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) { - $this->stateInfo = $this->getStateInfo("INVALID_URL"); - return; - } - - preg_match('/^https*:\/\/(.+)/', $host_with_protocol, $matches); - $host_without_protocol = count($matches) > 1 ? $matches[1] : ''; - - // 此时提取出来的可能是 ip 也有可能是域名,先获取 ip - $ip = gethostbyname($host_without_protocol); - // 判断是否是私有 ip - if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) { - $this->stateInfo = $this->getStateInfo("INVALID_IP"); - return; - } - - //获取请求头并检测死链 - $heads = get_headers($imgUrl, 1); - if (!(stristr($heads[0], "200") && stristr($heads[0], "OK"))) { - $this->stateInfo = $this->getStateInfo("ERROR_DEAD_LINK"); - return; - } - //格式验证(扩展名验证和Content-Type验证) - $fileType = strtolower(strrchr($imgUrl, '.')); - if (!in_array($fileType, $this->config['allowFiles']) || !isset($heads['Content-Type']) || !stristr($heads['Content-Type'], "image")) { - $this->stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE"); - return; - } - - //打开输出缓冲区并获取远程图片 - ob_start(); - $context = stream_context_create( - array('http' => array( - 'follow_location' => false // don't follow redirects - )) - ); - readfile($imgUrl, false, $context); - $img = ob_get_contents(); - ob_end_clean(); - preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m); - - $this->oriName = $m ? $m[1]:""; - $this->fileSize = strlen($img); - $this->fileType = $this->getFileExt(); - $this->fullName = $this->getFullName(); - $this->filePath = $this->getFilePath(); - $this->fileName = $this->getFileName(); - $dirname = dirname($this->filePath); - - //检查文件大小是否超出限制 - if (!$this->checkSize()) { - $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); - return; - } - - //创建目录失败 - if (!is_dir($dirname) && !mkdir($dirname, 0777, true)) { - $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); - return; - } else if (!is_writeable($dirname)) { - $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); - return; - } - - //移动文件 - if (!(file_put_contents($this->filePath, $img) && is_file($this->filePath))) { //移动失败 - $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT"); - } else { //移动成功 - $this->stateInfo = $this->stateMap[0]; - } - - } - - /** - * 上传错误检查 - * @param $errCode - * @return string - */ - private function getStateInfo($errCode) - { - return !$this->stateMap[$errCode] ? $this->stateMap["ERROR_UNKNOWN"] : $this->stateMap[$errCode]; - } - - /** - * 获取文件扩展名 - * @return string - */ - private function getFileExt() - { - return strtolower(strrchr($this->oriName, '.')); - } - - /** - * 重命名文件 - * @return string - */ - private function getFullName() - { - //替换日期事件 - $t = time(); - $d = explode('-', date("Y-y-m-d-H-i-s")); - $format = $this->config["pathFormat"]; - $format = str_replace("{yyyy}", $d[0], $format); - $format = str_replace("{yy}", $d[1], $format); - $format = str_replace("{mm}", $d[2], $format); - $format = str_replace("{dd}", $d[3], $format); - $format = str_replace("{hh}", $d[4], $format); - $format = str_replace("{ii}", $d[5], $format); - $format = str_replace("{ss}", $d[6], $format); - $format = str_replace("{time}", $t, $format); - - //过滤文件名的非法自负,并替换文件名 - $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.')); - $oriName = preg_replace("/[\|\?\"\<\>\/\*\\\\]+/", '', $oriName); - $format = str_replace("{filename}", $oriName, $format); - - //替换随机字符串 - $randNum = rand(1, 10000000000) . rand(1, 10000000000); - if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) { - $format = preg_replace("/\{rand\:[\d]*\}/i", substr($randNum, 0, $matches[1]), $format); - } - - $ext = $this->getFileExt(); - return $format . $ext; - } - - /** - * 获取文件名 - * @return string - */ - private function getFileName () { - return substr($this->filePath, strrpos($this->filePath, '/') + 1); - } - - /** - * 获取文件完整路径 - * @return string - */ - private function getFilePath() - { - $fullname = $this->fullName; - - if (substr($fullname, 0, 1) != '/') { - $fullname = '/' . $fullname; - } - - return DR_UE_PATH . $fullname; - } - - /** - * 文件类型检测 - * @return bool - */ - private function checkType() - { - return in_array($this->getFileExt(), $this->config["allowFiles"]); - } - - /** - * 文件大小检测 - * @return bool - */ - private function checkSize() - { - return $this->fileSize <= ($this->config["maxSize"]); - } - - /** - * 获取当前上传成功文件的各项信息 - * @return array - */ - public function getFileInfo() - { - return array( - "state" => $this->stateInfo, - "url" => $this->fullName, - "title" => $this->fileName, - "original" => $this->oriName, - "type" => $this->fileType, - "size" => $this->fileSize - ); - } - -} \ No newline at end of file diff --git a/finecms/api/ueditor/php/action_crawler.php b/finecms/api/ueditor/php/action_crawler.php deleted file mode 100644 index b66b36e..0000000 --- a/finecms/api/ueditor/php/action_crawler.php +++ /dev/null @@ -1,3 +0,0 @@ -load->model('attachment_model'); -$list = array(); -if ($notused) { - foreach ($notused as $t) { - $list[] = array( - 'id' => UEDITOR_IMG_ID.'_img_'.$t['id'], - 'url' => $t['attachment'], - 'mtime' => $t['inputtime'], - ); - } -} - -/* 返回数据 */ -$result = json_encode(array( - "state" => "SUCCESS", - "list" => $list, - "start" => 0, - "total" => count($notused) -)); - -return $result; - - -/** - * 遍历获取目录下的指定类型的文件 - * @param $path - * @param array $files - * @return array - */ -function getfiles($path, $allowFiles, &$files = array()) -{ - if (!is_dir($path)) return null; - if(substr($path, strlen($path) - 1) != '/') $path .= '/'; - $handle = opendir($path); - while (false !== ($file = readdir($handle))) { - if ($file != '.' && $file != '..') { - $path2 = $path . $file; - if (is_dir($path2)) { - getfiles($path2, $allowFiles, $files); - } else { - if (preg_match("/\.(".$allowFiles.")$/i", $file)) { - $files[] = array( - 'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])), - 'mtime'=> filemtime($path2) - ); - } - } - } - } - return $files; -} \ No newline at end of file diff --git a/finecms/api/ueditor/php/action_upload.php b/finecms/api/ueditor/php/action_upload.php deleted file mode 100644 index 37e53f4..0000000 --- a/finecms/api/ueditor/php/action_upload.php +++ /dev/null @@ -1,94 +0,0 @@ - $CONFIG['imagePathFormat'], - "maxSize" => $CONFIG['imageMaxSize'], - "allowFiles" => $CONFIG['imageAllowFiles'] - ); - $fieldName = $CONFIG['imageFieldName']; - break; - case 'uploadscrawl': - $config = array( - "pathFormat" => $CONFIG['scrawlPathFormat'], - "maxSize" => $CONFIG['scrawlMaxSize'], - "allowFiles" => $CONFIG['scrawlAllowFiles'], - "oriName" => "scrawl.png" - ); - $fieldName = $CONFIG['scrawlFieldName']; - $base64 = "base64"; - break; - case 'uploadvideo': - $config = array( - "pathFormat" => $CONFIG['videoPathFormat'], - "maxSize" => $CONFIG['videoMaxSize'], - "allowFiles" => $CONFIG['videoAllowFiles'] - ); - $fieldName = $CONFIG['videoFieldName']; - break; - case 'uploadfile': - default: - $config = array( - "pathFormat" => $CONFIG['filePathFormat'], - "maxSize" => $CONFIG['fileMaxSize'], - "allowFiles" => $CONFIG['fileAllowFiles'] - ); - $fieldName = $CONFIG['fileFieldName']; - break; -} -// 验证用户 -if (!$this->uid) { - return json_encode(array('state'=> lang('会话超时,请重新登录'))); -} - -/* 生成上传实例对象并完成上传 */ -$up = new Uploader($fieldName, $config, $base64); - -/** - * 得到上传文件所对应的各个参数,数组结构 - * array( - * "state" => "", //上传状态,上传成功时必须返回"SUCCESS" - * "url" => "", //返回的地址 - * "title" => "", //新文件名 - * "original" => "", //原始文件名 - * "type" => "" //文件类型 - * "size" => "", //文件大小 - * ) - */ - -/* 返回数据 */ -$result = $up->getFileInfo(); - -// 处理程序 -if (isset($result['state']) && $result['state'] == 'SUCCESS' && $result['size']) { - $this->load->model('attachment_model'); - $this->attachment_model->siteid = max(1, (int)$this->input->get('siteid')); - $filename = DR_UE_PATH.$result['url']; - list($id, $url, $b) = $this->attachment_model->upload($this->uid, array( - 'file_ext' => $result['type'], - 'full_path' => $filename, - 'file_size' => $result['size'] / 1024, - 'client_name' => str_replace($result['type'], '', $result['original']), - )); - $result['id'] = UEDITOR_IMG_ID.'_img_'.$id; - $result['url'] = $url; - // 图片水印 - if (SITE_IMAGE_WATERMARK && SITE_IMAGE_CONTENT && in_array(trim($result['type'], '.'), array('jpg', 'gif', 'png', 'jpeg'))) { - $result['url'] = dr_thumb($id, $imageinfo[0], $imageinfo[1], 1); - } - - $result['url'] = str_replace(SITE_URL, '/', $result['url']); - -} - -return json_encode($result); \ No newline at end of file diff --git a/finecms/api/ueditor/php/config.json b/finecms/api/ueditor/php/config.json deleted file mode 100644 index f8062cf..0000000 --- a/finecms/api/ueditor/php/config.json +++ /dev/null @@ -1,94 +0,0 @@ -/* 前后端通信相关的配置,注释只允许使用多行方式 */ -{ - /* 上传图片配置项 */ - "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ - "imageFieldName": "upfile", /* 提交的图片表单名称 */ - "imageMaxSize": 2048000, /* 上传大小限制,单位B */ - "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ - "imageCompressEnable": true, /* 是否压缩图片,默认是true */ - "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ - "imageInsertAlign": "none", /* 插入的图片浮动方式 */ - "imageUrlPrefix": "", /* 图片访问路径前缀 */ - "imagePathFormat": "/ueditor/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/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ - "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ - "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ - "scrawlInsertAlign": "none", - - /* 截图工具上传 */ - "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ - "snapscreenPathFormat": "/ueditor/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/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ - "catcherUrlPrefix": "", /* 图片访问路径前缀 */ - "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ - "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ - - /* 上传视频配置 */ - "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ - "videoFieldName": "upfile", /* 提交的视频表单名称 */ - "videoPathFormat": "/ueditor/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/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/image/", /* 指定要列出图片的目录 */ - "imageManagerListSize": 20, /* 每次列出文件数量 */ - "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ - "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ - "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ - - /* 列出指定目录下的文件 */ - "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ - "fileManagerListPath": "/ueditor/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/finecms/api/ueditor/php/controller.php b/finecms/api/ueditor/php/controller.php deleted file mode 100644 index 5ddab11..0000000 --- a/finecms/api/ueditor/php/controller.php +++ /dev/null @@ -1,70 +0,0 @@ -uid) { - echo json_encode(array('state'=> fc_lang('会话超时,请重新登录')));exit; -} - -// 上传目录 -define('DR_UE_PATH', SYS_UPLOAD_PATH); -if (!is_dir(SYS_UPLOAD_PATH)) { - dr_mkdirs(SYS_UPLOAD_PATH); -} - -$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true); -$action = $_GET['action']; - -switch ($action) { - case 'config': - $result = json_encode($CONFIG); - break; - - /* 上传图片 */ - case 'uploadimage': - /* 上传涂鸦 */ - case 'uploadscrawl': - /* 上传视频 */ - case 'uploadvideo': - /* 上传文件 */ - case 'uploadfile': - $result = include("action_upload.php"); - break; - - /* 列出图片 */ - case 'listimage': - $result = include("action_list.php"); - break; - /* 列出文件 */ - case 'listfile': - $result = include("action_list.php"); - break; - - /* 抓取远程文件 */ - case 'catchimage': - $result = include("action_crawler.php"); - break; - - default: - $result = json_encode(array( - 'state'=> '请求地址出错' - )); - break; -} - -/* 输出结果 */ -if (isset($_GET["callback"])) { - if (preg_match("/^[\w_]+$/", $_GET["callback"])) { - echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')'; - } else { - echo json_encode(array( - 'state'=> 'callback参数不合法' - )); - } -} else { - echo $result; -} \ No newline at end of file diff --git a/finecms/api/ueditor/php/index.php b/finecms/api/ueditor/php/index.php deleted file mode 100644 index 37884a4..0000000 --- a/finecms/api/ueditor/php/index.php +++ /dev/null @@ -1,7 +0,0 @@ - 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/finecms/api/ueditor/themes/default/css/ueditor.min.css b/finecms/api/ueditor/themes/default/css/ueditor.min.css deleted file mode 100644 index 71b5e1e..0000000 --- a/finecms/api/ueditor/themes/default/css/ueditor.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * UEditor - * version: ueditor - * build: Thu Feb 25 2016 11:44:16 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/finecms/api/ueditor/themes/default/dialogbase.css b/finecms/api/ueditor/themes/default/dialogbase.css deleted file mode 100644 index cd663d5..0000000 --- a/finecms/api/ueditor/themes/default/dialogbase.css +++ /dev/null @@ -1,100 +0,0 @@ -/*弹出对话框页面样式组件 -*/ - -/*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/finecms/api/ueditor/themes/default/images/anchor.gif b/finecms/api/ueditor/themes/default/images/anchor.gif deleted file mode 100644 index 5aa797b..0000000 Binary files a/finecms/api/ueditor/themes/default/images/anchor.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/arrow.png b/finecms/api/ueditor/themes/default/images/arrow.png deleted file mode 100644 index d900886..0000000 Binary files a/finecms/api/ueditor/themes/default/images/arrow.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/arrow_down.png b/finecms/api/ueditor/themes/default/images/arrow_down.png deleted file mode 100644 index e9257e8..0000000 Binary files a/finecms/api/ueditor/themes/default/images/arrow_down.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/arrow_up.png b/finecms/api/ueditor/themes/default/images/arrow_up.png deleted file mode 100644 index 74277af..0000000 Binary files a/finecms/api/ueditor/themes/default/images/arrow_up.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/button-bg.gif b/finecms/api/ueditor/themes/default/images/button-bg.gif deleted file mode 100644 index ec7fa2e..0000000 Binary files a/finecms/api/ueditor/themes/default/images/button-bg.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/cancelbutton.gif b/finecms/api/ueditor/themes/default/images/cancelbutton.gif deleted file mode 100644 index df4bc2c..0000000 Binary files a/finecms/api/ueditor/themes/default/images/cancelbutton.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/charts.png b/finecms/api/ueditor/themes/default/images/charts.png deleted file mode 100644 index 713965c..0000000 Binary files a/finecms/api/ueditor/themes/default/images/charts.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/cursor_h.gif b/finecms/api/ueditor/themes/default/images/cursor_h.gif deleted file mode 100644 index d7c3e7e..0000000 Binary files a/finecms/api/ueditor/themes/default/images/cursor_h.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/cursor_h.png b/finecms/api/ueditor/themes/default/images/cursor_h.png deleted file mode 100644 index 2088fc2..0000000 Binary files a/finecms/api/ueditor/themes/default/images/cursor_h.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/cursor_v.gif b/finecms/api/ueditor/themes/default/images/cursor_v.gif deleted file mode 100644 index bb508db..0000000 Binary files a/finecms/api/ueditor/themes/default/images/cursor_v.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/cursor_v.png b/finecms/api/ueditor/themes/default/images/cursor_v.png deleted file mode 100644 index 6f39ca3..0000000 Binary files a/finecms/api/ueditor/themes/default/images/cursor_v.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/dialog-title-bg.png b/finecms/api/ueditor/themes/default/images/dialog-title-bg.png deleted file mode 100644 index f744f26..0000000 Binary files a/finecms/api/ueditor/themes/default/images/dialog-title-bg.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/filescan.png b/finecms/api/ueditor/themes/default/images/filescan.png deleted file mode 100644 index 1d27158..0000000 Binary files a/finecms/api/ueditor/themes/default/images/filescan.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/highlighted.gif b/finecms/api/ueditor/themes/default/images/highlighted.gif deleted file mode 100644 index 9272b49..0000000 Binary files a/finecms/api/ueditor/themes/default/images/highlighted.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/icons-all.gif b/finecms/api/ueditor/themes/default/images/icons-all.gif deleted file mode 100644 index 21915e5..0000000 Binary files a/finecms/api/ueditor/themes/default/images/icons-all.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/icons.gif b/finecms/api/ueditor/themes/default/images/icons.gif deleted file mode 100644 index 7abd30a..0000000 Binary files a/finecms/api/ueditor/themes/default/images/icons.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/icons.png b/finecms/api/ueditor/themes/default/images/icons.png deleted file mode 100644 index c015e3a..0000000 Binary files a/finecms/api/ueditor/themes/default/images/icons.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/loaderror.png b/finecms/api/ueditor/themes/default/images/loaderror.png deleted file mode 100644 index 35ff333..0000000 Binary files a/finecms/api/ueditor/themes/default/images/loaderror.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/loading.gif b/finecms/api/ueditor/themes/default/images/loading.gif deleted file mode 100644 index b713e27..0000000 Binary files a/finecms/api/ueditor/themes/default/images/loading.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/lock.gif b/finecms/api/ueditor/themes/default/images/lock.gif deleted file mode 100644 index b4e6d78..0000000 Binary files a/finecms/api/ueditor/themes/default/images/lock.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/neweditor-tab-bg.png b/finecms/api/ueditor/themes/default/images/neweditor-tab-bg.png deleted file mode 100644 index 8f398b0..0000000 Binary files a/finecms/api/ueditor/themes/default/images/neweditor-tab-bg.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/pagebreak.gif b/finecms/api/ueditor/themes/default/images/pagebreak.gif deleted file mode 100644 index 8d1cffd..0000000 Binary files a/finecms/api/ueditor/themes/default/images/pagebreak.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/scale.png b/finecms/api/ueditor/themes/default/images/scale.png deleted file mode 100644 index f45adb5..0000000 Binary files a/finecms/api/ueditor/themes/default/images/scale.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/sortable.png b/finecms/api/ueditor/themes/default/images/sortable.png deleted file mode 100644 index 1bca649..0000000 Binary files a/finecms/api/ueditor/themes/default/images/sortable.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/spacer.gif b/finecms/api/ueditor/themes/default/images/spacer.gif deleted file mode 100644 index 5bfd67a..0000000 Binary files a/finecms/api/ueditor/themes/default/images/spacer.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/sparator_v.png b/finecms/api/ueditor/themes/default/images/sparator_v.png deleted file mode 100644 index 8cf5662..0000000 Binary files a/finecms/api/ueditor/themes/default/images/sparator_v.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/table-cell-align.png b/finecms/api/ueditor/themes/default/images/table-cell-align.png deleted file mode 100644 index ddf4285..0000000 Binary files a/finecms/api/ueditor/themes/default/images/table-cell-align.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/tangram-colorpicker.png b/finecms/api/ueditor/themes/default/images/tangram-colorpicker.png deleted file mode 100644 index 738e500..0000000 Binary files a/finecms/api/ueditor/themes/default/images/tangram-colorpicker.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/toolbar_bg.png b/finecms/api/ueditor/themes/default/images/toolbar_bg.png deleted file mode 100644 index 7ab685f..0000000 Binary files a/finecms/api/ueditor/themes/default/images/toolbar_bg.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/unhighlighted.gif b/finecms/api/ueditor/themes/default/images/unhighlighted.gif deleted file mode 100644 index 7ad0b67..0000000 Binary files a/finecms/api/ueditor/themes/default/images/unhighlighted.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/upload.png b/finecms/api/ueditor/themes/default/images/upload.png deleted file mode 100644 index 08d4d92..0000000 Binary files a/finecms/api/ueditor/themes/default/images/upload.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/videologo.gif b/finecms/api/ueditor/themes/default/images/videologo.gif deleted file mode 100644 index 555af74..0000000 Binary files a/finecms/api/ueditor/themes/default/images/videologo.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/word.gif b/finecms/api/ueditor/themes/default/images/word.gif deleted file mode 100644 index 9ef5d09..0000000 Binary files a/finecms/api/ueditor/themes/default/images/word.gif and /dev/null differ diff --git a/finecms/api/ueditor/themes/default/images/wordpaste.png b/finecms/api/ueditor/themes/default/images/wordpaste.png deleted file mode 100644 index 9367758..0000000 Binary files a/finecms/api/ueditor/themes/default/images/wordpaste.png and /dev/null differ diff --git a/finecms/api/ueditor/themes/iframe.css b/finecms/api/ueditor/themes/iframe.css deleted file mode 100644 index 774013a..0000000 --- a/finecms/api/ueditor/themes/iframe.css +++ /dev/null @@ -1 +0,0 @@ -/*可以在这里添加你自己的css*/ diff --git a/finecms/api/ueditor/third-party/SyntaxHighlighter/shCore.js b/finecms/api/ueditor/third-party/SyntaxHighlighter/shCore.js deleted file mode 100644 index 3249184..0000000 --- a/finecms/api/ueditor/third-party/SyntaxHighlighter/shCore.js +++ /dev/null @@ -1,3655 +0,0 @@ -// 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': DR_DIV2P, // finecms - '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; - } - - 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) { - str = '' + ci.alt + ''; - if (ci['floatStyle'] == 'center') { - str = '

    ' + str + '

    '; - } - html.push(str); - - } else { - for (var i = 0; ci = opt[i++];) { - 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:20px 0;background: whitesmoke; border: 1px solid #CCCCCC;padding: 7px 0;text-align: center;color:blue;}',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 input; - var stitle; - var throughBox = art.dialog.through; - throughBox({ - zIndex: 9999, - fixed: true, - lock: true, - title: fc_lang[30], - opacity: .1, - content: [ - '
    ', - '', - '
    ' - ].join(''), - init: function () { - input = this.DOM.content.find('input')[0]; - input.select(); - input.focus(); - }, - ok: function (here) { - var stitle = input.value; - if (!stitle) stitle = ' '; - // 处理分页 - var range = me.selection.getRange(),hr = me.document.createElement('p'); - domUtils.setAttributes(hr,{ - 'class' : 'pagebreak' - }); - hr.innerHTML=stitle; - //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'); - 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); - } - }, - cancel: 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, - id: attrs.id, - 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, vid){ - 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 vid = node.getAttr('vid'); - 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', vid); - 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', vid); - 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, - "id": cj.id, - "_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 || '', - id: rs.id || '', - 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.setAttribute('id', json.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); - } - } - } - } -}); - - - - -// 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/finecms/api/ueditor/ueditor.all.min.js b/finecms/api/ueditor/ueditor.all.min.js deleted file mode 100644 index 788ef8e..0000000 --- a/finecms/api/ueditor/ueditor.all.min.js +++ /dev/null @@ -1,103 +0,0 @@ -/*! - * UEditor - * version: ueditor - * build: Thu Feb 25 2016 11:44:16 GMT+0800 (CST) - */ -(function(){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={};var browser=UE.browser=function(){var agent=navigator.userAgent.toLowerCase(),opera=window.opera,browser={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(agent),opera:(!!opera&&opera.version),webkit:(agent.indexOf(" applewebkit/")>-1),mac:(agent.indexOf("macintosh")>-1),quirks:(document.compatMode=="BackCompat")};browser.gecko=(navigator.product=="Gecko"&&!browser.webkit&&!browser.opera&&!browser.ie);var version=0;if(browser.ie){var v1=agent.match(/(?:msie\s([\w.]+))/);var v2=agent.match(/(?:trident.*rv:([\w.]+))/);if(v1&&v2&&v1[1]&&v2[1]){version=Math.max(v1[1]*1,v2[1]*1)}else{if(v1&&v1[1]){version=v1[1]*1}else{if(v2&&v2[1]){version=v2[1]*1}else{version=0}}}browser.ie11Compat=document.documentMode==11;browser.ie9Compat=document.documentMode==9;browser.ie8=!!document.documentMode;browser.ie8Compat=document.documentMode==8;browser.ie7Compat=((version==7&&!document.documentMode)||document.documentMode==7);browser.ie6Compat=(version<7||browser.quirks);browser.ie9above=version>8;browser.ie9below=version<9;browser.ie11above=version>10;browser.ie11below=version<11}if(browser.gecko){var geckoRelease=agent.match(/rv:([\d\.]+)/);if(geckoRelease){geckoRelease=geckoRelease[1].split(".");version=geckoRelease[0]*10000+(geckoRelease[1]||0)*100+(geckoRelease[2]||0)*1}}if(/chrome\/(\d+\.\d)/i.test(agent)){browser.chrome=+RegExp["\x241"]}if(/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent)&&!/chrome/i.test(agent)){browser.safari=+(RegExp["\x241"]||RegExp["\x242"])}if(browser.opera){version=parseFloat(opera.version())}if(browser.webkit){version=parseFloat(agent.match(/ applewebkit\/(\d+)/)[1])}browser.version=version;browser.isCompatible=!browser.mobile&&((browser.ie&&version>=6)||(browser.gecko&&version>=10801)||(browser.opera&&version>=9.5)||(browser.air&&version>=1)||(browser.webkit&&version>=522)||false);return browser}();var ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera;var utils=UE.utils={each:function(obj,iterator,context){if(obj==null){return}if(obj.length===+obj.length){for(var i=0,l=obj.length;i=start&&v===item){index=i;return false}});return index},removeItem:function(array,item){for(var i=0,l=array.length;i'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){if(b){return a}else{return{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}}):""},html:function(str){return str?str.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(m){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[m]}):""},cssStyleToDomStyle:function(){var test=document.createElement("div").style,cache={"float":test.cssFloat!=undefined?"cssFloat":test.styleFloat!=undefined?"styleFloat":"float"};return function(cssName){return cache[cssName]||(cache[cssName]=cssName.toLowerCase().replace(/-./g,function(match){return match.charAt(1).toUpperCase()}))}}(),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 settings of file ueditor.config.js ")};doc.getElementsByTagName("head")[0].appendChild(element)}}(),isEmptyObject:function(obj){if(obj==null){return true}if(this.isArray(obj)||this.isString(obj)){return obj.length===0}for(var key in obj){if(obj.hasOwnProperty(key)){return false}}return true},fixColor:function(name,value){if(/color/i.test(name)&&/rgba?/.test(value)){var array=value.split(",");if(array.length>3){return""}value="#";for(var i=0,color;color=array[i++];){color=parseInt(color.replace(/[^\d]/gi,""),10).toString(16);value+=color.length==1?"0"+color:color}value=value.toUpperCase()}return value},optCss:function(val){var padding,margin,border;val=val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(str,key,name,val){if(val.split(" ").length==1){switch(key){case"padding":!padding&&(padding={});padding[name]=val;return"";case"margin":!margin&&(margin={});margin[name]=val;return"";case"border":return val=="initial"?"":str}}return str});function opt(obj,name){if(!obj){return""}var t=obj.top,b=obj.bottom,l=obj.left,r=obj.right,val="";if(!t||!l||!b||!r){for(var p in obj){val+=";"+name+"-"+p+":"+obj[p]+";"}}else{val+=";"+name+":"+(t==b&&b==l&&l==r?t:t==b&&l==r?(t+" "+l):l==r?(t+" "+l+" "+b):(t+" "+r+" "+b+" "+l))+";"}return val}val+=opt(padding,"padding")+opt(margin,"margin");return val.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(source,target){var tmp;target=target||{};for(var i in source){if(source.hasOwnProperty(i)){tmp=source[i];if(typeof tmp=="object"){target[i]=utils.isArray(tmp)?[]:{};utils.clone(source[i],target[i])}else{target[i]=tmp}}}return target},transUnitToPx:function(val){if(!/(pt|cm)/.test(val)){return val}var unit;val.replace(/([\d.]+)(\w+)/,function(str,v,u){val=v;unit=u});switch(unit){case"cm":val=parseFloat(val)*25;break;case"pt":val=Math.round(parseFloat(val)*96/72)}return val+(val?"px":"")},domReady:function(){var fnArr=[];function doReady(doc){doc.isReady=true;for(var ci;ci=fnArr.pop();ci()){}}return function(onready,win){win=win||window;var doc=win.document;onready&&fnArr.push(onready);if(doc.readyState==="complete"){doReady(doc)}else{doc.isReady&&doReady(doc);if(browser.ie&&browser.version!=11){(function(){if(doc.isReady){return}try{doc.documentElement.doScroll("left")}catch(error){setTimeout(arguments.callee,0);return}doReady(doc)})();win.attachEvent("onload",function(){doReady(doc)})}else{doc.addEventListener("DOMContentLoaded",function(){doc.removeEventListener("DOMContentLoaded",arguments.callee,false);doReady(doc)},false);win.addEventListener("load",function(){doReady(doc)},false)}}}}(),cssRule:browser.ie&&browser.version!=11?function(key,style,doc){var indexList,index;if(style===undefined||style&&style.nodeType&&style.nodeType==9){doc=style&&style.nodeType&&style.nodeType==9?style:(doc||document);indexList=doc.indexList||(doc.indexList={});index=indexList[key];if(index!==undefined){return doc.styleSheets[index].cssText}return undefined}doc=doc||document;indexList=doc.indexList||(doc.indexList={});index=indexList[key];if(style===""){if(index!==undefined){doc.styleSheets[index].cssText="";delete indexList[key];return true}return false}if(index!==undefined){sheetStyle=doc.styleSheets[index]}else{sheetStyle=doc.createStyleSheet("",index=doc.styleSheets.length);indexList[key]=index}sheetStyle.cssText=style}:function(key,style,doc){var head,node;if(style===undefined||style&&style.nodeType&&style.nodeType==9){doc=style&&style.nodeType&&style.nodeType==9?style:(doc||document);node=doc.getElementById(key);return node?node.innerHTML:undefined}doc=doc||document;node=doc.getElementById(key);if(style===""){if(node){node.parentNode.removeChild(node);return true}return false}if(node){node.innerHTML=style}else{node=doc.createElement("style");node.id=key;node.innerHTML=style;doc.getElementsByTagName("head")[0].appendChild(node)}},sort:function(array,compareFn){compareFn=compareFn||function(item1,item2){return item1.localeCompare(item2)};for(var i=0,len=array.length;i0){var t=array[i];array[i]=array[j];array[j]=t}}}return array},serializeParam:function(json){var strArr=[];for(var i in json){if(i=="method"||i=="timeout"||i=="async"){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;j1||parent!==node.parentNode){node.style.cssText=parent.style.cssText+";"+node.style.cssText;parent=parent.parentNode;continue}else{parent.style.cssText+=";"+node.style.cssText;if(parent.tagName=="A"){parent.style.textDecoration="underline"}}}if(parent.tagName!="A"){parent===node.parentNode&&domUtils.remove(node,true);break}}parent=parent.parentNode}},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)},unSelectable:ie&&browser.ie9below||browser.opera?function(node){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"},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)}},createElement:function(doc,tag,attrs){return domUtils.setAttributes(doc.createElement(tag),attrs)},setAttributes:function(node,attrs){for(var attr in attrs){if(attrs.hasOwnProperty(attr)){var value=attrs[attr];switch(attr){case"class":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},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}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))},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"])}},addClass:function(elm,classNames){if(!elm){return}classNames=utils.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)},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},preventDefault:function(evt){evt.preventDefault?evt.preventDefault():(evt.returnValue=false)},removeStyle:function(element,name){if(browser.ie){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"])}},getStyle:function(element,name){var value=element.style[utils.cssStyleToDomStyle(name)];return utils.fixColor(name,value)},setStyle:function(element,name,value){element.style[utils.cssStyleToDomStyle(name)]=value;if(!utils.trim(element.style.cssText)){this.removeAttributes(element,"style")}},setStyles:function(element,styles){for(var name in styles){if(styles.hasOwnProperty(name)){domUtils.setStyle(element,name,styles[name])}}},removeDirtyAttr:function(node){for(var i=0,ci,nodes=node.getElementsByTagName("*");ci=nodes[i++];){ci.removeAttribute("_moz_dirty")}node.removeAttribute("_moz_dirty")},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},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"])}},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;if(offset>currentScroll||offset0){return 0}for(var n in dtd.$isNotEmpty){if(node.getElementsByTagName(n).length){return 0}}return 1},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"}},fillNode:function(doc,node){var tmpNode=browser.ie?doc.createTextNode(domUtils.fillChar):doc.createElement("br");node.innerHTML="";node.appendChild(tmpNode)},moveChild:function(src,tag,dir){while(src.firstChild){if(dir&&tag.firstChild){tag.insertBefore(src.lastChild,tag.firstChild)}else{tag.appendChild(src.firstChild)}}},hasNoAttributes:function(node){return browser.ie?/^<\w+\s*?>/.test(node.outerHTML):node.attributes.length==0},isCustomeNode:function(node){return node.nodeType==1&&node.getAttribute("_ue_custom_node_")},isTagNode:function(node,tagNames){return node.nodeType==1&&new RegExp("\\b"+node.tagName+"\\b","i").test(tagNames)},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},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");(function(){var guid=0,fillChar=domUtils.fillChar,fillData;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){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){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)));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)));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)));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}var Range=dom.Range=function(document){var me=this;me.startContainer=me.startOffset=me.endContainer=me.endOffset=null;me.document=document;me.collapsed=true};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)&&(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){}}function mergeSibling(node,dir){var tmpNode;node=node[dir];while(node&&domUtils.isFillChar(node)){tmpNode=node[dir];domUtils.remove(node);node=tmpNode}}Range.prototype={cloneContents:function(){return this.collapsed?null:execContentsAction(this,0)},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},extractContents:function(){return this.collapsed?null:execContentsAction(this,2)},setStart:function(node,offset){return setEndPoint(true,node,offset,this)},setEnd:function(node,offset){return setEndPoint(false,node,offset,this)},setStartAfter:function(node){return this.setStart(node.parentNode,domUtils.getNodeIndex(node)+1)},setStartBefore:function(node){return this.setStart(node.parentNode,domUtils.getNodeIndex(node))},setEndAfter:function(node){return this.setEnd(node.parentNode,domUtils.getNodeIndex(node)+1)},setEndBefore:function(node){return this.setEnd(node.parentNode,domUtils.getNodeIndex(node))},setStartAtFirst:function(node){return this.setStart(node,0)},setStartAtLast:function(node){return this.setStart(node,node.nodeType==3?node.nodeValue.length:node.childNodes.length)},setEndAtFirst:function(node){return this.setEnd(node,0)},setEndAtLast:function(node){return this.setEnd(node,node.nodeType==3?node.nodeValue.length:node.childNodes.length)},selectNode:function(node){return this.setStartBefore(node).setEndAfter(node)},selectNodeContents:function(node){return this.setStart(node,0).setEndAtLast(node)},cloneRange:function(){var me=this;return new Range(me.document).setStart(me.startContainer,me.startOffset).setEnd(me.endContainer,me.endOffset)},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},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&&(child=me.startContainer.childNodes[me.startOffset])&&check(child)){me.setStart(child,0)}if(collapsed){return me.collapse(true)}if(!ignoreEnd){while(me.endContainer.nodeType==1&&me.endOffset>0&&(child=me.endContainer.childNodes[me.endOffset-1])&&check(child)){me.setEnd(child,child.childNodes.length)}}return me},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)},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=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},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)},setCursor:function(toEnd,noFillData){return this.collapse(!toEnd).select(noFillData)},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}},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},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},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},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);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)},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&¤t!==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)},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},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){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);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);try{nativeRange.select()}catch(e){}return this}:function(notInsertFillData){function checkOffset(rng){function check(node,offset,dir){if(node.nodeType==3&&node.nodeValue.length0){endIndex=index-1}else{if(position<0){startIndex=index+1}else{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}}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}function _getIERange(sel){var ieRange; - 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)},getNative:function(){var doc=this.document;try{return !doc?null:browser.ie9below?doc.selection:domUtils.getWindow(doc).getSelection()}catch(e){return null}},getIERange:function(){var ieRange=_getIERange(this);if(!ieRange){if(this._bakIERange){return this._bakIERange}}return ieRange},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 start=this.getStart();if(start){return domUtils.findParents(start,true,null,true)}return[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var nativeRange=_getIERange(this);return !!(nativeRange&&this.rangeInBody(nativeRange))}else{return !!this.getNative().rangeCount}}catch(e){return false}},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){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{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document)){return this._bakRange}optimze(range)}}return this._bakRange=range},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){return this.document.body.firstChild}if(range.item){return range.item(0)}tmpRange=range.duplicate();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},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""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}})();(function(){var uid=0,_selectionChangeTimer;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"}));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")}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:function(fn){var me=this;if(fn){me.isReady?fn.apply(me):me.addListener("ready",fn)}},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]},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;for(var p in me){if(me.hasOwnProperty(p)){delete this[p]}}UE.delEditor(key)},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?"":"")+""+" -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.billdetail_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.billdetail_add.html.cache.php deleted file mode 100644 index 7020711..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.billdetail_add.html.cache.php +++ /dev/null @@ -1,171 +0,0 @@ - -
    - -
    - - -
    - -
    - - - - - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.billdetail_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.billdetail_index.html.cache.php deleted file mode 100644 index 7f90bb7..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.billdetail_index.html.cache.php +++ /dev/null @@ -1,81 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    - -
    -
    - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customer_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customer_add.html.cache.php deleted file mode 100644 index 3b911bd..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customer_add.html.cache.php +++ /dev/null @@ -1,77 +0,0 @@ - -
    - -
    - - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - - -
    -
    - -
    - -
    - -
    -
    - -
    -
    \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customer_debt.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customer_debt.html.cache.php deleted file mode 100644 index 11d041d..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customer_debt.html.cache.php +++ /dev/null @@ -1,59 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customer_edit.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customer_edit.html.cache.php deleted file mode 100644 index a164ea9..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customer_edit.html.cache.php +++ /dev/null @@ -1,123 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> - - -
    - - - - - - - - - - - -

    - -

    - -
    -
    - -
    -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - -
    -
    - - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customer_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customer_index.html.cache.php deleted file mode 100644 index 2133c7a..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customer_index.html.cache.php +++ /dev/null @@ -1,96 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - - -
    - - -
    -
    -
    - - - - - - - -
    -
    - -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - -
    - -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customer_meet.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customer_meet.html.cache.php deleted file mode 100644 index da8c81a..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customer_meet.html.cache.php +++ /dev/null @@ -1,59 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customerbill_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customerbill_index.html.cache.php deleted file mode 100644 index cce1bb0..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customerbill_index.html.cache.php +++ /dev/null @@ -1,77 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    - -
    -
    - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customerprice_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customerprice_add.html.cache.php deleted file mode 100644 index 6256f47..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customerprice_add.html.cache.php +++ /dev/null @@ -1,44 +0,0 @@ - -
    - -
    - - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.customerprice_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.customerprice_index.html.cache.php deleted file mode 100644 index aaf4078..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.customerprice_index.html.cache.php +++ /dev/null @@ -1,57 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - - -
    - - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.footer.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.footer.html.cache.php deleted file mode 100644 index 6c663b9..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.footer.html.cache.php +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.index.html.cache.php deleted file mode 100644 index 08b1c0a..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.index.html.cache.php +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - - - - <?php echo fc_lang('%s后台中心', SITE_NAME); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - -
    - -
    - - - - -
    -
    - - - -
    - - - \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.login.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.login.html.cache.php deleted file mode 100644 index c921450..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.login.html.cache.php +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - <?php echo fc_lang('%s管理中心', SITE_NAME); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    - - - - - - - diff --git a/finecms/cache/templates/finecms.dayrui.templates.main.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.main.html.cache.php deleted file mode 100644 index 1f1a58e..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.main.html.cache.php +++ /dev/null @@ -1,115 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> - - - -
    - -
    -
    -
    - - - -

    - -

    - - -
    -
    -
    - - - -
    -
    -
    - - - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - - - - - -
      上次访问时间为 - , - 已经超过设置的  天访问期限
    -
    -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - - - - - -
      上次访问时间为 - ,欠款为元 - 已经超过设置的  天欠款期限
    -
    -
    -
    -
    - -
    - - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.member_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.member_add.html.cache.php deleted file mode 100644 index 44ca3f3..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.member_add.html.cache.php +++ /dev/null @@ -1,70 +0,0 @@ - -
    - -
    - -
    - -
    -
    - - -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - - -
    -
    - -
    -
    \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.member_edit.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.member_edit.html.cache.php deleted file mode 100644 index b032e73..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.member_edit.html.cache.php +++ /dev/null @@ -1,169 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> - - -
    - -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -
    -
    - -
    -
    -
    - - -
    -
    - -
    - -
    -
    -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - - -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    - - -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    - - list_tag("action=cache name=OAUTH"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { $id=$t['id']; if (isset($data['oauth'][$id])) { ?> -
    - -
    -
    -
    -
    - - - -
    -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.member_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.member_index.html.cache.php deleted file mode 100644 index 0aedeae..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.member_index.html.cache.php +++ /dev/null @@ -1,99 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - - - -
    -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Uid
    - ci->is_auth('member/admin/home/edit')) { ?>href="javascript:;"href="$t['uid'])); ?>"> -
    - ci->is_auth('member/admin/home/del')) { ?> - - - -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.msg.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.msg.html.cache.php deleted file mode 100644 index d7bd0d6..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.msg.html.cache.php +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - <?php echo fc_lang('提示信息'); ?> - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    - -
    - -
    - -
    -

    -

    - - - - - [] - -

    - -
    -
    -
    - - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.nfooter.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.nfooter.html.cache.php deleted file mode 100644 index 51acb48..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.nfooter.html.cache.php +++ /dev/null @@ -1,5 +0,0 @@ -
    - - - - \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.nheader.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.nheader.html.cache.php deleted file mode 100644 index 02d71a1..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.nheader.html.cache.php +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - admin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    diff --git a/finecms/cache/templates/finecms.dayrui.templates.sale_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.sale_index.html.cache.php deleted file mode 100644 index dd03f5f..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.sale_index.html.cache.php +++ /dev/null @@ -1,64 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    - -
    -
    - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Uid
    - ci->is_auth('member/admin/home/edit')) { ?> -
    - ci->is_auth('member/admin/home/del')) { ?> - - - -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.saler_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.saler_add.html.cache.php deleted file mode 100644 index 0afb673..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.saler_add.html.cache.php +++ /dev/null @@ -1,63 +0,0 @@ - -
    - -
    - - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - -
    -
    - -
    -
    \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.saler_edit.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.saler_edit.html.cache.php deleted file mode 100644 index 2926736..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.saler_edit.html.cache.php +++ /dev/null @@ -1,101 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> - - -
    - -
    - - - -
    -

    - -

    - -
    -
    - -
    -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - -
    - -
    - - -
    -
    - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.saler_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.saler_index.html.cache.php deleted file mode 100644 index 7c49026..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.saler_index.html.cache.php +++ /dev/null @@ -1,76 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    - -
    -
    - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.salerbill_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.salerbill_add.html.cache.php deleted file mode 100644 index d6b32f6..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.salerbill_add.html.cache.php +++ /dev/null @@ -1,124 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> - - -
    - -
    - - - -
    -

    - -

    - -
    -
    - -
    -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    - - -
    -
    - - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.salerbill_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.salerbill_index.html.cache.php deleted file mode 100644 index c24972a..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.salerbill_index.html.cache.php +++ /dev/null @@ -1,85 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    - -
    -
    - -
    -
    - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - ci->is_auth('member/admin/home/edit')) { ?> ci->is_auth('member/admin/home/edit')) { ?> -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.salerfuel_add.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.salerfuel_add.html.cache.php deleted file mode 100644 index bd198ef..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.salerfuel_add.html.cache.php +++ /dev/null @@ -1,117 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> - - -
    - -
    - - - -
    -

    - -

    - -
    -
    - -
    -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    - - -
    -
    - - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.salerfuel_index.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.salerfuel_index.html.cache.php deleted file mode 100644 index baee845..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.salerfuel_index.html.cache.php +++ /dev/null @@ -1,77 +0,0 @@ -_include("nheader.html")) include($fn_include); $_pages=$pages; ?> -
    - - -
    - -
    -
    - -
    -
    - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - ci->is_auth('member/admin/home/edit')) { ?> -
    -
    -
    -
    -
    -
    - -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.system_debug.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.system_debug.html.cache.php deleted file mode 100644 index 95f31e2..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.system_debug.html.cache.php +++ /dev/null @@ -1,65 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - - - -
    -
    - -
    -
    -
    -
    - - - - - - - - - $t) { ?> - - - - - - -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/finecms.dayrui.templates.system_oplog.html.cache.php b/finecms/cache/templates/finecms.dayrui.templates.system_oplog.html.cache.php deleted file mode 100644 index 86178f2..0000000 --- a/finecms/cache/templates/finecms.dayrui.templates.system_oplog.html.cache.php +++ /dev/null @@ -1,74 +0,0 @@ -_include("nheader.html")) include($fn_include); ?> -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - - - -
    -
    - -
    -
    -
    -
    - - - - - - - - - - - $t) { $t=dr_string2array($t); ?> - - - - - - - - - - - -
    Ip
    dip->address($t['ip']); ?>
    -
    -
    -
    -
    -
    -
    -_include("nfooter.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/templates.pc.default.common.footer.html.cache.php b/finecms/cache/templates/templates.pc.default.common.footer.html.cache.php deleted file mode 100644 index 391bf68..0000000 --- a/finecms/cache/templates/templates.pc.default.common.footer.html.cache.php +++ /dev/null @@ -1,33 +0,0 @@ - -
    -

    FineCMS公益软件 v

    -
    - -
      -
    • - 网站首页 -
    • - list_tag("action=category pid=0"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    • - -
    - -
    -
    -
    -
    - - - - -
    -
    -
    -
    - -
    - - - \ No newline at end of file diff --git a/finecms/cache/templates/templates.pc.default.common.footer.html.mobile..cache.php b/finecms/cache/templates/templates.pc.default.common.footer.html.mobile..cache.php deleted file mode 100644 index 391bf68..0000000 --- a/finecms/cache/templates/templates.pc.default.common.footer.html.mobile..cache.php +++ /dev/null @@ -1,33 +0,0 @@ - -
    -

    FineCMS公益软件 v

    -
    - -
      -
    • - 网站首页 -
    • - list_tag("action=category pid=0"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    • - -
    - -
    -
    -
    -
    - - - - -
    -
    -
    -
    - -
    - - - \ No newline at end of file diff --git a/finecms/cache/templates/templates.pc.default.common.header.html.cache.php b/finecms/cache/templates/templates.pc.default.common.header.html.cache.php deleted file mode 100644 index a2b3818..0000000 --- a/finecms/cache/templates/templates.pc.default.common.header.html.cache.php +++ /dev/null @@ -1,63 +0,0 @@ - - - - - <?php echo $meta_title; ?> - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/cache/templates/templates.pc.default.common.header.html.mobile..cache.php b/finecms/cache/templates/templates.pc.default.common.header.html.mobile..cache.php deleted file mode 100644 index a2b3818..0000000 --- a/finecms/cache/templates/templates.pc.default.common.header.html.mobile..cache.php +++ /dev/null @@ -1,63 +0,0 @@ - - - - - <?php echo $meta_title; ?> - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/cache/templates/templates.pc.default.common.index.html.cache.php b/finecms/cache/templates/templates.pc.default.common.index.html.cache.php deleted file mode 100644 index fc7e512..0000000 --- a/finecms/cache/templates/templates.pc.default.common.index.html.cache.php +++ /dev/null @@ -1,196 +0,0 @@ -_include("header.html")) include($fn_include); ?> - - - -
    - - -
    - -
    - -
    - -
    - - - -
    -
    - -
    - - - - - - list_tag("action=category pid=0 tid=1 num=4 return=c"); if ($rt_c) extract($rt_c); $count_c=count($return_c); if (is_array($return_c)) { foreach ($return_c as $key_c=>$c) { ?> -
    -
    -
    -
      - list_tag("action=module catid=$c[id] order=displayorder,updatetime num=16"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    - -
    -
    - - - -
    - -
    -
    - - -
    - - - -
    -

    -

    -
    - - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - 注册账号 -
    -
    -
    -
    -
    - - - -
    -
    - - - -
    -
    站内搜索
    -
    -
    - -
    - - - - - - - -
    -
    -
    -
    - -
    -
    热文排行
    -
      - list_tag("action=module module=news order=hits num=16"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    -
    - -
    -
    tag标签
    -
      - list_tag("action=tags order=rand num=30"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    -
    - -
    -
    友情链接
    -
      - -
    • - -
    -
    -
    -
    -
    -
    -
    -_include("footer.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/cache/templates/templates.pc.default.common.index.html.mobile..cache.php b/finecms/cache/templates/templates.pc.default.common.index.html.mobile..cache.php deleted file mode 100644 index fc7e512..0000000 --- a/finecms/cache/templates/templates.pc.default.common.index.html.mobile..cache.php +++ /dev/null @@ -1,196 +0,0 @@ -_include("header.html")) include($fn_include); ?> - - - -
    - - -
    - -
    - -
    - -
    - - - -
    -
    - -
    - - - - - - list_tag("action=category pid=0 tid=1 num=4 return=c"); if ($rt_c) extract($rt_c); $count_c=count($return_c); if (is_array($return_c)) { foreach ($return_c as $key_c=>$c) { ?> -
    -
    -
    -
      - list_tag("action=module catid=$c[id] order=displayorder,updatetime num=16"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    - -
    -
    - - - -
    - -
    -
    - - -
    - - - -
    -

    -

    -
    - - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - 注册账号 -
    -
    -
    -
    -
    - - - -
    -
    - - - -
    -
    站内搜索
    -
    -
    - -
    - - - - - - - -
    -
    -
    -
    - -
    -
    热文排行
    -
      - list_tag("action=module module=news order=hits num=16"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    -
    - -
    -
    tag标签
    -
      - list_tag("action=tags order=rand num=30"); if ($rt) extract($rt); $count=count($return); if (is_array($return)) { foreach ($return as $key=>$t) { ?> -
    • - -
    -
    - -
    -
    友情链接
    -
      - -
    • - -
    -
    -
    -
    -
    -
    -
    -_include("footer.html")) include($fn_include); ?> \ No newline at end of file diff --git a/finecms/config/admin_menu.php b/finecms/config/admin_menu.php deleted file mode 100644 index 7c261f2..0000000 --- a/finecms/config/admin_menu.php +++ /dev/null @@ -1,259 +0,0 @@ - '首页', - 'mark' => 'home', - 'icon' => 'fa fa-home', - 'menu' => array( - array( - 'name' => '控制台', - 'mark' => 'home-home', - 'icon' => 'fa fa-home', - 'menu' => array( - array( - 'name' => '后台首页', - 'uri' => 'home/main', - 'icon' => 'fa fa-home', - ), - /*array( - 'name' => '资料修改', - 'uri' => 'root/my', - 'icon' => 'fa fa-user', - ),*/ - array( - 'name' => '销售人员', - 'uri' => 'saler/index', - 'icon' => 'fa fa-user', - ), - array( - 'name' => '客户信息', - 'uri' => 'customer/index', - 'icon' => 'fa fa-calendar', - ), - array( - 'name' => '库存信息', - 'uri' => 'stock/index', - 'icon' => 'fa fa-calendar', - ), - array( - 'name' => '收入', - 'uri' => 'money/income_index', - 'icon' => 'fa fa-calendar', - ), - array( - 'name' => '支出', - 'uri' => 'money/pay_index', - 'icon' => 'fa fa-calendar', - ), - array( - 'name' => '超时访问客户', - 'uri' => 'customer/meet', - 'icon' => 'fa fa-bug', - ), - array( - 'name' => '超时欠款客户', - 'uri' => 'customer/debt', - 'icon' => 'fa fa-bug', - ), - /*array( - 'name' => '客户信息', - 'uri' => 'system/index', - 'icon' => 'fa fa-calendar', - ), - array( - 'name' => '升级版本', - 'uri' => 'upgrade/index', - 'icon' => 'fa fa-cloud', - ),*/ - ) - ), - - - ) - ), - - /*array( - 'name' => '设置', - 'mark' => 'cog', - 'icon' => 'fa fa-cog', - 'menu' => array( - array( - 'name' => '网站设置', - 'mark' => 'cog-sys', - 'icon' => 'fa fa-cog', - 'menu' => array( - array( - 'name' => '后台设置', - 'uri' => 'system/config', - 'icon' => 'fa fa-cog', - ), - array( - 'name' => '网站设置', - 'uri' => 'site/config', - 'icon' => 'fa fa-cog', - ), - array( - 'name' => '网站管理', - 'uri' => 'site/index', - 'icon' => 'fa fa-globe', - ), - array( - 'name' => '内容模型', - 'uri' => 'module/index', - 'icon' => 'fa fa-cogs', - ), - array( - 'name' => '网站表单', - 'uri' => 'form/index', - 'icon' => 'fa fa-tasks', - ), - array( - 'name' => '邮件设置', - 'uri' => 'mail/index', - 'icon' => 'fa fa-envelope', - ), - array( - 'name' => '会员设置', - 'uri' => 'member_setting/index', - 'icon' => 'fa fa-cog', - ), - array( - 'name' => '会员字段', - 'uri' => 'admin/field/index/rname/member/rid/0', - 'icon' => 'fa fa-code', - ), - array( - 'name' => '管理员管理', - 'uri' => 'root/index', - 'icon' => 'fa fa-user', - ), - ) - ), - - ) - ), - - array( - 'name' => '内容', - 'mark' => 'content', - 'icon' => 'fa fa-th-large', - 'menu' => array( - array( - 'name' => '内容管理', - 'mark' => 'content-content', - 'icon' => 'fa fa-th-large', - 'menu' => array( - array( - 'name' => '栏目管理', - 'uri' => 'category/index', - 'icon' => 'fa fa-list', - ), - array( - 'name' => '关键词库', - 'uri' => 'tag/index', - 'icon' => 'fa fa-tag', - ), - array( - 'name' => '附件管理', - 'uri' => 'attachment/index', - 'icon' => 'fa fa-folder', - ), - array( - 'name' => '自定义内容', - 'uri' => 'block/index', - 'icon' => 'fa fa-th-large', - ), - array( - 'name' => '会员管理', - 'uri' => 'member/index', - 'icon' => 'fa fa-user', - ), - ) - ), - - ) - ), - - array( - 'name' => '微信', - 'mark' => 'weixin', - 'icon' => 'fa fa-weixin', - 'menu' => array( - array( - 'name' => '微信管理', - 'mark' => 'weixin-weixin', - 'icon' => 'fa fa-weixin', - 'menu' => array( - - array( - 'name' => '账号接入', - 'uri' => 'weixin/index', - 'icon' => 'fa fa-cog', - ), - array( - 'name' => '自定义菜单', - 'uri' => 'wmenu/index', - 'icon' => 'fa fa-table', - ), - array( - 'name' => '微信粉丝', - 'uri' => 'wuser/index', - 'icon' => 'fa fa-user', - ), - ) - ), - - ) - ), - - - - - - - - - - array( - 'name' => '插件', - 'mark' => 'myapp', - 'icon' => 'fa fa-puzzle-piece', - 'menu' => array( - array( - 'name' => '插件管理', - 'mark' => 'app', - 'icon' => 'fa fa-puzzle-piece', - 'menu' => array( - array( - 'name' => 'URL规则', - 'uri' => 'urlrule/index', - 'icon' => 'fa fa-magnet', - ), - array( - 'name' => '联动菜单', - 'uri' => 'linkage/index', - 'icon' => 'fa fa-windows', - ), - array( - 'name' => '数据结构', - 'uri' => 'db/index', - 'icon' => 'fa fa-database', - ), - ) - ), - - ) - ),*/ - - - -); \ No newline at end of file diff --git a/finecms/config/database.php b/finecms/config/database.php deleted file mode 100644 index 8a580ab..0000000 --- a/finecms/config/database.php +++ /dev/null @@ -1,29 +0,0 @@ - '', - 'hostname' => '127.0.0.1', - 'username' => 'root', - 'password' => 'root', - 'port' => '3306', - 'database' => 'finecms', - 'dbdriver' => 'mysqli', - 'dbprefix' => 'fn_', - 'pconnect' => FALSE, - 'db_debug' => true, - 'cache_on' => FALSE, - 'cachedir' => 'cache/sql/', - 'char_set' => 'utf8', - 'dbcollat' => 'utf8_general_ci', - 'swap_pre' => '', - 'autoinit' => FALSE, - 'encrypt' => FALSE, - 'compress' => FALSE, - 'stricton' => FALSE, - 'failover' => array(), -); diff --git a/finecms/config/domain.php b/finecms/config/domain.php deleted file mode 100644 index 6d24d64..0000000 --- a/finecms/config/domain.php +++ /dev/null @@ -1,17 +0,0 @@ - 1, - -); \ No newline at end of file diff --git a/finecms/config/index.html b/finecms/config/index.html deleted file mode 100644 index c942a79..0000000 --- a/finecms/config/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - \ No newline at end of file diff --git a/finecms/config/member.php b/finecms/config/member.php deleted file mode 100644 index 27f7bde..0000000 --- a/finecms/config/member.php +++ /dev/null @@ -1 +0,0 @@ -{"ucsso":"0","ucssocfg":"","register":"1","regnamerule":"\/^[0-9-]+$\/","regnotallow":"demo"} \ No newline at end of file diff --git a/finecms/config/module_domain.php b/finecms/config/module_domain.php deleted file mode 100644 index f5676c2..0000000 --- a/finecms/config/module_domain.php +++ /dev/null @@ -1,16 +0,0 @@ - '下一页', // 你希望在分页中显示“下一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'next_tag_open' => '
  • ', // “下一页”链接的打开标签 - 'next_tag_close' => '
  • ', // “下一页”链接的关闭标签 - - // 自定义“上一页”链接 - 'prev_link' => '上一页', // 你希望在分页中显示“上一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'prev_tag_open' => '
  • ', // “上一页”链接的打开标签 - 'prev_tag_close' => '
  • ', // “上一页”链接的关闭标签 - - // 自定义“当前页”链接 - 'cur_tag_open' => '
  • ', // “当前页”链接的打开标签 - 'cur_tag_close' => '
  • ', // “当前页”链接的关闭标签 - - // 自定义“数字”链接 - 'num_tag_open' => '
  • ', // “数字”链接的打开标签 - 'num_tag_close' => '
  • ', // “数字”链接的关闭标签 - - // 自定义“最后一页”链接 - 'last_link' => '最后一页', // 你希望在分页的右边显示“最后一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'last_tag_open' => '
  • ', // “最后一页”链接的打开标签 - 'last_tag_close' => '
  • ', // “最后一页”链接的关闭标签 - - // 自定义“第一页”链接 - 'first_link' => '第一页', // 你希望在分页的左边显示“第一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'first_tag_open' => '
  • ', // “第一页”链接的打开标签 - 'first_tag_close' => '
  • ', // “第一页”链接的关闭标签 - - // 是否显示数字链接 - 'display_pages' => TRUE, - - // 给每一个链接添加 CSS 类 - 'anchor_class' => '', - - // 显示的分页数字个数 - 'num_links' => 4, - -); \ No newline at end of file diff --git a/finecms/config/pagination_mobile.php b/finecms/config/pagination_mobile.php deleted file mode 100644 index 14aae42..0000000 --- a/finecms/config/pagination_mobile.php +++ /dev/null @@ -1,50 +0,0 @@ - '下一页', // 你希望在分页中显示“下一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'next_tag_open' => '
  • ', // “下一页”链接的打开标签 - 'next_tag_close' => '
  • ', // “下一页”链接的关闭标签 - - // 自定义“上一页”链接 - 'prev_link' => '上一页', // 你希望在分页中显示“上一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'prev_tag_open' => '
  • ', // “上一页”链接的打开标签 - 'prev_tag_close' => '
  • ', // “上一页”链接的关闭标签 - - // 自定义“当前页”链接 - 'cur_tag_open' => '
  • ', // “当前页”链接的打开标签 - 'cur_tag_close' => '
  • ', // “当前页”链接的关闭标签 - - // 自定义“数字”链接 - 'num_tag_open' => '
  • ', // “数字”链接的打开标签 - 'num_tag_close' => '
  • ', // “数字”链接的关闭标签 - - // 自定义“最后一页”链接 - 'last_link' => '最后一页', // 你希望在分页的右边显示“最后一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'last_tag_open' => '
  • ', // “最后一页”链接的打开标签 - 'last_tag_close' => '
  • ', // “最后一页”链接的关闭标签 - - // 自定义“第一页”链接 - 'first_link' => '第一页', // 你希望在分页的左边显示“第一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'first_tag_open' => '
  • ', // “第一页”链接的打开标签 - 'first_tag_close' => '
  • ', // “第一页”链接的关闭标签 - - // 是否显示数字链接 - 'display_pages' => TRUE, - - // 给每一个链接添加 CSS 类 - 'anchor_class' => '', - - // 显示的分页数字个数 - 'num_links' => 4, - -); \ No newline at end of file diff --git a/finecms/config/rewrite.php b/finecms/config/rewrite.php deleted file mode 100644 index b0a7c7c..0000000 --- a/finecms/config/rewrite.php +++ /dev/null @@ -1,26 +0,0 @@ - "search/index/rewrite/$1", - // tag关键词库 - "tag\/(.+).html" => "tag/index/name/$1", - - // 栏目列表(分页) - "([a-z0-9]+)-list-(\d+).html" => "category/index/dir/$1/page/$2", - // 栏目列表 - "([a-z0-9]+)-list.html" => "category/index/dir/$1", - // 内容页(分页) - "([a-z0-9]+)-show-(\d+)-(\d+).html" => "show/index/id/$2/page/$3", - // 内容页 - "([a-z0-9]+)-show-(\d+).html" => "show/index/id/$2", - -); - diff --git a/finecms/config/site/1.php b/finecms/config/site/1.php deleted file mode 100644 index 5f17b7d..0000000 --- a/finecms/config/site/1.php +++ /dev/null @@ -1,47 +0,0 @@ - 0, //网站是否是关闭状态 - 'SITE_CLOSE_MSG' => '网站升级中....', //网站关闭时的显示信息 - 'SITE_NAME' => 'FineCMS', //网站的名称 - 'SITE_TIME_FORMAT' => 'Y-m-d H:i', //时间显示格式,与date函数一致,默认Y-m-d H:i:s - 'SITE_LANGUAGE' => 'zh-cn', //网站的语言 - 'SITE_THEME' => 'default', //网站的主题风格 - 'SITE_TEMPLATE' => 'default', //网站的模板目录 - 'SITE_TIMEZONE' => 8, //所在的时区常量 - 'SITE_DOMAINS' => '', //网站的其他域名 - 'SITE_REWRITE' => 6, // - 'SITE_MOBILE_OPEN' => 1, //是否自动识别移动端并强制定向到移动端域名 - 'SITE_MOBILE' => '', //移动端域名 - 'SITE_SEOJOIN' => '_', //网站SEO间隔符号 - 'SITE_TITLE' => 'FineCMS公益软件', //网站首页SEO标题 - 'SITE_KEYWORDS' => '免费cms,开源cms', //网站SEO关键字 - 'SITE_DESCRIPTION' => '公益软件产品介绍', //网站SEO描述信息 - 'SITE_IMAGE_RATIO' => 1, //是否宽度自动适应 - 'SITE_IMAGE_WATERMARK' => 0, // - 'SITE_IMAGE_VRTALIGN' => 'top', // - 'SITE_IMAGE_HORALIGN' => 'left', // - 'SITE_IMAGE_VRTOFFSET' => '', // - 'SITE_IMAGE_HOROFFSET' => '', // - 'SITE_IMAGE_TYPE' => 0, // - 'SITE_IMAGE_OVERLAY' => 'default.png', // - 'SITE_IMAGE_OPACITY' => '', // - 'SITE_IMAGE_FONT' => 'default.ttf', // - 'SITE_IMAGE_COLOR' => '', // - 'SITE_IMAGE_SIZE' => '', // - 'SITE_IMAGE_TEXT' => '', // - 'SITE_DOMAIN' => 'test.finecms.net', //网站的域名 - 'SITE_IMAGE_CONTENT' => 0, //是否内容编辑器显示水印图片 - -); \ No newline at end of file diff --git a/finecms/config/system.php b/finecms/config/system.php deleted file mode 100644 index d27f0c3..0000000 --- a/finecms/config/system.php +++ /dev/null @@ -1,31 +0,0 @@ - 1, - 'SYS_KEY' => 'finecms7b67b42ddee3249af92d1d445c66c95d', - 'SYS_DEBUG' => 0, - 'SYS_EMAIL' => 'cms@dayrui.ocm', - 'SYS_AUTO_CACHE' => 1, - 'SITE_ADMIN_CODE' => 0, - 'SITE_ADMIN_PAGESIZE' => '20', - 'SYS_CACHE_INDEX' => 3600, - 'SYS_CACHE_MSHOW' => 3600, - 'SYS_CACHE_MSEARCH' => 3600, - 'SYS_CACHE_LIST' => 3600, - 'SYS_CACHE_MEMBER' => 3600, - 'SYS_CACHE_ATTACH' => 3600, - 'SYS_CACHE_FORM' => 3600, - 'SYS_CACHE_TAG' => 3600, - 'SYS_CAT_MODULE' => 0, - 'SYS_HTTPS' => 0, -); \ No newline at end of file diff --git a/finecms/config/version.php b/finecms/config/version.php deleted file mode 100644 index c1f0b74..0000000 --- a/finecms/config/version.php +++ /dev/null @@ -1,7 +0,0 @@ - '2018.06.23', - 'DR_VERSION' => '5.4.1', -); diff --git a/finecms/finecms/Init.php b/finecms/finecms/Init.php deleted file mode 100644 index fad17f2..0000000 --- a/finecms/finecms/Init.php +++ /dev/null @@ -1,149 +0,0 @@ - $val) { - if (FALSE !== (strpos(strtolower($_SERVER['HTTP_USER_AGENT']), $key))) { - // 表示移动端 - $is_mobile = 1; - break; - } - } -} - -define('IS_PC', !$is_mobile); // 是否pc端 -define('DOMAIN_NAME', $host); // 当前域名 - -// 当前URL -$pageURL = 'http'; -isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' && $pageURL.= 's'; -$pageURL.= '://'; -if (strpos($_SERVER['HTTP_HOST'], ':') !== FALSE) { - $url = explode(':', $_SERVER['HTTP_HOST']); - $url[0] ? $pageURL.= $_SERVER['HTTP_HOST'] : $pageURL.= $url[0]; -} else { - $pageURL.= $_SERVER['HTTP_HOST']; -} -$pageURL.= $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']; -define('FC_NOW_URL', $pageURL); - -// 伪静态字符串 -$uu = isset($_SERVER['HTTP_X_REWRITE_URL']) || trim($_SERVER['REQUEST_URI'], '/') == SELF ? trim($_SERVER['HTTP_X_REWRITE_URL'], '/') : ($_SERVER['REQUEST_URI'] ? trim($_SERVER['REQUEST_URI'], '/') : NULL); -$uri = strpos($uu, SELF) === 0 || strpos($uu, '?') === 0 ? '' : $uu; // 以index.php或者?开头的uri不做处理 - - -// 根据路由来匹配S变量 -if (!IS_ADMIN && $uri) { - - define('PAGE_CACHE_URL', ($is_mobile ? 'mobile-' : '').$host.'/'.ltrim($uri, '/')); - // 加载单页缓存 - is_file(WEBPATH.'cache/page/'.md5(PAGE_CACHE_URL).'.html') && exit(file_get_contents(WEBPATH.'cache/page/'.md5(PAGE_CACHE_URL).'.html')); - - define('DR_URI', $uri); - include FCPATH.'dayrui/config/routes.php'; - $rewrite = require WEBPATH.'config/rewrite.php'; - $routes = $rewrite && is_array($rewrite) && count($rewrite) > 0 ? array_merge($routes, $rewrite) : $routes; - - // 正则匹配路由规则 - $value = $u = ''; - foreach ($routes as $key => $val) { - $match = array(); - if ($key == $uri || @preg_match('/^'.$key.'$/U', $uri, $match)) { - unset($match[0]); - $u = $val; - $value = $match; - break; - } - - } - if ($u) { - if (strpos($u, 'index.php?') === 0) { - // URL参数模式 - $_GET = array(); - $queryParts = explode('&', str_replace('index.php?', '', $u)); - foreach ($queryParts as $param) { - $item = explode('=', $param); - $_GET[$item[0]] = $item[1]; - if (strpos($item[1], '$') !== FALSE) { - $id = (int)substr($item[1], 1); - $_GET[$item[0]] = isset($match[$id]) ? $match[$id] : $item[1]; - } - } - !$_GET['c'] && $_GET['c'] = 'home'; - !$_GET['m'] && $_GET['m'] = 'index'; - } elseif (strpos($u, '/') !== false) { - // URI分段模式 - $array = explode('/', $u); - $s = array_shift($array); - if (is_dir(FCPATH.'module/'.$s) || is_dir(FCPATH.'app/'.$s)) { - $_GET['s'] = $s; - $_GET['c'] = array_shift($array); - $_GET['m'] = array_shift($array); - } elseif (is_file(FCPATH.'dayrui/controllers/'.ucfirst($s).'.php')) { - $_GET['c'] = $s; - $_GET['m'] = array_shift($array); - } - // 组装GET参数 - if ($array) { - foreach ($array as $k => $t) { - $i%2 == 0 && $_GET[str_replace('$', '_', $t)] = isset($array[$k+1]) ? $array[$k+1] : ''; - $i ++; - } - if ($value) { - foreach ($_GET as $k => $v) { - if (strpos($v, '$') !== FALSE) { - $id = (int)substr($v, 1); - $_GET[$k] = isset($value[$id]) ? $value[$id] : $v; - } - } - } - } - } - } elseif (isset($_GET['s']) && !isset($_GET['c'])) { - // 只存在唯一一个s参数时给他强制指向home控制器 - $_GET['c'] = 'home'; - } -} - -define('APP_DIR', ''); -define('APPPATH', FCPATH . 'dayrui/'); - -if (IS_ADMIN) { - // 后台 - $_GET['s'] = 'admin'; - !defined('IS_MEMBER') && define('IS_MEMBER', FALSE); -} elseif (isset($_GET['s']) && $_GET['s'] == 'member') { - // 会员 - define('IS_MEMBER', TRUE); -} else { - // 前台 - $_GET['s'] = ''; - !defined('IS_MEMBER') && define('IS_MEMBER', FALSE); -} - -$version = require WEBPATH.'config/version.php'; - -define('DR_UPDATE', $version['DR_UPDATE']); -define('DR_VERSION', $version['DR_VERSION']); - -// 请求URI字符串 -!defined('DR_URI') && define('DR_URI', ''); - -// 判断是否存在自定义程序 -if (is_file(FCPATH.'My.php')) { - require FCPATH.'My.php'; -} - -require BASEPATH . 'core/CodeIgniter.php'; // CI框架核心文件 \ No newline at end of file diff --git a/finecms/finecms/dayrui/config/autoload.php b/finecms/finecms/dayrui/config/autoload.php deleted file mode 100644 index 0cf348a..0000000 --- a/finecms/finecms/dayrui/config/autoload.php +++ /dev/null @@ -1,12 +0,0 @@ - '', - 'xhtml1-strict' => '', - 'xhtml1-trans' => '', - 'xhtml1-frame' => '', - 'xhtml-basic11' => '', - 'html5' => '', - 'html4-strict' => '', - 'html4-trans' => '', - 'html4-frame' => '', - 'mathml1' => '', - 'mathml2' => '', - 'svg10' => '', - 'svg11' => '', - 'svg11-basic' => '', - 'svg11-tiny' => '', - 'xhtml-math-svg-xh' => '', - 'xhtml-math-svg-sh' => '', - 'xhtml-rdfa-1' => '', - 'xhtml-rdfa-2' => '' -); diff --git a/finecms/finecms/dayrui/config/domain.php b/finecms/finecms/dayrui/config/domain.php deleted file mode 100644 index bb154a5..0000000 --- a/finecms/finecms/dayrui/config/domain.php +++ /dev/null @@ -1,14 +0,0 @@ - 'ae', - '/ö|œ/' => 'oe', - '/ü/' => 'ue', - '/Ä/' => 'Ae', - '/Ü/' => 'Ue', - '/Ö/' => 'Oe', - '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A', - '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a', - '/Б/' => 'B', - '/б/' => 'b', - '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', - '/ç|ć|ĉ|ċ|č/' => 'c', - '/Д/' => 'D', - '/д/' => 'd', - '/Ð|Ď|Đ|Δ/' => 'Dj', - '/ð|ď|đ|δ/' => 'dj', - '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E', - '/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e', - '/Ф/' => 'F', - '/ф/' => 'f', - '/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G', - '/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g', - '/Ĥ|Ħ/' => 'H', - '/ĥ|ħ/' => 'h', - '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I', - '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i', - '/Ĵ/' => 'J', - '/ĵ/' => 'j', - '/Ķ|Κ|К/' => 'K', - '/ķ|κ|к/' => 'k', - '/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L', - '/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l', - '/М/' => 'M', - '/м/' => 'm', - '/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N', - '/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n', - '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O', - '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o', - '/П/' => 'P', - '/п/' => 'p', - '/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R', - '/ŕ|ŗ|ř|ρ|р/' => 'r', - '/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S', - '/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's', - '/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T', - '/ț|ţ|ť|ŧ|т/' => 't', - '/Þ|þ/' => 'th', - '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U', - '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u', - '/Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y', - '/ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y', - '/В/' => 'V', - '/в/' => 'v', - '/Ŵ/' => 'W', - '/ŵ/' => 'w', - '/Ź|Ż|Ž|Ζ|З/' => 'Z', - '/ź|ż|ž|ζ|з/' => 'z', - '/Æ|Ǽ/' => 'AE', - '/ß/' => 'ss', - '/IJ/' => 'IJ', - '/ij/' => 'ij', - '/Œ/' => 'OE', - '/ƒ/' => 'f', - '/ξ/' => 'ks', - '/π/' => 'p', - '/β/' => 'v', - '/μ/' => 'm', - '/ψ/' => 'ps', - '/Ё/' => 'Yo', - '/ё/' => 'yo', - '/Є/' => 'Ye', - '/є/' => 'ye', - '/Ї/' => 'Yi', - '/Ж/' => 'Zh', - '/ж/' => 'zh', - '/Х/' => 'Kh', - '/х/' => 'kh', - '/Ц/' => 'Ts', - '/ц/' => 'ts', - '/Ч/' => 'Ch', - '/ч/' => 'ch', - '/Ш/' => 'Sh', - '/ш/' => 'sh', - '/Щ/' => 'Shch', - '/щ/' => 'shch', - '/Ъ|ъ|Ь|ь/' => '', - '/Ю/' => 'Yu', - '/ю/' => 'yu', - '/Я/' => 'Ya', - '/я/' => 'ya' -); diff --git a/finecms/finecms/dayrui/config/hooks.php b/finecms/finecms/dayrui/config/hooks.php deleted file mode 100644 index 61dbec5..0000000 --- a/finecms/finecms/dayrui/config/hooks.php +++ /dev/null @@ -1,5 +0,0 @@ - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/config/memcached.php b/finecms/finecms/dayrui/config/memcached.php deleted file mode 100644 index a071363..0000000 --- a/finecms/finecms/dayrui/config/memcached.php +++ /dev/null @@ -1,10 +0,0 @@ - array( - 'hostname' => '', - 'port' => '', - 'weight' => '1', - ), -); diff --git a/finecms/finecms/dayrui/config/migration.php b/finecms/finecms/dayrui/config/migration.php deleted file mode 100644 index 4b585a6..0000000 --- a/finecms/finecms/dayrui/config/migration.php +++ /dev/null @@ -1,84 +0,0 @@ -migration->current() this is the version that schema will -| be upgraded / downgraded to. -| -*/ -$config['migration_version'] = 0; - -/* -|-------------------------------------------------------------------------- -| Migrations Path -|-------------------------------------------------------------------------- -| -| Path to your migrations folder. -| Typically, it will be within your application path. -| Also, writing permission is required within the migrations path. -| -*/ -$config['migration_path'] = APPPATH.'migrations/'; diff --git a/finecms/finecms/dayrui/config/mimes.php b/finecms/finecms/dayrui/config/mimes.php deleted file mode 100644 index 1f591ba..0000000 --- a/finecms/finecms/dayrui/config/mimes.php +++ /dev/null @@ -1,158 +0,0 @@ - array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), - 'cpt' => 'application/mac-compactpro', - 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'), - 'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'), - 'dms' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'exe' => array('application/octet-stream', 'application/x-msdownload'), - 'class' => 'application/octet-stream', - 'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'), - 'so' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'), - 'ai' => array('application/pdf', 'application/postscript'), - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'), - 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'), - 'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'), - 'wbxml' => 'application/wbxml', - 'wmlc' => 'application/wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'gz' => 'application/x-gzip', - 'gzip' => 'application/x-gzip', - 'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'), - 'php4' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'js' => array('application/x-javascript', 'text/plain'), - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), - 'z' => 'application/x-compress', - 'xhtml' => 'application/xhtml+xml', - 'xht' => 'application/xhtml+xml', - 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'), - 'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'), - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mpga' => 'audio/mpeg', - 'mp2' => 'audio/mpeg', - 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), - 'aif' => array('audio/x-aiff', 'audio/aiff'), - 'aiff' => array('audio/x-aiff', 'audio/aiff'), - 'aifc' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'rv' => 'video/vnd.rn-realvideo', - 'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'), - 'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'), - 'gif' => 'image/gif', - 'jpeg' => array('image/jpeg', 'image/pjpeg'), - 'jpg' => array('image/jpeg', 'image/pjpeg'), - 'jpe' => array('image/jpeg', 'image/pjpeg'), - 'png' => array('image/png', 'image/x-png'), - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'css' => array('text/css', 'text/plain'), - 'html' => array('text/html', 'text/plain'), - 'htm' => array('text/html', 'text/plain'), - 'shtml' => array('text/html', 'text/plain'), - 'txt' => 'text/plain', - 'text' => 'text/plain', - 'log' => array('text/plain', 'text/x-log'), - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => array('application/xml', 'text/xml', 'text/plain'), - 'xsl' => array('application/xml', 'text/xsl', 'text/xml'), - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'), - 'movie' => 'video/x-sgi-movie', - 'doc' => array('application/msword', 'application/vnd.ms-office'), - 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), - 'dot' => array('application/msword', 'application/vnd.ms-office'), - 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), - 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'), - 'word' => array('application/msword', 'application/octet-stream'), - 'xl' => 'application/excel', - 'eml' => 'message/rfc822', - 'json' => array('application/json', 'text/json'), - 'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'), - 'p10' => array('application/x-pkcs10', 'application/pkcs10'), - 'p12' => 'application/x-pkcs12', - 'p7a' => 'application/x-pkcs7-signature', - 'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), - 'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'), - 'crl' => array('application/pkix-crl', 'application/pkcs-crl'), - 'der' => 'application/x-x509-ca-cert', - 'kdb' => 'application/octet-stream', - 'pgp' => 'application/pgp', - 'gpg' => 'application/gpg-keys', - 'sst' => 'application/octet-stream', - 'csr' => 'application/octet-stream', - 'rsa' => 'application/x-pkcs7', - 'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'), - '3g2' => 'video/3gpp2', - '3gp' => array('video/3gp', 'video/3gpp'), - 'mp4' => 'video/mp4', - 'm4a' => 'audio/x-m4a', - 'f4v' => 'video/mp4', - 'webm' => 'video/webm', - 'aac' => 'audio/x-acc', - 'm4u' => 'application/vnd.mpegurl', - 'm3u' => 'text/plain', - 'xspf' => 'application/xspf+xml', - 'vlc' => 'application/videolan', - 'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'), - 'au' => 'audio/x-au', - 'ac3' => 'audio/ac3', - 'flac' => 'audio/x-flac', - 'ogg' => 'audio/ogg', - 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), - 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), - 'ics' => 'text/calendar', - 'ical' => 'text/calendar', - 'zsh' => 'text/x-scriptzsh', - '7zip' => array('application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), - 'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'), - 'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'), - 'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'), - 'svg' => array('image/svg+xml', 'application/xml', 'text/xml'), - 'vcf' => 'text/x-vcard', - 'srt' => array('text/srt', 'text/plain'), - 'vtt' => array('text/vtt', 'text/plain'), - 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon') -); diff --git a/finecms/finecms/dayrui/config/pagination.php b/finecms/finecms/dayrui/config/pagination.php deleted file mode 100644 index 14aae42..0000000 --- a/finecms/finecms/dayrui/config/pagination.php +++ /dev/null @@ -1,50 +0,0 @@ - '下一页', // 你希望在分页中显示“下一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'next_tag_open' => '
  • ', // “下一页”链接的打开标签 - 'next_tag_close' => '
  • ', // “下一页”链接的关闭标签 - - // 自定义“上一页”链接 - 'prev_link' => '上一页', // 你希望在分页中显示“上一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'prev_tag_open' => '
  • ', // “上一页”链接的打开标签 - 'prev_tag_close' => '
  • ', // “上一页”链接的关闭标签 - - // 自定义“当前页”链接 - 'cur_tag_open' => '
  • ', // “当前页”链接的打开标签 - 'cur_tag_close' => '
  • ', // “当前页”链接的关闭标签 - - // 自定义“数字”链接 - 'num_tag_open' => '
  • ', // “数字”链接的打开标签 - 'num_tag_close' => '
  • ', // “数字”链接的关闭标签 - - // 自定义“最后一页”链接 - 'last_link' => '最后一页', // 你希望在分页的右边显示“最后一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'last_tag_open' => '
  • ', // “最后一页”链接的打开标签 - 'last_tag_close' => '
  • ', // “最后一页”链接的关闭标签 - - // 自定义“第一页”链接 - 'first_link' => '第一页', // 你希望在分页的左边显示“第一页”链接的名字。如果你不希望显示,可以把它的值设为 FALSE - 'first_tag_open' => '
  • ', // “第一页”链接的打开标签 - 'first_tag_close' => '
  • ', // “第一页”链接的关闭标签 - - // 是否显示数字链接 - 'display_pages' => TRUE, - - // 给每一个链接添加 CSS 类 - 'anchor_class' => '', - - // 显示的分页数字个数 - 'num_links' => 4, - -); \ No newline at end of file diff --git a/finecms/finecms/dayrui/config/profiler.php b/finecms/finecms/dayrui/config/profiler.php deleted file mode 100644 index b30204e..0000000 --- a/finecms/finecms/dayrui/config/profiler.php +++ /dev/null @@ -1,14 +0,0 @@ - array('grin.gif', '19', '19', 'grin'), - ':lol:' => array('lol.gif', '19', '19', 'LOL'), - ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), - ':)' => array('smile.gif', '19', '19', 'smile'), - ';-)' => array('wink.gif', '19', '19', 'wink'), - ';)' => array('wink.gif', '19', '19', 'wink'), - ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), - ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), - ':-S' => array('confused.gif', '19', '19', 'confused'), - ':wow:' => array('surprise.gif', '19', '19', 'surprised'), - ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), - ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), - '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), - ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), - ':P' => array('raspberry.gif', '19', '19', 'raspberry'), - ':blank:' => array('blank.gif', '19', '19', 'blank stare'), - ':long:' => array('longface.gif', '19', '19', 'long face'), - ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), - ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), - ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), - '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), - ':down:' => array('downer.gif', '19', '19', 'downer'), - ':red:' => array('embarrassed.gif', '19', '19', 'red face'), - ':sick:' => array('sick.gif', '19', '19', 'sick'), - ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), - ':-/' => array('hmm.gif', '19', '19', 'hmmm'), - '>:(' => array('mad.gif', '19', '19', 'mad'), - ':mad:' => array('mad.gif', '19', '19', 'mad'), - '>:-(' => array('angry.gif', '19', '19', 'angry'), - ':angry:' => array('angry.gif', '19', '19', 'angry'), - ':zip:' => array('zip.gif', '19', '19', 'zipper'), - ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), - ':ahhh:' => array('shock.gif', '19', '19', 'shock'), - ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), - ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), - ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), - ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), - ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), - ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), - ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), - ':snake:' => array('snake.gif', '19', '19', 'snake'), - ':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'), - ':question:' => array('question.gif', '19', '19', 'question') - -); diff --git a/finecms/finecms/dayrui/config/user_agents.php b/finecms/finecms/dayrui/config/user_agents.php deleted file mode 100644 index 1129dba..0000000 --- a/finecms/finecms/dayrui/config/user_agents.php +++ /dev/null @@ -1,211 +0,0 @@ - 'Windows 10', - 'windows nt 6.3' => 'Windows 8.1', - 'windows nt 6.2' => 'Windows 8', - 'windows nt 6.1' => 'Windows 7', - 'windows nt 6.0' => 'Windows Vista', - 'windows nt 5.2' => 'Windows 2003', - 'windows nt 5.1' => 'Windows XP', - 'windows nt 5.0' => 'Windows 2000', - 'windows nt 4.0' => 'Windows NT 4.0', - 'winnt4.0' => 'Windows NT 4.0', - 'winnt 4.0' => 'Windows NT', - 'winnt' => 'Windows NT', - 'windows 98' => 'Windows 98', - 'win98' => 'Windows 98', - 'windows 95' => 'Windows 95', - 'win95' => 'Windows 95', - 'windows phone' => 'Windows Phone', - 'windows' => 'Unknown Windows OS', - 'android' => 'Android', - 'blackberry' => 'BlackBerry', - 'iphone' => 'iOS', - 'ipad' => 'iOS', - 'ipod' => 'iOS', - 'os x' => 'Mac OS X', - 'ppc mac' => 'Power PC Mac', - 'freebsd' => 'FreeBSD', - 'ppc' => 'Macintosh', - 'linux' => 'Linux', - 'debian' => 'Debian', - 'sunos' => 'Sun Solaris', - 'beos' => 'BeOS', - 'apachebench' => 'ApacheBench', - 'aix' => 'AIX', - 'irix' => 'Irix', - 'osf' => 'DEC OSF', - 'hp-ux' => 'HP-UX', - 'netbsd' => 'NetBSD', - 'bsdi' => 'BSDi', - 'openbsd' => 'OpenBSD', - 'gnu' => 'GNU/Linux', - 'unix' => 'Unknown Unix OS', - 'symbian' => 'Symbian OS' -); - - -// The order of this array should NOT be changed. Many browsers return -// multiple browser types so we want to identify the sub-type first. -$browsers = array( - 'OPR' => 'Opera', - 'Flock' => 'Flock', - 'Edge' => 'Spartan', - 'Chrome' => 'Chrome', - // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string - 'Opera.*?Version' => 'Opera', - 'Opera' => 'Opera', - 'MSIE' => 'Internet Explorer', - 'Internet Explorer' => 'Internet Explorer', - 'Trident.* rv' => 'Internet Explorer', - 'Shiira' => 'Shiira', - 'Firefox' => 'Firefox', - 'Chimera' => 'Chimera', - 'Phoenix' => 'Phoenix', - 'Firebird' => 'Firebird', - 'Camino' => 'Camino', - 'Netscape' => 'Netscape', - 'OmniWeb' => 'OmniWeb', - 'Safari' => 'Safari', - 'Mozilla' => 'Mozilla', - 'Konqueror' => 'Konqueror', - 'icab' => 'iCab', - 'Lynx' => 'Lynx', - 'Links' => 'Links', - 'hotjava' => 'HotJava', - 'amaya' => 'Amaya', - 'IBrowse' => 'IBrowse', - 'Maxthon' => 'Maxthon', - 'Ubuntu' => 'Ubuntu Web Browser' -); - -$mobiles = array( - // legacy array, old values commented out - 'mobileexplorer' => 'Mobile Explorer', -// 'openwave' => 'Open Wave', -// 'opera mini' => 'Opera Mini', -// 'operamini' => 'Opera Mini', -// 'elaine' => 'Palm', - 'palmsource' => 'Palm', -// 'digital paths' => 'Palm', -// 'avantgo' => 'Avantgo', -// 'xiino' => 'Xiino', - 'palmscape' => 'Palmscape', -// 'nokia' => 'Nokia', -// 'ericsson' => 'Ericsson', -// 'blackberry' => 'BlackBerry', -// 'motorola' => 'Motorola' - - // Phones and Manufacturers - 'motorola' => 'Motorola', - 'nokia' => 'Nokia', - 'palm' => 'Palm', - 'iphone' => 'Apple iPhone', - 'ipad' => 'iPad', - 'ipod' => 'Apple iPod Touch', - 'sony' => 'Sony Ericsson', - 'ericsson' => 'Sony Ericsson', - 'blackberry' => 'BlackBerry', - 'cocoon' => 'O2 Cocoon', - 'blazer' => 'Treo', - 'lg' => 'LG', - 'amoi' => 'Amoi', - 'xda' => 'XDA', - 'mda' => 'MDA', - 'vario' => 'Vario', - 'htc' => 'HTC', - 'samsung' => 'Samsung', - 'sharp' => 'Sharp', - 'sie-' => 'Siemens', - 'alcatel' => 'Alcatel', - 'benq' => 'BenQ', - 'ipaq' => 'HP iPaq', - 'mot-' => 'Motorola', - 'playstation portable' => 'PlayStation Portable', - 'playstation 3' => 'PlayStation 3', - 'playstation vita' => 'PlayStation Vita', - 'hiptop' => 'Danger Hiptop', - 'nec-' => 'NEC', - 'panasonic' => 'Panasonic', - 'philips' => 'Philips', - 'sagem' => 'Sagem', - 'sanyo' => 'Sanyo', - 'spv' => 'SPV', - 'zte' => 'ZTE', - 'sendo' => 'Sendo', - 'nintendo dsi' => 'Nintendo DSi', - 'nintendo ds' => 'Nintendo DS', - 'nintendo 3ds' => 'Nintendo 3DS', - 'wii' => 'Nintendo Wii', - 'open web' => 'Open Web', - 'openweb' => 'OpenWeb', - - // Operating Systems - 'android' => 'Android', - 'symbian' => 'Symbian', - 'SymbianOS' => 'SymbianOS', - 'elaine' => 'Palm', - 'series60' => 'Symbian S60', - 'windows ce' => 'Windows CE', - - // Browsers - 'obigo' => 'Obigo', - 'netfront' => 'Netfront Browser', - 'openwave' => 'Openwave Browser', - 'mobilexplorer' => 'Mobile Explorer', - 'operamini' => 'Opera Mini', - 'opera mini' => 'Opera Mini', - 'opera mobi' => 'Opera Mobile', - 'fennec' => 'Firefox Mobile', - - // Other - 'digital paths' => 'Digital Paths', - 'avantgo' => 'AvantGo', - 'xiino' => 'Xiino', - 'novarra' => 'Novarra Transcoder', - 'vodafone' => 'Vodafone', - 'docomo' => 'NTT DoCoMo', - 'o2' => 'O2', - - // Fallback - 'mobile' => 'Generic Mobile', - 'wireless' => 'Generic Mobile', - 'j2me' => 'Generic Mobile', - 'midp' => 'Generic Mobile', - 'cldc' => 'Generic Mobile', - 'up.link' => 'Generic Mobile', - 'up.browser' => 'Generic Mobile', - 'smartphone' => 'Generic Mobile', - 'cellphone' => 'Generic Mobile' -); - -// There are hundreds of bots but these are the most common. -$robots = array( - 'googlebot' => 'Googlebot', - 'msnbot' => 'MSNBot', - 'baiduspider' => 'Baiduspider', - 'bingbot' => 'Bing', - 'slurp' => 'Inktomi Slurp', - 'yahoo' => 'Yahoo', - 'ask jeeves' => 'Ask Jeeves', - 'fastcrawler' => 'FastCrawler', - 'infoseek' => 'InfoSeek Robot 1.0', - 'lycos' => 'Lycos', - 'yandex' => 'YandexBot', - 'mediapartners-google' => 'MediaPartners Google', - 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', - 'adsbot-google' => 'AdsBot Google', - 'feedfetcher-google' => 'Feedfetcher Google', - 'curious george' => 'Curious George' -); diff --git a/finecms/finecms/dayrui/controllers/Api.php b/finecms/finecms/dayrui/controllers/Api.php deleted file mode 100644 index 4b840e7..0000000 --- a/finecms/finecms/dayrui/controllers/Api.php +++ /dev/null @@ -1,131 +0,0 @@ -template->display('member.html'); - $html = ob_get_contents(); - ob_clean(); - $format = $this->input->get('format'); - // 页面输出 - if ($format == 'jsonp') { - $data = $this->callback_json(array('html' => $html)); - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$data.')'; - } elseif ($format == 'json') { - echo $this->callback_json(array('html' => $html)); - } else { - echo 'document.write("'.addslashes(str_replace(array("\r", "\n", "\t", chr(13)), array('', '', '', ''), $html)).'");'; - } - exit; - } - - - /** - * 自定义信息JS调用 - */ - public function template() { - $this->api_template(); - } - - /** - * ajax 动态调用 - */ - public function html() { - - ob_start(); - $this->template->cron = 0; - $_GET['page'] = max(1, (int)$this->input->get('page')); - $params = dr_string2array(urldecode($this->input->get('params'))); - $params['get'] = @json_decode(urldecode($this->input->get('get')), TRUE); - $this->template->assign($params); - $name = str_replace(array('\\', '/', '..', '<', '>'), '', dr_safe_replace($this->input->get('name', TRUE))); - $this->template->display(strpos($name, '.html') ? $name : $name.'.html'); - $html = ob_get_contents(); - ob_clean(); - - // 页面输出 - $format = $this->input->get('format'); - if ($format == 'html') { - exit($html); - } elseif ($format == 'json') { - echo $this->callback_json(array('html' => $html)); - } elseif ($format == 'js') { - echo 'document.write("'.addslashes(str_replace(array("\r", "\n", "\t", chr(13)), array('', '', '', ''), $html)).'");'; - } else { - $data = $this->callback_json(array('html' => $html)); - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$data.')'; - } - } - - /** - * 更新浏览数 - */ - public function hits() { - - $id = (int)$this->input->get('id'); - $dir = dr_safe_replace($this->input->get('module', TRUE)); - $mod = $this->module[$dir]; - if (!$mod) { - $data = $this->callback_json(array('html' => 0)); - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$data.')';exit; - } - - // 获取主表时间段 - $data = $this->db - ->where('id', $id) - ->select('hits,updatetime') - ->get($this->db->dbprefix(SITE_ID.'_'.$dir)) - ->row_array(); - $hits = (int)$data['hits'] + 1; - - // 更新主表 - $this->db->where('id', $id)->update(SITE_ID.'_'.$dir, array('hits' => $hits)); - - // 输出数据 - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$this->callback_json(array('html' => $hits)).')';exit; - } - - - - /** - * 伪静态测试 - */ - public function test() { - header('Content-Type: text/html; charset=utf-8'); - echo '服务器支持伪静态'; - } - - /** - * 自定义数据调用 - */ - public function data2() { - // 扥待新方案 - exit; - } - - /** - * 站点间的同步登录 - */ - public function synlogin() { - $this->api_synlogin(); - } - - /** - * 站点间的同步退出 - */ - public function synlogout() { - $this->api_synlogout(); - } -} diff --git a/finecms/finecms/dayrui/controllers/Category.php b/finecms/finecms/dayrui/controllers/Category.php deleted file mode 100644 index 4226126..0000000 --- a/finecms/finecms/dayrui/controllers/Category.php +++ /dev/null @@ -1,104 +0,0 @@ -input->get('id'); - $dir = $this->input->get('dir', TRUE); - $page = max(1, (int)$this->input->get('page')); - $category = $this->get_cache('category-'.SITE_ID); - $category_dir = $this->get_cache('category-dir-'.SITE_ID); - - if ($id) { - $cat = $category[$id]; - !$cat && $this->goto_404_page(fc_lang('栏目(%s)不存在', $id)); - } elseif ($dir) { - $id = $category_dir[$dir]; - $cat = $category[$id]; - if (!$cat) { - // 无法通过目录找到栏目时,尝试多及目录 - foreach ($category as $t) { - if ($t['setting']['urlrule']) { - $rule = $this->get_cache('urlrule', $t['setting']['urlrule']); - if ($rule['value']['catjoin'] && strpos($dir, $rule['value']['catjoin'])) { - $dir = trim(strchr($dir, $rule['value']['catjoin']), $rule['value']['catjoin']); - if (isset($category_dir[$dir])) { - $id = $category_dir[$dir]; - $cat = $category[$id]; - break; - } - } - } - } - // 返回无法找到栏目 - !$cat && $this->goto_404_page(fc_lang('栏目(%s)不存在', $dir)); - } - } else { - $this->goto_404_page(fc_lang('栏目参数不存在')); - } - - // 设置模型信息 - $this->dir = $cat['mid']; - - // 验证是否存在子栏目,是否将下级第一个单页作为当前页 - if ($cat['child'] && $cat['setting']['getchild']) { - $temp = explode(',', $cat['childids']); - if ($temp) { - foreach ($temp as $i) { - if ($category[$i]['id'] != $id && $category[$i]['show'] && !$category[$i]['child']) { - $id = $i; - $cat = $category[$i]; - break; - } - } - } - } - if ($cat['tid'] && $this->dir) { - // 模型 - $this->_module_init($this->dir); - $tpl = $cat['child'] ? $cat['setting']['template']['category'] : $cat['setting']['template']['list']; - } else { - // 单页 - $cat['title'] = $cat['title'] ? $cat['title'] : $cat['name']; - $cat['pageid'] = $cat['id']; - $this->template->assign($cat); - $tpl = $cat['setting']['template']['page'] ? $cat['setting']['template']['page'] : 'page.html'; - } - - // 定向URL - #dr_is_redirect(3, $cat['url']); - - - list($parent, $related) = $this->_related_cat($category, $id); - - if ($cat['mid']) { - $this->template->module($cat['mid']); - } - $this->template->assign(dr_category_seo($cat, max(1, (int)$this->input->get('page')))); - $this->template->assign(array( - 'cat' => $cat, - 'top' => $category[$id]['topid'] && $category[$category[$id]['topid']] ? $category[$category[$id]['topid']] : $cat, - 'page' => $page, - 'catid' => $id, - 'params' => array('catid' => $id), - 'parent' => $parent, - 'related' => $related, - 'urlrule' => dr_category_url($cat, SITE_ID, '{page}'), - )); - $this->template->display($tpl); - - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Form.php b/finecms/finecms/dayrui/controllers/Form.php deleted file mode 100644 index 398dfc8..0000000 --- a/finecms/finecms/dayrui/controllers/Form.php +++ /dev/null @@ -1,112 +0,0 @@ -mid = dr_safe_replace($this->input->get('mid', true)); - $this->form = $this->get_cache('form-name-'.SITE_ID, $this->mid); - if (!$this->form) { - $this->admin_msg(fc_lang('表单['.$this->mid.']不存在')); - } - $this->load->model('form_model'); - } - - - /** - * 提交内容 - */ - public function index() { - - !$this->form['setting']['post'] && (IS_POST ? exit($this->call_msg(fc_lang('此表单没有开启前端提交功能'))) : $this->msg(fc_lang('此表单没有开启前端提交功能'))); - - if (IS_POST) { - - $this->form['setting']['code'] && !$this->check_captcha('code') && exit($this->call_msg(fc_lang('验证码不正确'))); - - $data = $this->validate_filter($this->form['field']); - - // 验证出错信息 - isset($data['error']) && exit($this->call_msg($data['msg'])); - - $data[1]['uid'] =$data[0]['uid'] = $this->uid; - $data[1]['author'] = $this->uid ? $this->member['username'] : 'guest'; - $data[1]['inputip'] = $this->input->ip_address(); - $data[1]['inputtime'] = SYS_TIME; - $data[1]['displayorder'] = 0; - - $this->load->model('form_model'); - $data[1]['id'] = $id = $this->form_model->new_addc($this->form['table'], $data); - - if ($this->form['setting']['send'] && $this->form['setting']['template']) { - $rep = new php5replace($data[1]+$data[0]); - $content = preg_replace_callback('#{(.*)}#U', array($rep, 'php55_replace_data'), $this->form['setting']['template']); - $content = preg_replace_callback('#{([a-z_0-9]+)\((.*)\)}#Ui', array($rep, 'php55_replace_function'), $content); - unset($rep); - - $this->sendmail($this->form['setting']['send'], fc_lang('【%s】通知 [来自:'.SITE_NAME.']', $this->form['name']), nl2br($content)); - } - $this->call_msg(fc_lang('操作成功'), 1, $data); - } else { - $tpl = dr_tpl_path('form_'.$this->form['table'].'.html'); - $cat = array(); - $catid = 0; - foreach ($this->get_cache('category-'.SITE_ID) as $t) { - if ($t['tid'] == 2) { - $url = trim(str_replace(SITE_URL, '', $t['setting']['linkurl']), '/'); - $now = trim(str_replace(SITE_URL, '', FC_NOW_URL), '/'); - if ($url && $url == $now) { - $cat = $t; - $catid = $t['id']; - } - } - } - $this->template->assign(array( - 'cag' => $cat, - 'catid' => $catid, - 'form' => $this->form, - 'code' => $this->form['setting']['code'], - 'myfield' => $this->field_input($this->form['field']), - 'meta_title' => $this->form['name'].SITE_SEOJOIN.SITE_NAME - )); - $this->template->display(is_file($tpl) ? basename($tpl) : 'form.html'); - } - } - - /** - * 回调方法 有问题 - */ - public function call_msg($msg, $code = 0, $data = array()) { - - - $url = $this->form['setting']['rt_url']; - !$url && $url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; - - if (IS_AJAX) { - exit(dr_json($code, $msg, $url)); // AJAX请求时返回json格式 - } else { - if ($code) { - $this->msg($msg, $url, 1); // 成功 - } else { - $this->msg($msg); // 错误 - } - } - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Home.php b/finecms/finecms/dayrui/controllers/Home.php deleted file mode 100644 index 2130403..0000000 --- a/finecms/finecms/dayrui/controllers/Home.php +++ /dev/null @@ -1,26 +0,0 @@ -template->assign(array( - 'indexc' => 1, - 'meta_title' => SITE_TITLE, - 'meta_keywords' => SITE_KEYWORDS, - 'meta_description' => SITE_DESCRIPTION, - )); - $this->template->display('index.html'); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Image.php b/finecms/finecms/dayrui/controllers/Image.php deleted file mode 100644 index 8eff3d0..0000000 --- a/finecms/finecms/dayrui/controllers/Image.php +++ /dev/null @@ -1,217 +0,0 @@ -output->enable_profiler(FALSE); - } - - /** - * 图片处理2 - */ - public function thumb2() { - - list($id, $width, $height, $autocut) = explode('-', $this->input->get('p')); - - $id or $id = $this->input->get('id'); - $width or $width = $this->input->get('width'); - $height or $height = $this->input->get('height'); - $autocut or $autocut = $this->input->get('autocut'); - - $this->load->library('dthumb'); - - // 输出图片的地址 - $display = WEBPATH.'cache/thumb/'.md5("index.php?c=image&m=thumb&p=$id-$width-$height-$autocut").'.jpg'; - - // 存在缩略图时就输出图片 - if (is_file($display)) { - $this->dthumb->display($display); - return; - } - - // 是附件id时 - if (is_numeric($id)) { - $info = get_attachment($id); - // 远程图片下载到本地缓存目录 - if (isset($info['remote']) && $info['remote']) { - $file = WEBPATH.'cache/attach/'.time().'_'.basename($info['attachment']); - file_put_contents($file, dr_catcher_data($info['attachment'])); - } else { - $file = SYS_UPLOAD_PATH.'/'.$info['attachment']; - } - unset($info); - } - - // 图片不存在时调用默认图片 - if (!is_file($file)) { - $file = WEBPATH.'statics/admin/images/nopic.gif'; - } - - // 生成缩略图 - $this->dthumb->thumb($file, $display, $width, $height, '', $autocut); - - // 输出缩略图 - $this->dthumb->display($display); - } - - /** - * 图片处理 - */ - public function thumb() { - - // 参数解析 - list($id, $width, $height, $water, $size) = explode('-', $this->input->get('p')); - - // 接收参数 - $id or $id = $this->input->get('id'); - $width or $width = $this->input->get('width'); - $height or $height = $this->input->get('height'); - $water or $water = $this->input->get('water'); - $size or $size = (int)$this->input->get('size'); - - // 缓存文件 - $thumb_file = WEBPATH.'cache/thumb/'.md5("index.php?c=image&m=thumb&p=$id-$width-$height-$water-$size").'.jpg'; -/* - // 存在缩略图时就输出图片 - if (is_file($thumb_file)) { - $this->thumb_display($thumb_file); - return; - }*/ - - $info = get_attachment($id); // 图片信息 - - if ($info && in_array($info['fileext'], array('jpg', 'gif', 'png', 'jpeg'))) { - // 远程图片下载到本地缓存目录 - if (isset($info['remote']) && $info['remote']) { - $file = WEBPATH.'cache/attach/'.SYS_TIME.'_'.basename($info['attachment']); - if ($size) { - $info['attachment'] = str_replace( - basename($info['attachment']), - basename($info['attachment'], '.'.$info['fileext']).'_'.$size.'.'.$info['fileext'], - $info['attachment'] - ); - } - file_put_contents($file, dr_catcher_data($info['attachment'])); - } else { - if ($size) { - $file_size = str_replace( - basename($info['attachment']), - basename($info['attachment'], '.'.$info['fileext']).'_'.$size.'.'.$info['fileext'], - $info['attachment'] - ); - $file = is_file(SYS_UPLOAD_PATH.'/'.$file_size) ? SYS_UPLOAD_PATH.'/'.$file_size : SYS_UPLOAD_PATH.'/'.$info['attachment']; - } else { - $file = SYS_UPLOAD_PATH.'/'.$info['attachment']; - } - } - $file = !is_file($file) ? WEBPATH.'statics/admin/images/nopic.gif' : $file; - } else { - $file = WEBPATH.'statics/admin/images/nopic.gif'; - } - - // 处理宽高 - list($_width, $_height) = @getimagesize($file); - $width = $width ? $width : $_width; - $height = $height ? $height : $_height; - - // 站点配置信息 - $site = $this->get_cache('siteinfo', $info['siteid']); - - // 生成新图参数 - $config['width'] = $width; - $config['height'] = $height; - $config['create_thumb'] = TRUE; - $config['source_image'] = $file; - $config['new_image'] = $thumb_file; - $config['thumb_marker'] = ''; - $config['image_library'] = 'gd2'; - $config['dynamic_output'] = FALSE; // 输出到浏览器 - $config['maintain_ratio'] = (bool)$site['SITE_IMAGE_RATIO']; // 使图像保持原始的纵横比例 - - // 水印判断 - if (isset($info['remote']) && $info['remote'] && !$site['SITE_IMAGE_REMOTE'] - ? FALSE : ((bool)$site['SITE_IMAGE_WATERMARK'] && $water ? TRUE : FALSE)) { - // 水印参数 - $config['wm_type'] = $site['SITE_IMAGE_TYPE'] ? 'overlay' : 'text'; - $config['wm_vrt_offset'] = $site['SITE_IMAGE_VRTOFFSET']; - $config['wm_hor_offset'] = $site['SITE_IMAGE_HOROFFSET']; - $config['wm_vrt_alignment'] = $site['SITE_IMAGE_VRTALIGN']; - $config['wm_hor_alignment'] = $site['SITE_IMAGE_HORALIGN']; - // 文字模式 - $config['wm_text'] = $site['SITE_IMAGE_TEXT']; - $config['wm_font_size'] = $site['SITE_IMAGE_SIZE']; - $config['wm_font_path'] = WEBPATH.'statics/watermark/'.($site['SITE_IMAGE_FONT'] ? $site['SITE_IMAGE_FONT'] : 'default.ttf'); - $config['wm_font_color'] = $site['SITE_IMAGE_COLOR'] ? str_replace('#', '', $site['SITE_IMAGE_COLOR']) : '#000000'; - // 图片模式 - $config['wm_opacity'] = $site['SITE_IMAGE_OPACITY'] ? $site['SITE_IMAGE_OPACITY'] : 80; - $config['wm_overlay_path'] = WEBPATH.'statics/watermark/'.($site['SITE_IMAGE_OVERLAY'] ? $site['SITE_IMAGE_OVERLAY'] : 'default.png'); - // 生成图片的临时文件 - $this->load->library('image_lib', $config); - $this->image_lib->resize($thumb_file); - // 打开临时文件再水印 - $this->image_lib->full_src_path = $config['new_image']; - $this->image_lib->watermark(); - } else { - // 默认模式 - $this->load->library('image_lib', $config); - $this->image_lib->resize($thumb_file); - } - - $this->thumb_display(!is_file($thumb_file) ? WEBPATH.'statics/admin/images/nopic.gif' : $thumb_file); - - // 删除远程附件临时文件 - if (isset($info['remote']) && $info['remote']) { - @unlink($file); - } - } - - - // 图片输出 - private function thumb_display($filename) { - - // 图片属性 - $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png'); - $vals = getimagesize($filename); - $mime = (isset($types[$vals[2]])) ? 'image/'.$types[$vals[2]] : 'image/jpg'; - $type = $vals[2]; - - // 输出图片 - ob_start(); - ob_clean(); - header('Content-Disposition: filename='.$filename.';'); - header('Content-Type: '.$mime); - header('Content-Transfer-Encoding: binary'); - header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); - - switch ($type) { - case 1 : - $im = imagecreatefromgif($filename); - imagegif($im); - break; - case 2 : - $im = imagecreatefromjpeg($filename); - imagejpeg($im, NULL, 90); - break; - case 3 : - $im = imagecreatefrompng($filename); - // 解决png透明问题 - $resize_im = imagecreatetruecolor($vals[0], $vals[1]); - imagesavealpha($im, true); - imagealphablending($resize_im, false); - imagesavealpha($resize_im, true); - imagecopyresampled($resize_im, $im, 0, 0, 0, 0, 0, 0, 0, 0); - imagepng($im); - break; - } - - @imagedestroy($im); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Install.php b/finecms/finecms/dayrui/controllers/Install.php deleted file mode 100644 index bf8169c..0000000 --- a/finecms/finecms/dayrui/controllers/Install.php +++ /dev/null @@ -1,387 +0,0 @@ -load->library('template'); - define('SITE_PATH', str_replace(array('\\', '//'), '/', str_replace(array('/'.APP_DIR, 'member'), '', dirname($_SERVER['SCRIPT_NAME'])).'/')); - define('SITE_THEME', 'default'); - define('SITE_TEMPLATE', 'default'); - define('SYS_UPLOAD_DIR', 'uploadfile'); - $config = require WEBPATH.'config/version.php'; // 加载系统版本更新文件 - foreach ($config as $var => $value) { - !defined($var) && define($var, $value); // 将配置文件数组转换为常量 - } - $this->load->library('dcache'); - $this->dcache->set('install', TRUE); - if (strlen(DR_URI) > 1 && strpos(DR_URI, '/') !== FALSE) { - header('Content-Type: text/html; charset=utf8'); - show_error('禁止子目录安装('.DR_URI.'),请放置在网站根目录安装', 404); - } - } - - /** - * 安装程序 - */ - public function index() { - - $step = max(1, (int)$this->input->get('step')); - switch ($step) { - - case 1: - break; - - case 2: - - $check_pass = true; - - $writeAble = $this->_checkFileRight(); - $lowestEnvironment = $this->_getLowestEnvironment(); - $currentEnvironment = $this->_getCurrentEnvironment(); - $recommendEnvironment = $this->_getRecommendEnvironment(); - - foreach ($currentEnvironment as $key => $value) { - if (false !== strpos($key, '_ischeck') && false === $value) { - $check_pass = false; - } - } - foreach ($writeAble as $value) { - if (false === $value) { - $check_pass = false; - } - } - - $this->template->assign(array( - 'writeAble' => $writeAble, - 'check_pass' => $check_pass, - 'lowestEnvironment' => $lowestEnvironment, - 'currentEnvironment' => $currentEnvironment, - 'recommendEnvironment' => $recommendEnvironment, - )); - break; - case 3: - - if ($_POST) { - $data = $this->input->post('data'); - // 数据库支持判断 - $mysqli = function_exists('mysqli_init') ? mysqli_init() : 0; - if (version_compare(PHP_VERSION, '5.5.0') >= 0 && !$mysqli) { - exit(dr_json(0, '您的PHP环境必须启用Mysqli扩展')); - } - // 参数判断 - if (!$data['dbname']) { - exit(dr_json(0, '数据库名称不能为空')); - } - if (is_numeric($data['dbname'])) { - exit(dr_json(0, '数据库名称不能是数字')); - } - if (strpos($data['dbname'], '.') !== false) { - exit(dr_json(0, '数据库名称不能存在.号')); - } - - if ($mysqli) { - if (!@mysqli_real_connect($mysqli, $data['dbhost'], $data['dbuser'], $data['dbpw'])) { - exit(dr_json(0, '无法连接到数据库服务器('.$data['dbhost'].'),请检查用户名('.$data['dbuser'].')和密码('.$data['dbpw'].')是否正确')); - } - if (!@mysqli_select_db($mysqli, $data['dbname'])) { - if (!@mysqli_query($mysqli, 'CREATE DATABASE '.$data['dbname'])) { - exit(dr_json(0, '指定的数据库('.$data['dbname'].')不存在,系统尝试创建失败,请通过其他方式建立数据库')); - } - } - // utf8方式打开数据库 - mysqli_query($mysqli, 'SET NAMES utf8'); - } else { - if (!@mysql_connect($data['dbhost'], $data['dbuser'], $data['dbpw'])) { - exit(dr_json(0, mysql_error().'
    无法连接到数据库服务器('.$data['dbhost'].'),请检查用户名('.$data['dbuser'].')和密码('.$data['dbpw'].')是否正确')); - } - if (!@mysql_select_db($data['dbname'])) { - if (!@mysql_query('CREATE DATABASE '.$data['dbname'])) { - exit(dr_json(0, mysql_error().'
    指定的数据库('.$data['dbname'].')不存在,系统尝试创建失败,请通过其他方式建立数据库')); - } - } - // utf8方式打开数据库 - mysql_query('SET NAMES utf8'); - } - - // 格式化端口 - list($data['dbhost'], $data['dbport']) = explode(':', $data['dbhost']); - $data['dbport'] = $data['dbport'] ? (int)$data['dbport'] : 3306; - $data['dbprefix'] = $data['dbprefix'] ? $data['dbprefix'] : 'dr_'; - // 配置文件 - $config = " '',".PHP_EOL; - $config.= " 'hostname' => '{$data['dbhost']}',".PHP_EOL; - $config.= " 'username' => '{$data['dbuser']}',".PHP_EOL; - $config.= " 'password' => '{$data['dbpw']}',".PHP_EOL; - $config.= " 'port' => '{$data['dbport']}',".PHP_EOL; - $config.= " 'database' => '{$data['dbname']}',".PHP_EOL; - $config.= " 'dbdriver' => '".($mysqli ? 'mysqli' : 'mysql')."',".PHP_EOL; - $config.= " 'dbprefix' => '{$data['dbprefix']}',".PHP_EOL; - $config.= " 'pconnect' => FALSE,".PHP_EOL; - $config.= " 'db_debug' => true,".PHP_EOL; - $config.= " 'cache_on' => FALSE,".PHP_EOL; - $config.= " 'cachedir' => 'cache/sql/',".PHP_EOL; - $config.= " 'char_set' => 'utf8',".PHP_EOL; - $config.= " 'dbcollat' => 'utf8_general_ci',".PHP_EOL; - $config.= " 'swap_pre' => '',".PHP_EOL; - $config.= " 'autoinit' => FALSE,".PHP_EOL; - $config.= " 'encrypt' => FALSE,".PHP_EOL; - $config.= " 'compress' => FALSE,".PHP_EOL; - $config.= " 'stricton' => FALSE,".PHP_EOL; - $config.= " 'failover' => array(),".PHP_EOL; - $config.= ");".PHP_EOL; - // 保存配置文件 - if (!file_put_contents(WEBPATH.'config/database.php', $config)) { - exit(dr_json(0, '数据库配置文件保存失败,请检查文件config/database.php权限!')); - } - // key - $system = file_get_contents(WEBPATH.'config/system.php'); - if (!file_put_contents(WEBPATH.'config/system.php', str_replace('finecms5key', 'finecms'.md5(time()), $system))) { - exit(dr_json(0, '配置文件保存失败,请检查文件config/system.php权限!')); - } - - // 加载数据库 - $this->load->database(); - $this->db->db_debug = false; - - - // 导入表结构 - $this->_query(str_replace( - array('{dbprefix}', '{site_url}'), - array($this->db->dbprefix, strtolower($_SERVER['HTTP_HOST'])), - file_get_contents(WEBPATH.'cache/install/install.sql') - )); - - if ($data['demo']) { - // 导入默认数据 - $this->_query(str_replace( - array('{dbprefix}', '{site_url}'), - array($this->db->dbprefix, strtolower($_SERVER['HTTP_HOST'])), - file_get_contents(WEBPATH.'cache/install/default.sql') - )); - } - - exit(dr_json(1, dr_url('install/index', array('step' => $step + 1)))); - } - break; - - case 4: - $log = array(); - $sql = file_get_contents(WEBPATH.'cache/install/install.sql'); - preg_match_all('/`\{dbprefix\}(.+)`/U', $sql, $match); - if ($match) { - $log = array_unique($match[1]); - } - $this->template->assign(array( - 'log' => implode('', $log), - )); - break; - - case 5: - file_put_contents(WEBPATH.'cache/install.lock', time()); - file_put_contents(WEBPATH.'cache/install.new', time()); - break; - } - - $this->template->assign(array( - 'step' => $step, - )); - $this->template->display('install_'.$step.'.html', 'admin'); - } - - // 执行sql - private function _query($sql) { - - if (!$sql) { - return NULL; - } - - $sql_data = explode(';SQL_FINECMS_EOL', trim(str_replace(array(PHP_EOL, chr(13), chr(10)), 'SQL_FINECMS_EOL', $sql))); - - foreach($sql_data as $query){ - if (!$query) { - continue; - } - $ret = ''; - $queries = explode('SQL_FINECMS_EOL', trim($query)); - foreach($queries as $query) { - $ret.= $query[0] == '#' || $query[0].$query[1] == '--' ? '' : $query; - } - if (!$ret) { - continue; - } - $this->db->query($ret); - } - } - - /** - * 获得当前的环境信息 - * - * @return array - */ - private function _getCurrentEnvironment() { - $lowestEnvironment = $this->_getLowestEnvironment(); - $space = floor(@disk_free_space(WEBPATH) / (1024 * 1024)); - $space = $space ? $space . 'M': 'unknow'; - $currentUpload = ini_get('file_uploads') ? ini_get('upload_max_filesize') : 'unknow'; - $upload_ischeck = intval($currentUpload) >= intval($lowestEnvironment['upload']) ? true : false; - $space_ischeck = intval($space) >= intval($lowestEnvironment['space']) ? true : false; - $version_ischeck = version_compare(phpversion(), $lowestEnvironment['version']) < 0 ? false : true; - $pdo_mysql_ischeck = extension_loaded('pdo_mysql'); - if (function_exists('mysql_get_client_info')) { - $mysql = mysql_get_client_info(); - $mysql_ischeck = true; - } elseif (function_exists('mysqli_get_client_info')) { - $mysql = mysqli_get_client_info(); - $mysql_ischeck = true; - } elseif ($pdo_mysql_ischeck) { - $mysql_ischeck = true; - $mysql = 'unknow'; - } else { - $mysql_ischeck = false; - $mysql = 'unknow'; - } - if (function_exists('gd_info')) { - $gdinfo = gd_info(); - $gd = $gdinfo['GD Version']; - $gd_ischeck = version_compare($lowestEnvironment['gd'], $gd) < 0 ? false : true; - } else { - $gd_ischeck = false; - $gd = 'unknow'; - } - return array( - 'gd' => $gd, - 'os' => PHP_OS, - 'json' => function_exists('json_encode'), - 'space' => $space, - 'mysql' => $mysql, - 'upload' => $currentUpload, - 'version' => phpversion(), - 'pdo_mysql' => $pdo_mysql_ischeck, - 'gd_ischeck' => $gd_ischeck, - 'os_ischeck' => true, - 'space_ischeck' => $space_ischeck, - 'mysql_ischeck' => $mysql_ischeck, - 'version_ischeck' => $version_ischeck, - 'upload_ischeck' => $upload_ischeck, - 'pdo_mysql_ischeck' => $pdo_mysql_ischeck, - ); - } - - /** - * 获取推荐的环境配置信息 - * - * @return array - */ - private function _getRecommendEnvironment() { - return array( - 'os' => 'Linux', - 'gd' => '>2.0.28', - 'json' => '支持', - 'mysql' => '>5.x.x', - 'space' => '>50M', - 'upload' => '>2M', - 'version' => '>5.3.x', - 'pdo_mysql' => '支持', - ); - } - - /** - * 获取环境的最低配置要求 - * - * @return array - */ - private function _getLowestEnvironment() { - return array( - 'os' => '不限制', - 'gd' => '2.0', - 'json' => '必须支持', - 'space' => '50M', - 'mysql' => '4.2', - 'upload' => '不限制', - 'version' => '5.3.7', - 'pdo_mysql' => '不限制', - ); - } - - /** - * 检查目录权限 - * - * @return array - */ - private function _checkFileRight() { - - $files_writeble[] = WEBPATH . 'cache/'; - $files_writeble[] = WEBPATH . SYS_UPLOAD_DIR. '/'; - $files_writeble[] = WEBPATH . 'config/site/'; - $files_writeble[] = WEBPATH . 'config/domain.php'; - $files_writeble[] = WEBPATH . 'config/system.php'; - $files_writeble[] = WEBPATH . 'config/database.php'; - - $files_writeble = array_unique($files_writeble); - sort($files_writeble); - $writable = array(); - - foreach ($files_writeble as $file) { - $key = str_replace(WEBPATH, '', $file); - $isWritable = $this->_checkWriteAble($file) ? true : false; - if ($isWritable) { - $flag = false; - foreach ($writable as $k=>$v) { - if (0 === strpos($key, $k)) { - $flag = true; - } - } - $flag || $writable[$key] = $isWritable; - } else { - $writable[$key] = $isWritable; - } - } - return $writable; - } - - /** - * 检查目录可写 - * - * @param string $pathfile - * @return boolean - */ - private function _checkWriteAble($pathfile) { - if (!$pathfile) { - return false; - } - $isDir = in_array(substr($pathfile, -1), array('/', '\\')) ? true : false; - if ($isDir) { - if (is_dir($pathfile)) { - mt_srand((double) microtime() * 1000000); - $pathfile = $pathfile . 'dr_' . uniqid(mt_rand()) . '.tmp'; - } elseif (@mkdir($pathfile)) { - return self::_checkWriteAble($pathfile); - } else { - return false; - } - } - @chmod($pathfile, 0777); - $fp = @fopen($pathfile, 'ab'); - if ($fp === false) { - return false; - } - fclose($fp); - $isDir && @unlink($pathfile); - return true; - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Search.php b/finecms/finecms/dayrui/controllers/Search.php deleted file mode 100644 index ff77910..0000000 --- a/finecms/finecms/dayrui/controllers/Search.php +++ /dev/null @@ -1,62 +0,0 @@ -input->get(NULL, TRUE); - $get = isset($get['rewrite']) ? dr_rewrite_decode($get['rewrite']) : $get; - - $catid = (int)$get['catid']; - $_GET['page'] = $get['page']; - $page = max(1, (int)$_GET['page']); - $get['keyword'] = dr_safe_replace(str_replace(array('%', ' '), array('', '%'), urldecode($get['keyword']))); - unset($get['c'], $get['m'], $get['id'], $get['page']); - if (!$get['mid']) { - $this->msg(fc_lang('缺少mid参数')); - } - - $this->dir = $get['mid']; - $this->_module_init($this->dir); - - $this->load->model('search_model'); - $this->search_model->init($this->dir); - - list($total, $sql) = $this->search_model->get($get, $page); - - $category = $this->get_cache('category-'.SITE_ID); - list($parent, $related) = $this->_related_cat($category, $catid); - - $this->template->assign(dr_search_seo($this->module[$this->dir], $get, $page)); - $this->template->assign(array( - 'mid' => $get['mid'], - 'cat' => $category[$catid], - 'get' => $get, - 'params' => $get, - 'caitd' => $catid, - 'parent' => $parent, - 'related' => $related, - 'keyword' => $get['keyword'], - 'urlrule' => dr_search_url($get, 'page', '{page}'), - 'search_total' => $total, - 'search_sql' => urlencode($sql), - )); - if ($category[$catid]['mid']) { - $this->template->module($category[$catid]['mid']); - } - $this->template->display($catid && $category[$catid]['setting']['template']['search'] ? $category[$catid]['setting']['template']['search'] : 'search.html'); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Show.php b/finecms/finecms/dayrui/controllers/Show.php deleted file mode 100644 index 724221c..0000000 --- a/finecms/finecms/dayrui/controllers/Show.php +++ /dev/null @@ -1,135 +0,0 @@ -input->get('id'); - $page = max(1, (int)$this->input->get('page')); - - $index = $this->db->where('id', $id)->get(SITE_ID.'_index')->row_array(); - if (!$index) { - $this->goto_404_page(fc_lang('无法通过%s找到对应的模型', $id)); - } - // 设置模型信息 - $this->dir = $index['mid']; - if (!$this->dir) { - $this->goto_404_page(fc_lang('此内容mid参数不存在')); - } - - $this->_module_init($this->dir); - $category = $this->get_cache('category-'.SITE_ID); - - // 正式内容缓存查询结果 - $name = 'show'.$this->dir.SITE_ID.$id; - $data = $this->get_cache_data($name); - if (!$data) { - $this->load->model('content_model'); - $data = $this->content_model->get($id); - if (!$data) { - $this->goto_404_page(fc_lang('内容(id#%s)不存在', $id)); - } - // 定向URL - dr_is_redirect(4, $data['url']); - - // 检测转向字段 - $redirect = 0; - foreach ($this->module[$this->dir]['field'] as $t) { - if ($t['fieldtype'] == 'Redirect' - && $data[$t['fieldname']]) { - $this->db->where('id', $id)->set('hits', 'hits+1', FALSE)->update(SITE_ID.'_'.$this->dir); - - redirect($data[$t['fieldname']], 'location', 301); - exit; - } - } - - $data['catid'] = intval($data['catid']); - $cat = $category[$data['catid']]; - - // 处理关键字标签 - $data['tag'] = $data['keywords']; - $data['keyword_list'] = dr_tag_list($data['keywords'], 0); - - // 上一篇文章 - $this->db->where('catid', $data['catid'])->where('status', 9); - $this->db->where('id<', $data['id']); - $this->db->order_by('id desc'); - $data['prev_page'] = $this->db->limit(1)->get($this->content_model->prefix)->row_array(); - - // 下一篇文章 - $this->db->where('catid', $data['catid'])->where('status', 9); - $this->db->where('id>', $data['id']); - $this->db->order_by('id asc'); - $data['next_page'] = $this->db->limit(1)->get($this->content_model->prefix)->row_array(); - - // 缓存数据 - $data['uid'] != $this->uid && $data = $this->set_cache_data($name, $data, SYS_CACHE_MSHOW); - } else { - $cat = $category[$data['catid']]; - } - - // 状态判断 - if ($data['status'] == 10 && !($this->uid == $data['uid'] || $this->member['adminid'])) { - $this->goto_404_page(fc_lang('您暂时无法访问')); - } - - // 驗證url重複 - $murl = ltrim($data['url'], '/'); - $nurl = ltrim($_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF'], '/'); - if (strlen($murl) != strlen($nurl) || $nurl != $murl) { - header('Location: '.SITE_URL.$murl, TRUE, 301); - exit; - } - - // 格式化输出自定义字段 - $fields = $this->module[$this->dir]['field']; - $fields = $cat['field'] ? array_merge($fields, $cat['field']) : $fields; - $fields['inputtime'] = array('fieldtype' => 'Date'); - $fields['updatetime'] = array('fieldtype' => 'Date'); - $data = $this->field_format_value($fields, $data, $page); - - // 判断分页 - if ($page && isset($data['content_page']) - && $data['content_page'] && !$data['content_page'][$page]) { - $this->goto_404_page(fc_lang('该分页不存在')); - } - - // 栏目下级或者同级栏目 - list($parent, $related) = $this->_related_cat($category, $data['catid']); - - $this->template->assign($data); - $this->template->assign(dr_show_seo($data, $page)); - $this->template->assign(array( - 'cat' => $cat, - 'page' => $page, - 'top' => $category[$data['catid']]['topid'] && $category[$category[$data['catid']]['topid']] ? $category[$category[$data['catid']]['topid']] : $cat, - 'parent' => $parent, - 'params' => array('catid' => $data['catid']), - 'related' => $related, - 'urlrule' => dr_show_url( $data, '{page}'), - )); - - if ($cat['mid']) { - $this->template->module($cat['mid']); - } - - $tpl = isset($data['template']) && strpos($data['template'], '.html') !== FALSE ? $data['template'] : ($cat['setting']['template']['show'] ? $cat['setting']['template']['show'] : 'show.html'); - - $this->template->display($tpl); - - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Tag.php b/finecms/finecms/dayrui/controllers/Tag.php deleted file mode 100644 index 5e1d2c4..0000000 --- a/finecms/finecms/dayrui/controllers/Tag.php +++ /dev/null @@ -1,81 +0,0 @@ -input->get('name'))); - !$tag && exit($this->goto_404_page(fc_lang('Tag参数不存在'))); - - $name = 'tags_'.SITE_ID.'-'.$tag; - list($data, $parent, $related) = $this->get_cache_data($name); - if (!$data) { - $rule = $this->get_cache('urlrule', (int)SITE_REWRITE, 'value');; - $join = $rule['catjoin'] ? $rule['catjoin'] : '/'; - $tag = @end(@explode($join, $tag)); // 转换tag值 - $cache = $this->get_cache('tags-'.SITE_ID); - if ($cache[$tag]) { - $data = $this->_tag_row($cache[$tag]['id']); - // 格式化显示 - //$data = format_value(\Php7cms\Service::L('cache')->get('tag-'.SITE_ID.'-field'), $data); - $parent = $related = array(); - // 是否存在子tag - if ($cache[$tag]['codes']) { - $parent = array(); - $related[$tag] = $cache[$tag]; - foreach ($cache[$tag]['codes'] as $t) { - $related[$t] = $cache[$t]; - } - } elseif ($cache[$tag]['pid'] && $cache[$cache[$tag]['pid']]) { - // 本身就是子词 - $parent = $cache[$cache[$tag]['pid']]; - $related[$cache[$tag]['pid']] = $cache[$cache[$tag]['pid']]; - foreach ($cache[$cache[$tag]['pid']]['codes'] as $t) { - $related[$t] = $cache[$t]; - } - } - // 合并缓存数据 - $data['tags'] = $cache[$tag]['tags']; - $this->set_cache_data($name, array($data, $parent, $related), SYS_CACHE_TAG); - } - } - - !$data && $data = array('code' => $tag, 'name' => $tag, 'tags' => $tag); - - $this->template->assign(array( - 'tag' => $data, - 'parent' => $parent, - 'related' => $related, - 'meta_title' => $data['name'].SITE_SEOJOIN.SITE_TITLE, - 'meta_keywords' => SITE_KEYWORDS, - 'meta_description' => SITE_DESCRIPTION, - )); - $this->template->display('tag.html'); - - } - - - - // 通过关键字获取tag - private function _tag_row($id) { - - // 首先查询 - $data = $this->db->where('id', (int)$id)->get(SITE_ID.'_tag')->row_array(); - - $data && $this->db->where('id', (int)$id)->set('hits', intval($data['hits'])+1)->update(SITE_ID.'_tag'); - - return $data; - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/Weixin.php b/finecms/finecms/dayrui/controllers/Weixin.php deleted file mode 100644 index 7b8e6bd..0000000 --- a/finecms/finecms/dayrui/controllers/Weixin.php +++ /dev/null @@ -1,352 +0,0 @@ -output->enable_profiler(FALSE); - $this->load->model('weixin_model'); - $this->wx = $this->get_cache('weixin-'.SITE_ID); - } - - /** - * 微信交互控制器 - */ - public function index() { - - // 删除微信传递的token干扰 - unset ( $_REQUEST ['token'] ); - - $token = $this->wx['config']['token']; - $nonce = $this->input->get('nonce'); - $signature = $this->input->get('signature'); - $timestamp = $this->input->get('timestamp'); - - // 处理参数 - $tmp_arr = array($token, $timestamp, $nonce); - sort($tmp_arr); - $tmp_str = implode($tmp_arr); - $tmp_str = sha1($tmp_str); - - if ($tmp_str == $signature) { - // 判读是不是只是验证 - $echostr = $this->input->get('echostr', true); - if (!empty($echostr)) { - echo $echostr;exit; - } else { - // 实际处理用户消息 - $content = file_get_contents('php://input'); - //file_put_contents(FCPATH."wx.txt", var_export($content, true)); - if ($content) { - // 解析微信传过来的 XML 内容 转化为数组 - $this->data = dr_object2array(simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA)); - $this->token = $this->data['ToUserName']; - // 初始化用户 将其加入到粉丝组里面 - $this->_init_user(); - // 回复数 据 - //file_put_contents(FCPATH."wx.txt", var_export($data, true)); - } - } - } - exit; - } - - - // 会员绑定与注册 - public function member() { - - $app = $this->input->get('state'); - $code = $this->input->get('code'); - $data = json_decode(dr_catcher_data('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->wx['config']['key'].'&secret='.$this->wx['config']['secret'].'&code='.$code.'&grant_type=authorization_code'), true); - if (isset($data['errcode']) && $data['errcode']) { - $this->admin_msg('错误代码:'.$data['errcode']); - } - - $plug_url = $app; // 返回插件的地址 - - $MEMBER = $this->get_cache('member'); - - $user = $this->weixin_model->get_user_info($data['openid']); - - if ($user['uid'] && $this->member_model->get_base_member($user['uid'])) { - // 已绑定 - $member = $this->db->select('password,username,salt,uid')->where('uid', $user['uid'])->get('member')->row_array(); - $this->db->where('id', $user['id'])->update($this->weixin_model->prefix.'_user', array( - 'uid' => $member['uid'], - 'username' => $member['username'], - )); - $synlogin = ''; - $code = dr_authcode($member['uid'].'-'.$member['salt'], 'ENCODE'); - $synlogin = ''; - - $this->template->assign(array( - 'type' => 0, - 'user' => $user, - 'login' => $synlogin, - 'plug_url' => $plug_url, - 'meta_title' => '授权成功', - )); - $this->template->display('weixin.html'); - } else { - // 未绑定 - $this->template->assign(array( - 'app' => $app, - 'type' => 1, - 'user' => $user, - 'code' => dr_authcode($data['openid'], 'ENCODE'), - 'regfield' => $MEMBER['setting']['regfield'], - 'plug_url' => $plug_url, - 'meta_title' => '账号授权', - )); - $this->template->display('weixin.html'); - } - } - - // 绑定情况判断 - public function ajax_member() { - - $openid = dr_authcode($this->input->post('code'), 'DECODE'); - if (!$openid) { - exit(dr_json(0, '解码失败,请重试')); - } - - $user = $this->weixin_model->get_user_info($openid); - if (!$user) { - exit(dr_json(0, 'openid获取失败,请重试')); - } elseif ($user['uid']) { - exit(dr_json(0, '会员已经注册或者绑定,无需重复操作')); - } - - // 接收数据 - $data = $this->input->post('data'); - $type = $this->input->post('type'); - - if ($type == 1) { - // 登录 - $rt = $this->member_model->login($data['username'], $data['password'], 36000); - if (strlen($rt) > 3) { - // 登录成功 - if (!$this->uid) { - exit(dr_json(0, '绑定失败,请重试')); - } - // 绑定到此账号 - $user['uid'] = $this->uid; - $this->db->where('id', $user['id'])->update($this->weixin_model->prefix.'_user', array( - 'uid' => $user['uid'], - 'username' => $data['username'], - )); - $this->hooks->call_hook('member_login', $data); // 登录成功挂钩点 - exit(dr_json(1, '绑定成功'.$rt)); - } elseif ($rt == -1) { - $error1 = fc_lang('会员不存在'); - } elseif ($rt == -2) { - $error1 = fc_lang('密码不正确'); - } elseif ($rt == -3) { - $error1 = fc_lang('Ucenter注册失败'); - } elseif ($rt == -4) { - $error1 = fc_lang('Ucenter:会员名称不合法'); - } - exit(dr_json(0, $error1)); - } else { - // 注册 - $id = $this->member_model->register($data); - if ($id > 0) { - // 注册成功 - $data['uid'] = $this->uid; - $this->hooks->call_hook('member_register_after', $data); // 注册之后挂钩点 - // 注册后的登录 - $rt = $this->member_model->login($id, $data['password'], 86400, 0, 1); - // 绑定到此账号 - $user['uid'] = $id; - $this->db->where('id', $user['id'])->update($this->weixin_model->prefix.'_user', array( - 'uid' => $user['uid'], - 'username' => $data['username'], - )); - // 更新头像 - $dir = SYS_UPLOAD_PATH.'/member/'.$id.'/'; - !is_dir($dir) && dr_mkdirs($dir); - $avatar = dr_catcher_data($user['headimgurl']); - foreach (array(30, 45, 90, 180) as $a) { - $file = $dir.$a.'x'.$a.'.jpg'; - file_put_contents($file, $avatar); - } - // 成功提示 - exit(dr_json(1, '注册成功'.$rt)); - } elseif ($id == -1) { - $error = array('name' => 'username', 'msg' => fc_lang('该会员【%s】已经被注册', $data['username'])); - } elseif ($id == -2) { - $error = array('name' => 'email', 'msg' => fc_lang('邮箱格式不正确')); - } elseif ($id == -3) { - $error = array('name' => 'email', 'msg' => fc_lang('该邮箱【%s】已经被注册', $data['email'])); - } elseif ($id == -4) { - $error = array('name' => 'username', 'msg' => fc_lang('同一IP在限制时间内注册过多')); - } elseif ($id == -10) { - $error = array('name' => 'phone', 'msg' => fc_lang('手机号码必须是11位的整数')); - } elseif ($id == -11) { - $error = array('name' => 'phone', 'msg' => fc_lang('该手机号码已经注册')); - } - exit(dr_json(0, $error['msg'])); - } - } - - public function sync() { - - $url = urldecode($this->input->get('url')); - if ($this->uid) { - // 定向URL - redirect($url, 'refresh'); - exit; - } else { - // 授权信息 - $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->wx['config']['key'].'&redirect_uri='.urlencode(SITE_URL.'index.php?c=weixin&m=member').'&response_type=code&scope=snsapi_base&state='.urlencode($url).'#wechat_redirect'; - redirect($url, 'refresh'); - exit; - } - - - } - - - // 初始化用户情况 - private function _init_user() { - - $user = $this->weixin_model->get_user_info($this->data['FromUserName']); - if (!$user) { - // 入库粉丝表 - $user = json_decode(@dr_catcher_data('https://api.weixin.qq.com/cgi-bin/user/info?access_token='.dr_get_access_token().'&openid='.$this->data['FromUserName']), true); - if (isset($rs['errcode'])) { - return; - } - $user['id'] = $this->weixin_model->add_user($user); - $user['uid'] = 0; // 加入粉丝表中 - } - // 当用户没有绑定会员的情况时 - if (!$user['uid']) { - // 先判断这个微信是否使用过快捷登录 - $oauth = $this->db->where('oauth', 'weixin')->where('oid', $user['openid'])->get('member_oauth')->row_array(); - if (!$oauth) { - if ($this->wx['config']['user_type']) { - // 将微信号自动注册本站会员 - $uid = $this->member_model->_register(array( - 'nickname' => preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', dr_deal_emoji($user['nickname'])), // 处理昵称字符 - 'avatar' => $user['headimgurl'], - ), 'weixin'); - $this->db->where('id', $user['id'])->update($this->weixin_model->prefix.'_user', array( - 'uid' => $uid, - )); - } elseif ($this->wx['config']['is_tuser']) { - // 提醒用户绑定会员 - $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$this->wx['config']['key'].'&redirect_uri='.urlencode(SITE_URL.'index.php?c=weixin&m=member').'&response_type=code&scope=snsapi_base&state=member#wechat_redirect'; - $txt = $this->wx['config']['txt_tuser'] ? $this->wx['config']['txt_tuser'] : '您好,您还没有绑定会员呢,点我赶紧绑定吧'; - $this->replyText(''.$txt.''); - return; - } - } else { - $user = $oauth; - } - } - - // 存储cookie - $this->uid = $user['uid']; - $this->member = $this->member_model->get_member($this->uid); - $this->db->where('id', $user['id'])->update($this->weixin_model->prefix.'_user', array( - 'uid' => $this->member['uid'], - 'username' => $this->member['username'], - )); - $this->input->set_cookie('weixin_uid', $this->member['uid'], 86400); - $this->input->set_cookie('member_uid', $this->member['uid'], 86400); - $this->input->set_cookie('member_cookie', substr(md5(SYS_KEY.$this->member['password']), 5, 20), 86400); - - return $this->uid; - } - - - - /* ========================发送被动响应消息 begin================================== */ - /* 回复文本消息 */ - private function replyText($content) { - $msg ['Content'] = $content; - $this->_replyData ( $msg, 'text' ); - } - /* 回复图片消息 */ - private function replyImage($media_id) { - $msg ['Image'] ['MediaId'] = $media_id; - $this->_replyData ( $msg, 'image' ); - } - /* 回复语音消息 */ - private function replyVoice($media_id) { - $msg ['Voice'] ['MediaId'] = $media_id; - $this->_replyData ( $msg, 'voice' ); - } - /* 回复视频消息 */ - private function replyVideo($media_id, $title = '', $description = '') { - $msg ['Video'] ['MediaId'] = $media_id; - $msg ['Video'] ['Title'] = $title; - $msg ['Video'] ['Description'] = $description; - $this->_replyData ( $msg, 'video' ); - } - /* 回复音乐消息 */ - private function replyMusic($media_id, $title = '', $description = '', $music_url, $HQ_music_url) { - $msg ['Music'] ['ThumbMediaId'] = $media_id; - $msg ['Music'] ['Title'] = $title; - $msg ['Music'] ['Description'] = $description; - $msg ['Music'] ['MusicURL'] = $music_url; - $msg ['Music'] ['HQMusicUrl'] = $HQ_music_url; - $this->_replyData ( $msg, 'music' ); - } - /* - * 回复图文消息 articles array 格式如下: array( array('Title'=>'','Description'=>'','PicUrl'=>'','Url'=>''), array('Title'=>'','Description'=>'','PicUrl'=>'','Url'=>'') ); - */ - private function replyNews($articles) { - $msg ['ArticleCount'] = count ( $articles ); - $msg ['Articles'] = $articles; - - $this->_replyData ( $msg, 'news' ); - } - /* 发送回复消息到微信平台 */ - private function _replyData($msg, $msgType) { - $msg ['ToUserName'] = $this->data['FromUserName']; - $msg ['FromUserName'] = $this->data['ToUserName']; - $msg ['CreateTime'] = SYS_TIME; - $msg ['MsgType'] = $msgType; - - $xml = new SimpleXMLElement ( '' ); - $this->_data2xml ( $xml, $msg ); - $str = $xml->asXML (); - - echo ($str);exit; - } - /* 组装xml数据 */ - public function _data2xml($xml, $data, $item = 'item') { - foreach ( $data as $key => $value ) { - is_numeric ( $key ) && ($key = $item); - if (is_array ( $value ) || is_object ( $value )) { - $child = $xml->addChild ( $key ); - $this->_data2xml ( $child, $value, $item ); - } else { - if (is_numeric ( $value )) { - $child = $xml->addChild ( $key, $value ); - } else { - $child = $xml->addChild ( $key ); - $node = dom_import_simplexml ( $child ); - $node->appendChild ( $node->ownerDocument->createCDATASection ( $value ) ); - } - } - } - } - /* ========================发送被动响应消息 end================================== */ - -} - diff --git a/finecms/finecms/dayrui/controllers/admin/Api.php b/finecms/finecms/dayrui/controllers/admin/Api.php deleted file mode 100644 index 7354477..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Api.php +++ /dev/null @@ -1,137 +0,0 @@ -input->get('v'))); - $arr = parse_url($url); - $queryParts = explode('&', $arr['query']); - $params = array(); - foreach ($queryParts as $param) { - $item = explode('=', $param); - $params[$item[0]] = $item[1]; - } - // 基础uri - $uri = ($params['s'] ? $params['s'].'/' : '').'admin/'.($params['c'] ? $params['c'] : 'home').'/'.($params['m'] ? $params['m'] : 'index'); - // 查询名称 - $menu = $this->db->select('name')->like('uri', $uri)->get('admin_menu')->row_array(); - $name = $menu ? $menu['name'] : '未知名称'; - // 替换URL - - $admin = $this->db->where('uid', $this->uid)->get('admin')->row_array(); - if ($admin) { - $menu = dr_string2array($admin['usermenu']); - foreach ($menu as $t) { - $t['url'] == $url && exit('已经存在'); - } - $menu[] = array( - 'name' => $name, - 'url' => $url, - ); - $this->db->where('uid', $this->uid)->update( - 'admin', array( - 'usermenu' => dr_array2string($menu) - ) - ); - exit(); - } - exit('稍后再试'); - - } - - - /** - * ajax文件上传 - * - * @return void - */ - public function ajax_upload() { - - - } - - - /** - * 文件上传 - * - * @return void - */ - public function upload() { - $ext = 'jpg,gif,png,js,css,html'; - $this->template->assign(array( - 'ext' => str_replace(',', '|', $ext), - 'page' => 0, - 'size' => 1024 * 1024, - 'path' => $this->input->get('path'), - 'types' => '*.'.str_replace(',', ';*.', $ext), - 'fcount' => 50, - 'is_admin' => 1, - )); - $this->template->display('upload.html'); - } - - /** - * 文件上传处理 - * - * @return void - */ - public function swfupload() { - - if (IS_POST) { - $ext = 'jpg,gif,png,js,css,html'; - $path = $this->input->post('path'); - !is_dir($path) && exit('0,目录('.$path.')不存在'); - $this->load->library('upload', array( - 'max_size' => 1024 * 1024, - 'overwrite' => TRUE, - 'file_name' => '', - 'upload_path' => $path, - 'allowed_types' => str_replace(',', '|', $ext), - 'file_ext_tolower' => TRUE, - )); - if ($this->upload->do_upload('Filedata')) { - $info = $this->upload->data(); - $_ext = str_replace('.', '', $info['file_ext']); - $file = str_replace(WEBPATH, '', $info['full_path']); - !is_file(WEBPATH.$file) && $file = THEME_PATH.'admin/images/ext/blank.gif'; - $icon = is_file(THEME_PATH.'admin/images/ext/'.$_ext.'.gif') ? THEME_PATH.'admin/images/ext/'.$_ext.'.gif' : THEME_PATH.'admin/images/ext/blank.gif'; - //唯一ID,文件全路径,图标,文件名称,文件大小,扩展名 - exit('1,'.$file.','.$icon.','.str_replace(array('|', '.'.$_ext), '', $info['client_name']).','.dr_format_file_size($info['file_size'] * 1024).','.$_ext); - } else { - exit('0,'.$this->upload->display_errors('', '')); - } - } - } - - /** - * 查看资料 - */ - public function member() { - - $uid = str_replace('author_', '', $this->input->get('uid')); - ($uid == 'guest' || !$uid) && exit('
    '.fc_lang('游客').'
    '); - - $data = is_numeric($uid) ? $this->db->where('uid', (int)$uid)->limit(1)->get('member')->row_array() : $this->db->where('username', $uid)->limit(1)->get('member')->row_array(); - - !$data && exit('(#'.$uid.')'.fc_lang('对不起,该会员不存在!')); - - $this->load->library('dip'); - $data['address'] = $this->dip->address($data['regip']); - - $this->template->assign(array( - 'data' => $data, - )); - $this->template->display('member.html'); - } - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Attachment.php b/finecms/finecms/dayrui/controllers/admin/Attachment.php deleted file mode 100644 index 19fcce3..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Attachment.php +++ /dev/null @@ -1,137 +0,0 @@ - array('admin/attachment/index', 'folder'), - ); - defined('SYS_ATTACHMENT_DB') && (int)SYS_ATTACHMENT_DB && $menu[fc_lang('未使用的附件')] = array('admin/attachment/unused', 'folder-o'); - $this->template->assign('menu', $this->get_menu_v3($menu)); - $this->cache_file = md5('admin/attachment'.$this->uid.SITE_ID.$this->input->ip_address().$this->input->user_agent()); // 缓存文件名称 - $this->load->model('attachment_model'); - } - - /** - * 搜索 - */ - public function index() { - - $error = 0; - - if (IS_POST) { - $data = $this->input->post('data'); - $data['id'] = (int)$data['id']; - if (!$data['author'] && !$data['ext']) { - $error = fc_lang('必须填写其中一项搜索条件'); - } else { - $where = array(); - - if ($data['author']) { - $uid = get_member_id($data['author']); - if ($uid) { - $where[] = '`uid`='.$uid; - } else { - $error = fc_lang('会员不存在'); - $where = NULL; - } - } - if (!$error && $data['ext']) { - $ext = explode(',', $data['ext']); - $_ext = array(); - foreach ($ext as $t) { - $_ext[] = '`fileext`="'.$t.'"'; - } - $where[] = '('.implode(' OR ', $_ext).')'; - } - if ($where) { - $where = implode(' AND ', $where); - $attach = $this->db->select('id')->where($where)->get('attachment')->result_array(); - if ($attach) { - $cache = array(); - foreach ($attach as $t) { - $cache[] = (int)$t['id']; - } - $this->cache->file->save($this->cache_file, $cache, 7200); - $this->admin_msg(fc_lang('正在搜索中,请稍后...'), dr_url('attachment/result'), 2, 3); - } - } - $error = fc_lang('没有搜索到相关附件,请检查搜索条件'); - } - $data['id'] = $data['id'] ? $data['id'] : ''; - } - - $this->template->assign(array( - 'data' => $data, - 'error' => $error, - )); - $this->template->display('attachment_index.html'); - } - - /** - * 搜索结果 - */ - public function result() { - - if ($this->input->post('ids')) { - $ids = $this->input->post('ids'); - $data = $this->db->where_in('id', $ids)->get('attachment')->result_array(); - if ($data) { - foreach ($data as $t) { - $this->db->delete('attachment', 'id='.$t['id']); - $this->attachment_model->_delete_attachment($t); - $this->system_log('删除附件【#'.$t['id'].'】'); // 记录日志 - } - } - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - $cache = $this->cache->file->get($this->cache_file); - $total = count($cache); - if (!$total) { - $this->admin_msg(fc_lang('搜索缓存已过期,请重新搜索')); - } - - $page = max((int)$this->input->get('page'), 1); - $data = $this->db - ->select('id,tableid') - ->where_in('id', $cache) - ->order_by('id desc') - ->limit(SITE_ADMIN_PAGESIZE, SITE_ADMIN_PAGESIZE * ($page - 1)) - ->get('attachment') - ->result_array(); - $result = array(); - foreach ($data as $i => $t) { - $row = $this->db->where('id', (int)$t['id'])->get('attachment_'.(int)$t['tableid'])->row_array(); - if ($row) { - $result[$i] = $row; - } - } - - $this->template->assign('menu', $this->get_menu_v3(array( - fc_lang('搜索') => array('admin/attachment/index', 'search'), - fc_lang('附件管理') => array('admin/attachment/result', 'folder'), - ))); - $this->template->assign(array( - 'list' => $result, - 'pages' => $this->get_pagination(dr_url(APP_DIR.'/attachment/result'), $total), - 'totals' => $total, - )); - $this->template->display('attachment_result.html'); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Block.php b/finecms/finecms/dayrui/controllers/admin/Block.php deleted file mode 100644 index 4f91e95..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Block.php +++ /dev/null @@ -1,221 +0,0 @@ -tablename = $this->db->dbprefix(SITE_ID.'_block'); - $this->field = array( - 'name' => array( - 'ismain' => 1, - 'fieldname' => 'name', - 'fieldtype' => 'Text', - 'setting' => array( - 'option' => array( - 'width' => 200, - ), - 'validate' => array( - 'required' => 1, - ) - ) - ), - 'value_1' => array( - 'ismain' => 1, - 'fieldname' => 'value_1', - 'fieldtype' => 'Textarea', - 'setting' => array( - 'option' => array( - 'width' => '90%', - 'height' => 250, - ), - 'validate' => array( - 'xss' => 1, - ) - ) - ), - 'value_2' => array( - 'ismain' => 1, - 'fieldtype' => 'Ueditor', - 'fieldname' => 'value_2', - 'setting' => array( - 'option' => array( - 'mode' => 1, - 'height' => 300, - 'width' => '100%' - ) - ) - ), - 'value_3' => array( - 'ismain' => 1, - 'fieldtype' => 'File', - 'fieldname' => 'value_3', - 'setting' => array( - 'option' => array( - 'ext' => '*', - 'size' => 99999, - ) - ) - ), - 'value_4' => array( - 'ismain' => 1, - 'fieldtype' => 'Files', - 'fieldname' => 'value_4', - 'setting' => array( - 'option' => array( - 'ext' => '*', - 'size' => 99999, - 'count' => 99999, - ) - ) - ), - ); - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('自定义内容') => array('admin/block/index', 'file'), - fc_lang('添加') => array('admin/block/add', 'plus'), - )), - 'type' => array( - '1' => fc_lang('纯文本'), - '2' => fc_lang('富文本'), - '3' => fc_lang('单文件'), - '4' => fc_lang('多文件'), - ) - )); - } - - /** - * 管理 - */ - public function index() { - - if (IS_POST) { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - $this->db->where_in('id', $ids)->delete($this->tablename); - $this->system_log('删除自定义页面【#'.@implode(',', $ids).'】'); // 记录日志 - $this->cache(1); - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - $this->template->assign('list', $this->db->get($this->tablename)->result_array()); - $this->template->display('block_index.html'); - } - - /** - * 添加 - */ - public function add() { - - if (IS_POST) { - $post = $this->validate_filter($this->field); - // 格式化内容 - $data = array( - 'name' => $post[1]['name'] ? $post[1]['name'] : fc_lang('未命名'), - ); - switch (intval($_POST['type'])) { - case 1: - // 文本内容 - $data['content'] = $post[1]['value_1'] ? $post[1]['value_1'] : ''; - break; - case 2: - // 丰富文本 - $data['content'] = '{i-2}:'.($post[1]['value_2'] ? $post[1]['value_2'] : ''); - break; - case 3: - // 单文件 - $data['content'] = '{i-3}:'.($post[1]['value_3'] ? $post[1]['value_3'] : ''); - break; - case 4: - // 多文件 - $data['content'] = '{i-4}:'.($post[1]['value_4'] ? dr_array2string($post[1]['value_4']) : ''); - break; - } - $this->db->insert($this->tablename, $data); - $id = $this->db->insert_id(); - $this->attachment_handle($this->uid, $this->tablename.'-'.$id, $this->field); - $this->cache(1); - $this->system_log('添加自定义页面【'.$data['name'].'#'.$id.'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('block/index'), 1); - } - - $this->template->assign(array( - 'field' => $this->field, - )); - $this->template->display('block_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->db->where('id', $id)->limit(1)->get($this->tablename)->row_array(); - !$data && $this->admin_msg(fc_lang('数据不存在')); - - $data = dr_get_block_value($data); - - if (IS_POST) { - $post = $this->validate_filter($this->field); - // 格式化内容 - $data = array( - 'name' => $post[1]['name'] ? $post[1]['name'] : fc_lang('未命名'), - ); - switch (intval($_POST['type'])) { - case 1: - // 文本内容 - $data['content'] = $post[1]['value_1'] ? $post[1]['value_1'] : ''; - break; - case 2: - // 丰富文本 - $data['content'] = '{i-2}:'.($post[1]['value_2'] ? $post[1]['value_2'] : ''); - break; - case 3: - // 单文件 - $data['content'] = '{i-3}:'.($post[1]['value_3'] ? $post[1]['value_3'] : ''); - break; - case 4: - // 多文件 - $data['content'] = '{i-4}:'.($post[1]['value_4'] ? dr_array2string($post[1]['value_4']) : ''); - break; - } - $this->db->where('id',(int)$id)->update($this->tablename, $data); - $this->attachment_handle($this->uid, $this->tablename.'-'.$id, $this->field, $post); - $this->cache(1); - $this->system_log('修改自定义页面【'.$data['name'].'#'.$id.'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('block/index'), 1); - } - - $this->template->assign(array( - 'i' => $data['i'], - 'data' => $data, - 'field' => $this->field, - )); - $this->template->display('block_add.html'); - } - - /** - * 缓存 - */ - public function cache($update = 0) { - $this->system_model->block(isset($_GET['site']) && $_GET['site'] ? (int)$_GET['site'] : SITE_ID); - ((int)$_GET['admin'] || $update) or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Category.php b/finecms/finecms/dayrui/controllers/admin/Category.php deleted file mode 100644 index 76d1974..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Category.php +++ /dev/null @@ -1,464 +0,0 @@ -template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('栏目管理') => array('admin/category/index', 'list-ul'), - fc_lang('自定义字段') => array('admin/field/index/rname/category-share/rid/0', 'plus-square'), - fc_lang('自定义URL') => array('admin/category/url', 'link'), - fc_lang('添加') => array('admin/category/add', 'plus'), - )), - 'module' => $this->get_module(), - )); - $this->thumb = array( - 'thumb' => array( - 'name' => fc_lang('缩略图'), - 'ismain' => 1, - 'fieldtype' => 'File', - 'fieldname' => 'thumb', - 'setting' => array( - 'option' => array( - 'ext' => 'jpg,gif,png', - 'size' => 10, - ) - ) - ) - ); - $this->content = array( - 'content' => array( - 'name' => fc_lang('单网页内容'), - 'ismain' => 1, - 'fieldtype' => 'Ueditor', - 'fieldname' => 'content', - 'setting' => array( - 'option' => array( - 'mode' => 1, - 'height' => 300, - 'width' => '100%' - ) - ) - ) - ); - $this->field = array(); - $field = $this->db - ->where('disabled', 0) - ->where('relatedid', 0) - ->where('relatedname', 'category-share') - ->order_by('displayorder ASC, id ASC') - ->get('field') - ->result_array(); - if ($field) { - foreach ($field as $t) { - $t['setting'] = dr_string2array($t['setting']); - $this->field[$t['fieldname']] = $t; - } - unset($field); - } - $this->load->model('category_model'); - } - - public function delete($ids) { - - if (!$ids) { - return NULL; - } - - $catid = ''; - $category = $this->get_cache('category-'.SITE_ID); - foreach ($ids as $id) { - $catid.= ','.($category[$id]['childids'] ? $category[$id]['childids'] : $id); - } - - $catid = explode(',', trim($catid, ',')); - $catid = array_flip(array_flip($catid)); - $data = $this->db->where_in('catid', $catid)->get(SITE_ID.'_index')->result_array(); - if ($data) { - foreach ($data as $t) { - $this->load->model('content_model'); - $this->content_model->mdir = $t['mid']; - $this->content_model->prefix = $this->db->dbprefix(SITE_ID.'_'.$t['mid']); - $this->content_model->delete_for_id((int)$t['id']); - } - } - $this->db->where_in('id', $catid)->delete($this->category_model->tablename); - } - - - public function index() { - - if (IS_POST) { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - if ($this->input->post('action') == 'order') { - $data = $this->input->post('data'); - foreach ($ids as $id) { - $this->db->where('id', $id)->update($this->category_model->tablename, $data[$id]); - } - $this->clear_cache('module'); - $this->system_log('排序站点【#'.SITE_ID.'】栏目【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功'))); - } else { - if (!$this->is_auth('admin/category/index')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - $this->delete($ids); - $this->system_log('删除站点【#'.SITE_ID.'】栏目【#'.@implode(',', $ids).'】'); // 记录日志 - $this->clear_cache('module'); - exit(dr_json(1, fc_lang('操作成功'))); - - } - } - - $this->load->library('dtree'); - $this->category_model->repair(); - $this->dtree->icon = array('   │ ','   ├─ ','   └─ '); - $this->dtree->nbsp = '   '; - $tree = array(); - $data = $this->category_model->get_data(); - if ($data) { - $tree = $this->_get_tree($data); - } - $str = ""; - $str.= ""; - $str.= ""; - $str.= "\$id"; - $str.= "\$spacer\$name \$parent"; - $str.= "\$dirname"; - $str.= "\$type"; - $str.= "\$mid"; - $str.= "\$option"; - $str.= ""; - $this->dtree->init($tree); - - $this->template->assign(array( - 'page' => (int)$this->input->get('page'), - 'list' => $this->dtree->get_tree(0, $str), - )); - $this->template->display('category_index.html'); - } - - public function add() { - - $id = (int)$this->input->get('id'); - $data = array('pid' => $id); - $result = ''; - - // 初始化配置信息 - if ($id){ - $parent = $this->category_model->get($id); - $data['tid'] = $parent['tid']; - $data['mid'] = $parent['mid']; - $data['setting'] = $parent['setting']; - unset($parent); - } else { - $data['setting']['template']['list'] = 'list.html'; - $data['setting']['template']['show'] = 'show.html'; - $data['setting']['template']['extend'] = 'extend.html'; - $data['setting']['template']['category'] = 'category.html'; - $data['setting']['template']['search'] = 'search.html'; - $data['setting']['template']['page'] = 'page.html'; - $data['setting']['template']['pagesize'] = 20; - $data['setting']['seo']['list_title'] = '[第{page}页{join}]{name}{join}{SITE_NAME}'; - $data['setting']['seo']['show_title'] = '[第{page}页{join}]{title}{join}{catname}{join}{SITE_NAME}'; - $data['setting']['seo']['extend_title'] = '{extend}{join}{title}{join}{catname}{join}{SITE_NAME}'; - } - - if (IS_POST) { - $field = $this->field ? array_merge($this->field, $this->thumb, $this->content) : array_merge($this->thumb, $this->content); - $data = $this->input->post('data', TRUE); - $backurl = $this->input->post('backurl'); - $tmp = $this->validate_filter($field); - if ($tmp) { - if (isset($tmp['error'])) { - $this->admin_msg($tmp['msg']); - } else { - // 删除老数据 - foreach ($field as $i => $t) { - unset($data[$i]); - } - // 归类新数据 - foreach ($tmp[1] as $i => $t) { - if (isset($field[$i]) - || strpos($i, '_lng') - || strpos($i, '_lat')) { - $data[$i] = $t; - } - } - } - } - if ($this->input->post('_all') == 1) { - $names = $this->input->post('names', TRUE); - $number = $this->category_model->add_all($names, $data, $field); - $this->system_log('批量添加站点【#'.SITE_ID.'】栏目【'.$number.'个】'); // 记录日志 - //$this->clear_cache('module'); - $this->admin_msg(fc_lang('批量添加栏目%s个', $number), dr_url('category/index'), 1); - } else { - $result = $this->category_model->add($data, $field); - if (is_numeric($result)) { - $this->clear_cache('module'); - $this->system_log('添加站点【#'.SITE_ID.'】栏目【#'.$result.'】'); // 记录日志 - $this->attachment_handle($this->uid, $this->category_model->tablename.'-'.$result, $field); - $this->admin_msg(fc_lang('操作成功'), $backurl, 1, 2); - } - } - } - - $this->template->assign(array( - 'id' => $id, - 'page' => 0, - 'data' => $data, - 'role' => $this->dcache->get('role'), - 'content' => $this->field_input($this->content, $data, TRUE), - 'thumb' => $this->field_input($this->thumb, $data, TRUE), - 'field' => $this->field_input($this->field, $data, TRUE), - 'result' => $result, - 'select' => $this->select_category($this->category_model->get_data(), $id, 'name=\'data[pid]\'', fc_lang('顶级栏目')), - 'backurl' => $backurl ? $backurl : $_SERVER['HTTP_REFERER'], - )); - $this->template->display('category_add.html'); - } - - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->category_model->get($id); - $page = (int)$this->input->get('page'); - $result = ''; - !$data && $this->admin_msg(fc_lang('栏目不存在')); - - if (IS_POST) { - $field = $this->field ? array_merge($this->field, $this->thumb, $this->content) : array_merge($this->thumb, $this->content); - $_data = $data; - $page = (int)$this->input->post('page'); - $data = $this->input->post('data', TRUE); - $tmp = $this->validate_filter($field); - if ($tmp) { - if (isset($tmp['error'])) { - $this->admin_msg($tmp['msg']); - } else { - // 删除老数据 - foreach ($field as $i => $t) { - unset($data[$i]); - } - // 归类新数据 - foreach ($tmp[1] as $i => $t) { - if (isset($field[$i]) - || strpos($i, '_lng') - || strpos($i, '_lat')) { - $data[$i] = $t; - } - } - } - } - $data['pid'] = $data['pid'] == $id ? $_data['pid'] : $data['pid']; - $data['rule'] = $this->input->post('rule'); - $result = $this->category_model->edit($id, $data, $_data, $field); - if ($result) { - $this->admin_msg($result); - } - $this->category_model->syn($data, $_data); - $data['id'] = $id; - $data['permission'] = $data['rule']; - $this->attachment_handle($this->uid, $this->category_model->tablename.'-'.$id, $field, $_data); - //$this->clear_cache('module'); - $this->system_log('修改站点【#'.SITE_ID.'】栏目【#'.$id.'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功'), $_SERVER['HTTP_REFERER'] ? $_SERVER['HTTP_REFERER'] : dr_url('category/edit', array('id' => $id)), 1, 2); - } - - $category = $this->category_model->get_data(); - $this->template->assign(array( - 'id' => $id, - 'page' => $page, - 'data' => $data, - 'content' => $this->field_input($this->content, $data, TRUE), - 'thumb' => $this->new_field_input($this->thumb, $data, TRUE), - 'field' => $this->new_field_input($this->field, $data, TRUE), - 'result' => $result, - 'select' => $this->select_category($category, $data['pid'], ' class=\'form-control\' name=\'data[pid]\'', fc_lang('顶级栏目')), - 'select_syn' => $this->select_category($category, 0, ' class=\'form-control\' id="dr_synid" name=\'synid[]\' multiple style="min-width:150px;height:200px;"', '') - )); - $this->template->display('category_add.html'); - } - - public function select() { - $id = (int)$this->input->get('id'); - echo $this->select_category($this->category_model->get_data(), $id, ( $id ? 'disabled ' : '').' class=\'form-control\' name=\'module[catid]\' onChange=\'dr_select_category(this.value)\'', fc_lang('全部栏目')); - } - - public function cache() { - $this->category_model->cache(); - } - - private function _get_tree($data) { - - $tree = array(); - $category = $this->get_cache('category-'.SITE_ID); - - foreach($data as $t) { - $url = dr_url_prefix($category[$t['id']]['url'] ? $category[$t['id']]['url'] : 'index.php?c=category&id='.$t['id']); - $t['option'] = ' '.fc_lang('访问').''; - if ($t['tid'] != 2) $t['option'].= ' $t['id'])).'> '.fc_lang('添加子类').''; - $t['option'].= ' $t['id'])).'> '.fc_lang('修改').''; - if ($t['tid']==1 && !$t['child'] ) { - $t['option'].= ' $t['mid'], 'catid' => $t['id'])).'> '.fc_lang('发布内容').''; - } - // 栏目类型 - $t['type'] = ' '.fc_lang('单页').' '; - if ($t['tid'] == 1) { - $t['type'] = ' '.fc_lang('模型').' '; - } elseif ($t['tid'] == 2) { - $t['type'] = ' '.fc_lang('外链').' '; - $t['html'] = ''; - } - $t['dirname'] = dr_strcut($t['dirname'], 15); - $tree[$t['id']] = $t; - } - - return $tree; - } - - public function select_category($data, $id = 0, $str = '', $default = ' -- ', $onlysub = 0, $is_push = 0, $is_first = 0) { - - $cache = md5(dr_array2string($data).dr_array2string($id).$str.$default.$onlysub.$is_push.$is_first.$this->member['uid']); - if ($cache_data = $this->get_cache_data($cache)) { - return $cache_data; - } - - $tree = array(); - $first = 0; // 第一个可用栏目 - $string = ''; - - if ($is_first) { - $mark = "value='"; - $first2 = (int)substr($string, strpos($string, $mark) + strlen($mark)); - $first = $first2 ? $first2 : $first; - } - $data = $is_first ? array($string, $first) : $string; - if ($tree) { - $this->set_cache_data($cache, $data, 7200); - } - - return $data; - } - - /** - * 批量自定义URL - */ - public function url() { - $category = $this->get_cache('category-'.SITE_ID); - if (IS_POST) { - $catid = $this->input->post('catid'); - if ($catid) { - foreach ($catid as $id) { - $setting = $category[$id]['setting']; - if ($setting) { - $setting['urlrule'] = (int)$this->input->post('urlrule'); - $this->db->where('id', $id)->update(SITE_ID.'_category', array( - 'setting' => dr_array2string($setting) - )); - } - } - $this->admin_msg(fc_lang('总共批量设置了%s个栏目
    请更新缓存和更新地址', count($catid)), dr_url('category/index'), 1, 5); - } else { - $error = fc_lang('请选择一个的栏目'); - } - } - $this->template->assign(array( - 'error' => $error, - 'select' => $this->select_category($category, 0, ' class=\'form-control\' id=\'dr_catid\' name=\'catid[]\' multiple style="min-width:200px;height:250px;"', ''), - )); - $this->template->display('category_url.html'); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Content.php b/finecms/finecms/dayrui/controllers/admin/Content.php deleted file mode 100644 index 01afd34..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Content.php +++ /dev/null @@ -1,459 +0,0 @@ -load->library('Dfield'); - $this->sysfield = array( - 'author' => array( - 'name' => fc_lang('录入作者'), - 'ismain' => 1, - 'fieldtype' => 'Text', - 'fieldname' => 'author', - 'setting' => array( - 'option' => array( - 'width' => 200, - 'value' => $this->admin['username'] - ), - 'validate' => array( - 'tips' => fc_lang('填写录入者的会员名称'), - 'check' => '_check_member', - 'required' => 1, - 'formattr' => ' ondblclick="dr_dialog_member(\'author\')" ', - ) - ) - ), - 'inputtime' => array( - 'name' => fc_lang('录入时间'), - 'ismain' => 1, - 'fieldtype' => 'Date', - 'fieldname' => 'inputtime', - 'setting' => array( - 'option' => array( - 'width' => 200 - ), - 'validate' => array( - 'required' => 1, - 'formattr' => '', - ) - ) - ), - 'updatetime' => array( - 'name' => fc_lang('更新时间'), - 'ismain' => 1, - 'fieldtype' => 'Date', - 'fieldname' => 'updatetime', - 'setting' => array( - 'option' => array( - 'width' => 200 - ), - 'validate' => array( - 'required' => 1, - 'formattr' => '', - ) - ) - ), - 'inputip' => array( - 'name' => fc_lang('客户端IP'), - 'ismain' => 1, - 'fieldtype' => 'Text', - 'fieldname' => 'inputip', - 'setting' => array( - 'option' => array( - 'width' => 200, - 'value' => $this->input->ip_address() - ), - 'validate' => array( - 'formattr' => ' ondblclick="dr_dialog_ip(\'inputip\')" ', - ) - ) - ), - 'hits' => array( - 'name' => fc_lang('阅读量'), - 'ismain' => 1, - 'fieldtype' => 'Text', - 'fieldname' => 'hits', - 'setting' => array( - 'option' => array( - 'width' => 200, - 'value' => 0, - ) - ) - ), - 'status' => array( - 'name' => fc_lang('状态'), - 'ismain' => 1, - 'fieldname' => 'status', - 'fieldtype' => 'Radio', - 'setting' => array( - 'option' => array( - 'value' => 9, - 'options' => fc_lang('正常').'|9'.chr(13).fc_lang('关闭').'|10' - ), - 'validate' => array( - 'tips' => fc_lang('关闭状态起内容暂存作用,除自己和管理员以外的人均无法访问'), - ) - ) - ), - ); - $this->mid = $this->input->get('mid'); - $this->module = $this->get_cache('module', $this->mid); - if (!$this->module) { - $this->admin_msg(fc_lang('模型不存在')); - } - $this->load->model('content_model'); - $this->content_model->init($this->module); - } - - public function _get_field($catid = 0) { - return $this->module['field']; - } - - public function index() { - - if (IS_POST && !$this->input->post('search')) { - $ids = $this->input->post('ids'); - $action = $this->input->post('action'); - !$ids && ($action == 'html' ? $this->admin_msg(fc_lang('您还没有选择呢')) : exit(dr_json(0, fc_lang('您还没有选择呢')))); - switch ($action) { - case 'del': - $ok = $no = 0; - foreach ($ids as $id) { - $data = $this->db->where('id', (int)$id)->select('id,catid,tableid')->get($this->content_model->prefix)->row_array(); - if ($data) { - $ok++; - $this->content_model->delete_for_id((int)$data['id'], (int)$data['tableid']); - } - } - $this->system_log('删除站点【#'.SITE_ID.'】模型【'.APP_DIR.'】内容【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json($no ? 0 : 1, $no ? fc_lang('管理员:%s', $ok, $no) : fc_lang('操作成功,正在刷新...'))); - break; - case 'order': - $_data = $this->input->post('data'); - foreach ($ids as $id) { - $this->db->where('id', $id)->update($this->content_model->prefix, $_data[$id]); - } - $this->system_log('排序站点【#'.SITE_ID.'】模型【'.APP_DIR.'】内容【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - break; - case 'move': - $catid = $this->input->post('catid'); - if (!$catid) { - exit(dr_json(0, fc_lang('目标栏目id不存在'))); - } - $this->content_model->move($ids, $catid); - $this->system_log('站点【#'.SITE_ID.'】模型【'.APP_DIR.'】内容【#'.@implode(',', $ids).'】更改栏目#'.$catid); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - break; - default : - exit(dr_json(0, fc_lang('操作成功,正在刷新...'))); - break; - } - } - - // 重置页数和统计 - IS_POST && $_GET['page'] = $_GET['total'] = 0; - IS_POST && $_GET['caitd'] = $_POST['data']['caitd']; - // 筛选结果 - $param = $this->input->get(NULL, TRUE); - $catid = isset($param['catid']) ? (int)$param['catid'] : 0; - unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']); - - // 按字段的搜索 - $this->field = $this->module['field']; - $this->field['author'] = array('name' => fc_lang('录入作者'), 'ismain' => 1, 'fieldname' => 'author'); - - // 数据库中分页查询 - list($list, $param) = $this->content_model->limit_page($param, max((int)$_GET['page'], 1), (int)$_GET['total']); - $param['mid'] = $this->mid; - - $this->template->assign('menu', $this->get_menu_v3(array( - fc_lang('内容管理') => array('admin/content/index/mid/'.$this->mid, 'th-large'), - fc_lang('发布内容') => array('admin/content/add/mid/'.$this->mid, 'plus'), - fc_lang('更新URL地址') => array('admin/content/url/mid/'.$this->mid, 'link'), - ))); - - // 存储当前页URL - $this->_set_back_url('content/index', $param); - - // 插件判断 - $clink = array(); - $local = $this->local_app(); - if ($local) { - foreach ($local as $t) { - if ($t['clink']) { - $clink[] = $t['clink']; - } - } - } - - $this->template->assign(array( - 'mid' => $this->mid, - 'list' => $list, - 'clink' => $clink, - 'param' => $param, - 'field' => $this->field, - 'pages' => $this->get_pagination(dr_url('content/index', $param), $param['total']), - 'select' => $this->select_category($this->get_cache('category-'.SITE_ID), 0, 'id=\'move_id\' name=\'catid\'', ' --- ', 1, 1), - 'select2' => $this->select_category($this->get_cache('category-'.SITE_ID), (int)$param['catid'] , ' name=\'data[catid]\'', ' --- ', 0, 1), - 'html_url' => 'index.php?', - 'post_url' => $this->duri->uri2url('admin/content/add/mid/'.$this->mid), - 'list_url' => $this->duri->uri2url('admin/content/index/mid/'.$this->mid), - )); - $this->template->display('content_index.html'); - } - - public function add() { - - $catid = (int)$this->input->get('catid'); - - $error = $data = array(); - $category = $this->get_cache('category-'.SITE_ID); - - - // 提交保存操作------ - if (IS_POST) { - $cid = (int)$this->input->post('catid'); - $catid = $cid; - $cat = $category[$catid]; - // 设置uid便于校验处理 - $uid = $this->input->post('data[author]') ? get_member_id($this->input->post('data[author]')) : 0; - $_POST['data']['id'] = 0; - $_POST['data']['uid'] = $uid; - // 获取字段 - $myfield = array_merge($this->_get_field(), $this->sysfield); - $data = $this->validate_filter($myfield); - // 返回错误 - if (isset($data['error'])) { - $error = $data; - $data = $this->input->post('data', TRUE); - } elseif (!$catid) { - $data = $this->input->post('data', TRUE); - $error = array('error' => 'catid', 'msg' => fc_lang('还没有选择栏目')); - } else { - $data[1]['uid'] = $uid; - $data[1]['catid'] = $catid; - - // 正常发布 - if (($id = $this->content_model->add($data)) != FALSE) { - // 执行提交后的脚本 - $this->validate_table($id, $myfield, $data); - $this->system_log('添加 站点【#'.SITE_ID.'】模型【'.$this->mid.'】内容【#'.$id.'】'); // 记录日志 - if ($this->input->post('action') == 'back') { - $this->admin_msg( - fc_lang('操作成功,正在刷新...'), - $this->_get_back_url('content/index', array('mid' => $this->mid)), - 1, - 1 - ); - } else { - $error = array('msg' => dr_lang('发布成功'), 'status'=>1); - } - } - } - $select = $this->select_category($category, $catid, 'id=\'dr_catid\' name=\'catid\'', '', 1, 1); - } else { - if (!$catid) { - list($select, $catid) = $this->select_category($category, 0, 'id=\'dr_catid\' name=\'catid\'', '', 1, 1, 1); - } else { - $select = $this->select_category($category, $catid, 'id=\'dr_catid\' name=\'catid\'', '', 1, 1); - } - } - - $myfield = $this->_get_field(); - - $this->template->assign(array( - 'data' => $data, - 'menu' => $this->get_menu_v3(array( - fc_lang('返回') => array('admin/content/index/mid/'.$this->mid, 'reply'), - fc_lang('发布') => array('/admin/content/add/mid/'.$this->mid, 'plus') - )), - 'catid' => $catid, - 'error' => $error, - 'select' => $select, - 'myfield' => $this->new_field_input($myfield, $data, TRUE), - 'sysfield' => $this->new_field_input($this->sysfield, $data, TRUE, '', '
    {value}
    '), - - )); - $this->template->display('content_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $cid = (int)$this->input->get('catid'); - $data = $this->content_model->get($id); - $catid = $cid ? $cid : $data['catid']; - $error = $myflag = array(); - unset($cid); - - // 数据判断 - !$data && $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - - - // 栏目缓存 - $category = $this->get_cache('category-'.SITE_ID); - - - if (IS_POST) { - $cid = (int)$this->input->post('catid'); - $catid = $cid; - unset($cid); - // 设置uid便于校验处理 - $uid = $this->input->post('data[author]') ? get_member_id($this->input->post('data[author]')) : 0; - $_POST['data']['id'] = $id; - $_POST['data']['uid'] = $uid; - // 获取字段 - $myfield = array_merge($this->_get_field(), $this->sysfield); - $post = $this->validate_filter($myfield, $data); - if (isset($post['error'])) { - $error = $post; - } elseif (!$catid) { - $error = array('error' => 'catid', 'msg' => fc_lang('还没有选择栏目')); - } else { - $post[1]['uid'] = $uid; - $post[1]['catid'] = $catid; - $post[1]['updatetime'] = $this->input->post('no_time') ? $data['updatetime'] : $post[1]['updatetime']; - - // 正常保存 - $this->content_model->edit($data, $post); - // 执行提交后的脚本 - $this->validate_table($id, $myfield, $post); - // 操作成功处理附件 - $this->attachment_handle($post[1]['uid'], $this->content_model->prefix.'-'.$id, $myfield, $data); - - $this->system_log('修改 站点【#'.SITE_ID.'】模型 内容【#'.$id.'】'); // 记录日志 - - //exit; - $this->admin_msg( - fc_lang('操作成功,正在刷新...'), - $this->_get_back_url('content/index', array('mid' => $this->mid)), - 1, - 1 - ); - } - $data = $this->input->post('data', TRUE); - } else { - - } - - - // 可用字段 - $myfield = $this->_get_field($catid); - - $data['updatetime'] = SYS_TIME; - $this->template->assign(array( - 'data' => $data, - 'menu' => $this->get_menu_v3(array( - fc_lang('返回') => array('admin/content/index/mid/'.$this->mid, 'reply'), - fc_lang('发布') => array('/admin/content/add/mid/'.$this->mid, 'plus') - )), - 'catid' => $catid, - 'error' => $error, - 'select' => $this->select_category($category, $catid, 'id=\'dr_catid\' name=\'catid\' onChange="show_category_field(this.value)"', '', 1, 1), - 'myfield' => $this->new_field_input($myfield, $data, TRUE), - 'sysfield' => $this->new_field_input($this->sysfield, $data, TRUE, '', '
    {value}
    '), - - )); - $this->template->display('content_add.html'); - } - - - - // 文档状态设定 - public function status() { - - $id = (int)$this->input->get('id'); - $data = $this->content_model->get($id); - !$data && exit(dr_json(0, fc_lang('对不起,数据被删除或者查询不存在'))); - - // 删除缓存 - $this->clear_cache('show'.APP_DIR.SITE_ID.$id); - $this->clear_cache('mshow'.APP_DIR.SITE_ID.$id); - - if ($data['status'] == 10) { - $this->db->where('id', $id)->update($this->content_model->prefix, array('status' => 9)); - $this->db->where('id', $id)->update(SITE_ID.'_index', array('status' => 9)); - // 调用方法状态更改方法 - $data['status'] = 9; - $this->content_model->_update_status($data); - $this->system_log('修改 站点【#'.SITE_ID.'】模型【'.APP_DIR.'】内容【#'.$id.'】状态为【正常】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'), $data['catid'])); - } else { - - $this->db->where('id', $id)->update($this->content_model->prefix, array('status' => 10)); - $this->db->where('id', $id)->update(SITE_ID.'_index', array('status' => 10)); - // 调用方法状态更改方法 - $data['status'] = 10; - $this->content_model->_update_status($data); - $this->system_log('修改 站点【#'.SITE_ID.'】模型【'.APP_DIR.'】内容【#'.$id.'】状态为【关闭】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'), 0)); - } - - } - - - - /** - * 更新URL 兼容处理 - */ - public function url() { - - $cfile = SITE_ID.APP_DIR.$this->uid.$this->input->ip_address().'_content_url'; - - // 处理url - if ($this->input->get('todo')) { - $page = max(1, (int)$this->input->get('page')); - $psize = 100; // 每页处理的数量 - $cache = $this->cache->file->get($cfile); - if ($cache) { - $total = $cache['total']; - $catid = $cache['catid']; - } else { - $catid = 0; - $total = $this->db->count_all_results($this->content_model->prefix); - } - $tpage = ceil($total / $psize); // 总页数 - if ($page > $tpage) { - // 更新完成删除缓存 - $this->cache->file->delete($cfile); - $this->admin_msg(fc_lang('更新成功'), NULL, 1); - } - $table = $this->content_model->prefix; - $catid && $this->db->where_in('catid', $catid); - $data = $this->db->limit($psize, $psize * ($page - 1))->order_by('id DESC')->get($table)->result_array(); - foreach ($data as $t) { - $url = dr_show_url($t); - $this->db->update($table, array('url' => $url), 'id='.$t['id']); - } - $this->admin_msg(fc_lang('正在执行中(%s) ... ', "$tpage/$page"), dr_url('content/url', array('mid' => $this->mid, 'todo' => 1, 'page' => $page + 1)), 2, 0); - } else { - // 统计数量 - $total = $this->db->count_all_results($this->content_model->prefix); - $this->cache->file->save($cfile, array('catid' => 0, 'total' => $total), 10000); - if ($total) { - $this->system_log('站点【#'.SITE_ID.'】模型【'.APP_DIR.'】更新URL地址#'.$total); // 记录日志 - $this->admin_msg(fc_lang('可更新内容%s条,正在准备执行...', $total), dr_url('content/url', array('mid' => $this->mid, 'todo' => 1)), 2); - } else { - $this->admin_msg(fc_lang('抱歉,没有找到可更新的内容')); - } - } - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Customer.php b/finecms/finecms/dayrui/controllers/admin/Customer.php deleted file mode 100644 index 5da9136..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Customer.php +++ /dev/null @@ -1,412 +0,0 @@ -template->assign('menu', $this->get_menu_v3(array( - fc_lang('添加') => array('admin/customer/add_js', 'plus') - ))); - - } - - /** - * 首页 - */ - public function index() { - // 重置页数和统计 - IS_POST && $_GET['page'] = $_GET['total'] = 0; - $search = $_POST['search']; - $sname = $_POST['sname']; - $param['saler'] = $_GET['salerId']; - // 根据参数筛选结果 - $param = $this->input->get(NULL, TRUE); - unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']); - $param['search'] = $search; - $param['sname'] = $sname; - // 数据库中分页查询 - list($data, $param) = $this->customer_model->limit_page($param, max((int)$_GET['page'], 1), (int)$_GET['total']); - - $field = $this->get_cache('member', 'field'); - $field = array( - 'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')), - 'name' => array('fieldname' => 'name','name' => fc_lang('姓名')), - 'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')), - 'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')), - ) + ($field ? $field : array()); - // 存储当前页URL - $this->_set_back_url('member/index', $param); - $this->template->assign('search',$search); - $this->template->assign(array( - 'list' => $data, - 'field' => $field, - 'param' => $param, - 'pages' => $this->get_pagination(dr_url('customer/index', $param), $param['total']), - )); - $this->template->display('customer_index.html'); - } - - /** - * 添加 - */ - public function add() { - - $saler = $this->db->select('*')->get('saler')->result_array(); - if (IS_POST) { - - $data = $this->input->post( 'data' ); - $info = $this->input->post( 'info' ); - // 单个添加 - $uid = $this->customer_model->addCustomer( [ - 'cname' => $data['cname'], - 'address' => $data['address'], - 'phone' => $data['phone'], - 'salerId' => $data['salerId'], - 'debtTime' => $data['debtTime'], - 'meetTime' => $data['meetTime'], - 'remark' => $info?:'', - ] ); - - exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) ); - - } - - $this->template->assign('saler',$saler); - $this->template->display('customer_add.html'); - } - - public function exportCustomer() { - ob_end_clean(); - ob_start(); - $date = date('Y-m-d'); - $filename = $date.'客户信息.xls'; - header('content-type:application/vnd.ms-excel;charset=UTF-8'); - header('content-disposition:attachment;filename='.$filename); - header('Content-Transfer-Encoding: binary'); - header('Pragma:no-cache'); - header('Expires:0'); - header("Pragma: public"); - header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); - header("Content-Type:application/force-download"); - header("Content-Type:application/octet-stream"); - header("Content-Type:application/download"); - - $title = array( - '姓名', - '电话', - '地址', - '销售人员', - '欠桶', - '欠款', - '押桶', - '备注' - ); - echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n"; - - $list = $this->customer_model->get_all_customer(); - - foreach ($list as $key => $value) { - echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n"; - } - } - - - - - public function exportCustomerBill() { - $customerId = $_GET['customerId']; - $date = date('Y-m-d'); - $filename = $date.'客户账单.xls'; - header('content-type:application/vnd.ms-excel;charset=UTF-8'); - header('content-disposition:attachment;filename='.$filename); - header('Content-Transfer-Encoding: binary'); - header('Pragma:no-cache'); - header('Expires:0'); - header("Pragma: public"); - header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); - header("Content-Type:application/force-download"); - header("Content-Type:application/octet-stream"); - header("Content-Type:application/download"); - - $title = array( - '姓名', - '桶装水', - '瓶装水', - '饮料', - '价格', - '回桶', - '结款', - '欠款', - '欠桶', - '押桶', - '时间', - '备注' - ); - echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n"; - - $list = $this->customer_model->get_customer_bill_exp($customerId); - foreach ($list as $key => $value) { - echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n"; - } - return false; - } - - /** - * 修改 - */ - public function edit() { - - $customerId = (int)$this->input->get('customerId'); - $page = (int)$this->input->get('page'); - $data = $this->customer_model->get_customer($customerId); - $saler = $this->saler_model->get_all_saler(); - !$data && $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - - $field = array(); - - if (IS_POST) { - $edit = $this->input->post('member'); - $page = (int)$this->input->post('page'); - if (isset($post['error'])) { - $error = $post['msg']; - } else { - - $update = array( - 'cname' => $edit['cname'], - 'phone' => $edit['phone'], - 'address' => $edit['address'], - 'salerId' => $edit['salerId'], - 'debtTime' => $edit['debtTime'], - 'meetTime' => $edit['meetTime'], - 'remark' => $edit['remark'], - ); - $this->db->where('id', $customerId)->update('customer', $update); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('customer/index', array( 'page' => $page)), 1); - } - } - - $this->template->assign(array( - 'data' => $data, - 'salerId' => $data['salerId'], - 'saler' => $saler, - 'page' => $page, - 'myfield' => $this->field_input($field, $data, TRUE), - )); - $this->template->display('customer_edit.html'); - } - - public function bill() { - $customerId = $_GET['customerId']; - // 重置页数和统计 - IS_POST && $_GET['page'] = $_GET['total'] = 0; - - // 根据参数筛选结果 - $param = $this->input->get(NULL, TRUE); - unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']); - - // 数据库中分页查询 - list($data, $param) = $this->customer_model->get_customer_bill($customerId, max((int)$_GET['page'], 1), (int)$_GET['total']); - - - $field = $this->get_cache('member', 'field'); - $field = array( - 'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')), - 'name' => array('fieldname' => 'name','name' => fc_lang('姓名')), - 'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')), - 'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')), - ) + ($field ? $field : array()); - // 存储当前页URL - $this->template->assign('menubill', $this->get_menu_v3(array( - fc_lang('返回') => array('admin/customer/index', 'reply') - - ))); - $this->template->assign('customerId',$customerId); - $this->template->assign(array( - 'list' => $data, - 'field' => $field, - 'param' => $param, - 'pages' => $this->get_pagination(dr_qxurl('customer/bill/customer/'.$customerId, $param), $param['total']), - )); - $this->template->display('customerbill_index.html'); - } - - public function billDel() { - $billId = $this->_GET['billId']; - $this->customer_model->deletebill($billId); - } - - public function price() { - - - $customerId = $_GET['customerId']; - // 重置页数和统计 - IS_POST && $_GET['page'] = $_GET['total'] = 0; - - // 根据参数筛选结果 - $param = $this->input->get(NULL, TRUE); - unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']); - - $billId = $_GET['billId']; - // 数据库中分页查询 - $data = $this->customer_model->get_price($customerId); - $customerInfo = $this->customer_model->get_customer($customerId); - $field = $this->get_cache('member', 'field'); - $field = array( - 'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')), - 'name' => array('fieldname' => 'name','name' => fc_lang('姓名')), - 'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')), - 'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')), - ) + ($field ? $field : array()); - - // 存储当前页URL - $this->_set_back_url('member/index', $param); - $url = 'admin/customer/priceadd/customerId/'.$customerId; - // 存储当前页URL - $this->template->assign('menu', $this->get_menu_v3(array( - fc_lang('返回') => array('admin/customer/index', 'reply'), - fc_lang('添加') => array($url.'_js', 'plus') - - ))); - $cname = $customerInfo['cname']; - $this->template->assign(array( - 'cname' => $cname, - 'list' => $data, - 'field' => $field, - 'param' => $param, - 'pages' => $this->get_pagination(dr_url('member/index', $param), $param['total']), - )); - $this->template->display('customerprice_index.html'); - } - - public function getprice() - { - $customer = $_GET['cname']; - if(!$customer){ - return ; - } - $data = $this->customer_model->get_price_bycustomer($customer); - echo json_encode($data); - return ; - } - - public function priceadd() { - $customerId = $_GET['customerId']; - - - if (IS_POST) { - - $data = $this->input->post( 'data' ); - - // 单个添加 - $uid = $this->customer_model->addprice( [ - 'customerId' => $data['customerId'], - 'unit' => $data['unit'], - 'price' => $data['price'], - ] ); - - exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) ); - } - $url = 'admin/customer/pirce/customerId/'.$customerId; - $this->template->assign('menubill', $this->get_menu_v3(array( - fc_lang('返回') => array($url, 'reply') - ))); - $customerInfo = $this->customer_model->get_customer($customerId); - $cname = $customerInfo['cname']; - $customer = $this->customer_model->get_all_customer(); - $this->template->assign('cname',$cname); - $this->template->assign('customerId', $customerId); - $this->template->display('customerprice_add.html'); - } - - public function meet() { - $data = $this->customer_model->getCustomerTime(); - $date = time(); - $debtInfo = []; - foreach ( $data as $k => $v) { - if($v['saleTime'] || $v['alldebt'] > 0) { - $meet = ($date - strtotime($v['saleTime']))/(24*60*60); - if($meet > $v['debtTime']) { - $debtInfo[] = $v; - } - } - - } - $this->template->assign('list',$debtInfo); - $this->template->display('customer_meet.html'); - } - - public function debt() { - $data = $this->customer_model->getCustomerDebt(); - $date = time(); - $debtInfo = []; - foreach ( $data as $k => $v) { - if($v['saleTime'] || $v['alldebt'] > 0) { - $meet = ($date - strtotime($v['saleTime']))/(24*60*60); - if($meet > $v['debtTime']) { - $debtInfo[] = $v; - } - } - - } - $this->template->assign('list',$debtInfo); - $this->template->display('customer_debt.html'); - } - - public function getDebtList() - { - $customerId = $_GET['customerId']; - $list = $this->customer_model->getdebtlist($customerId); - $this->template->assign('list',$list); - $this->template->assign('customerId',$customerId); - $this->template->display('customer_debtlist.html'); - - } - - public function exportDebt() { - $customerId = $_GET['customerId']; - $date = date('Y-m-d'); - $filename = $date.'欠款信息.xls'; - header('content-type:application/vnd.ms-excel;charset=UTF-8'); - header('content-disposition:attachment;filename='.$filename); - header('Content-Transfer-Encoding: binary'); - header('Pragma:no-cache'); - header('Expires:0'); - header("Pragma: public"); - header("Cache-Control:must-revalidate, post-check=0, pre-check=0"); - header("Content-Type:application/force-download"); - header("Content-Type:application/octet-stream"); - header("Content-Type:application/download"); - - $title = array( - '姓名', - '电话', - '金额', - '销售人员', - '时间' - ); - echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n"; - - $list = $this->customer_model->getdebtlist($customerId); - - foreach ($list as $key => $value) { - echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n"; - } - return false; - } - - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Db.php b/finecms/finecms/dayrui/controllers/admin/Db.php deleted file mode 100644 index 64e8d66..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Db.php +++ /dev/null @@ -1,78 +0,0 @@ -siteid = (int)$this->input->get('siteid'); - } - - /** - * 数据维护 - */ - public function index() { - - $list = $this->siteid ? $this->system_model->get_site_table($this->siteid) : $this->system_model->get_system_table(); - - if (IS_POST) { - $tables = $this->input->post('select'); - if (!$tables) { - $this->admin_msg(fc_lang('貌似你还没有选择需要操作的表呢')); - } - switch ((int)$this->input->post('action')) { - case 1: // 优化表 - foreach ($tables as $table) { - $this->db->query("OPTIMIZE TABLE `$table`"); - } - $result = fc_lang('操作成功,正在刷新...'); - $this->system_log('优化数据表'); // 记录日志 - break; - case 2: // 修复表 - foreach ($tables as $table) { - $this->db->query("REPAIR TABLE `$table`"); - } - $result = fc_lang('操作成功,正在刷新...'); - $this->system_log('修复数据表'); // 记录日志 - break; - } - } - - $menu = array(); - $menu[fc_lang('系统数据库')] = array('admin/db/index', 'database'); - foreach ($this->site_info as $id => $s) { - $menu[fc_lang('站点【#%s】', $id)] = array('admin/db/index/siteid/'.$id, 'database'); - } - - $this->template->assign(array( - 'menu' => $this->get_menu_v3($menu), - 'list' => $list, - 'result' => $result, - )); - $this->template->display('db_index.html'); - } - - /** - * 表结构 - */ - public function tableshow() { - $name = $this->input->get('name'); - $cache = $this->get_cache('table'); - $this->template->assign('table', $cache[$name]); - $this->template->display('db_table.html'); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Fcontent.php b/finecms/finecms/dayrui/controllers/admin/Fcontent.php deleted file mode 100644 index b27a599..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Fcontent.php +++ /dev/null @@ -1,239 +0,0 @@ -mid = $this->input->get('mid'); - $this->form = $this->get_cache('form-name-'.SITE_ID, $this->mid); - if (!$this->form) { - $this->admin_msg(fc_lang('表单['.$this->mid.']不存在')); - } - $this->load->model('form_model'); - $this->field = array( - 'author' => array( - 'name' => fc_lang('录入作者'), - 'ismain' => 1, - 'fieldtype' => 'Text', - 'fieldname' => 'author', - 'setting' => array( - 'option' => array( - 'width' => 157, - 'value' => $this->admin['username'] - ), - 'validate' => array( - 'tips' => fc_lang('填写录入者的会员名称'), - 'check' => '_check_member', - 'required' => 1, - ) - ) - ), - 'inputtime' => array( - 'name' => fc_lang('录入时间'), - 'ismain' => 1, - 'fieldtype' => 'Date', - 'fieldname' => 'inputtime', - 'setting' => array( - 'option' => array( - 'width' => 200 - ), - 'validate' => array( - 'required' => 1, - 'formattr' => '', - ) - ) - ), - 'inputip' => array( - 'name' => fc_lang('客户端IP'), - 'ismain' => 1, - 'fieldname' => 'inputip', - 'fieldtype' => 'Text', - 'setting' => array( - 'option' => array( - 'width' => 200, - 'value' => $this->input->ip_address() - ), - 'validate' => array( - ) - ) - ) - ); - $this->template->assign(array( - 'mid' => $this->mid, - 'menu' => $this->get_menu_v3(array( - fc_lang($this->form['name']) => array('fcontent/index/mid/'.$this->mid, 'table'), - fc_lang('添加') => array('fcontent/add/mid/'.$this->mid, 'plus'), - )), - 'form' => 'form_'.$this->form['table'], - 'field' => $this->form['field'] + $this->field, - )); - } - - /** - * 内容维护 - */ - public function index() { - - if (IS_POST && $this->input->post('action')) { - $table = $this->form_model->prefix.'_'.$this->form['table']; - if ($this->input->post('action') == 'del') { - // 删除 - $this->load->model('attachment_model'); - $_ids = $this->input->post('ids'); - foreach ($_ids as $id) { - $row = $this->db->where('id', (int)$id)->get($table)->row_array(); - if ($row) { - $this->db->where('id', (int)$id)->delete($table); - $this->db->where('id', (int)$id)->delete($table.'_data_'.(int)$row['tableid']); - $this->attachment_model->delete_for_table($table.'-'.$id); - $this->system_log('删除站点【#'.SITE_ID.'】表单【'.$this->form['table'].'】内容【#'.$id.'】'.$row['title']); // 记录日志 - } - } - } elseif ($this->input->post('action') == 'order') { - // 修改 - $_ids = $this->input->post('ids'); - $_data = $this->input->post('data'); - foreach ($_ids as $id) { - $this->db->where('id', (int)$id)->update($table, $_data[$id]); - } - $this->system_log('排序站点【#'.SITE_ID.'】表单【'.$this->form['table'].'】内容【#'.@implode(',', $_ids).'】'); // 记录日志 - unset($_ids, $_data); - } - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - // 重置页数和统计 - IS_POST && $_GET['page'] = $_GET['total'] = 0; - - // 根据参数筛选结果 - $param = $this->input->get(NULL); - unset($param['s'],$param['c'],$param['m'],$param['d'],$param['page']); - if ($this->input->post('search')) { - $search = $this->input->post('data'); - $param['keyword'] = $search['keyword']; - $param['start'] = $search['start']; - $param['end'] = $search['end']; - $param['field'] = $search['field']; - } - - // 数据库中分页查询 - list($data, $total) = $this->form_model->limit_page( - $this->form['table'], - $param, - max((int)$_GET['page'], 1), - (int)$_GET['total'] - ); - $param['total'] = $total; - - $tpl = APPPATH.'templates/form_listc_'.$this->form['table'].'.html'; - $this->template->assign(array( - 'tpl' => str_replace(FCPATH, '/', $tpl), - 'list' => $data, - 'param' => $param, - 'total' => $total, - 'pages' => $this->get_pagination(dr_url('fcontent/index', $param), $param['total']), - )); - - $this->template->display(is_file($tpl) ? basename($tpl) : 'form_listc.html'); - } - - /** - * 添加内容 - */ - public function add() { - - if (IS_POST) { - - $data = $this->validate_filter($this->form['field'] + $this->field); - - // 验证出错信息 - if (isset($data['error'])) { - $error = $data; - $data = $this->input->post('data', TRUE); - } else { - // 设定文档默认值 - $data[1]['displayorder'] = 0; - $data[1]['uid'] = $data[0]['uid'] = get_member_id($data[1]['author']); - // 发布文档 - if (($id = $this->form_model->new_addc($this->form['table'], $data)) != FALSE) { - // 附件归档到文档 - $this->attachment_handle($this->uid, $this->form_model->prefix.'_'.$this->form['table'].'-'.$id, $this->form['field']); - $this->system_log('添加站点【#'.SITE_ID.'】表单【'.$this->form['table'].'】内容【#'.$id.'】'); // 记录日志 - $this->member_msg(fc_lang('操作成功,正在刷新...'), dr_url('fcontent/index', array('mid'=>$this->mid)), 1); - } - } - $data = $data[0] ? array_merge($data[1], $data[0]) : $data[1]; - unset($data['id']); - } - - $tpl = APPPATH.'templates/form_addc_'.$this->form['table'].'.html'; - $this->template->assign(array( - 'tpl' => str_replace(FCPATH, '/', $tpl), - 'data' => $data, - 'error' => $error, - 'myfield' => $this->field_input($this->form['field'] + $this->field, $data) - )); - $this->template->display(is_file($tpl) ? basename($tpl) : 'form_addc.html'); - } - - /** - * 修改内容 - */ - public function edit() { - - - $id = (int)$this->input->get('id'); - $table = $this->form_model->prefix.'_'.$this->form['table']; - - // 获取表单数据 - $data = $this->form_model->get_data($id, $table); - !$data && $this->admin_msg(fc_lang('数据被删除或者查询不存在')); - - if (IS_POST) { - $post = $this->validate_filter($this->form['field'] + $this->field); - // 验证出错信息 - if (isset($post['error'])) { - $error = $post; - $data = $this->input->post('data', TRUE); - } else { - // 发布文档 - $post[1]['uid'] = $post[0]['uid'] = get_member_id($post[1]['author']); - if ($this->form_model->new_editc($id, $this->form['table'], $data['tableid'], $post)) { - // 附件归档到文档 - $this->attachment_handle($this->uid, $table.'-'.$id, $this->form['field']); - $this->system_log('修改站点【#'.SITE_ID.'】表单【'.$this->form['table'].'】内容【#'.$id.'】'); // 记录日志 - $this->member_msg(fc_lang('操作成功,正在刷新...'), dr_url('fcontent/index', array('mid'=>$this->mid)), 1); - } - } - $data = $post[0] ? array_merge($post[1], $post[0]) : $post[1]; - unset($data['id']); - } - - $tpl = APPPATH.'templates/form_addc_'.$this->form['table'].'.html'; - $this->template->assign(array( - 'tpl' => str_replace(FCPATH, '/', $tpl), - 'data' => $data, - 'error' => $error, - 'myfield' => $this->field_input($this->form['field'] + $this->field, $data) - )); - $this->template->display(is_file($tpl) ? basename($tpl) : 'form_addc.html'); - } - - - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Field.php b/finecms/finecms/dayrui/controllers/admin/Field.php deleted file mode 100644 index 94cd07a..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Field.php +++ /dev/null @@ -1,301 +0,0 @@ -load->model('field_model'); - $ismain = $issearch = $iscategory = 0; - $this->relatedid = (int)$this->input->get('rid'); - $this->relatedname = $this->input->get('rname'); // 字段来源相关表 - if (strpos($this->relatedname, 'form') === 0) { - // 网站表单字段 - $this->data = $this->get_cache($this->relatedname, $this->relatedid); - $this->name = '网站表单【'.$this->data['table'].'】字段'; - $this->backuri = 'admin/form/index'; // 返回uri地址 - $this->cacheuri = $this->relatedname; // 缓存文件标示名称 - if (!$this->data) { - $this->admin_msg(fc_lang('表单不存在,请更新表单缓存')); - } - $this->func = 'form'; - } elseif (strpos($this->relatedname, 'category') === 0) { - // 模型栏目表字段 - $ismain = 1; - // 表示共享栏目 - $this->name = '栏目字段'; - $this->backuri = 'admin/category/index'; // 返回uri地址 - $this->cacheuri = 'category_share'; // 缓存文件标示名称 - $this->data['dirname'] = 'share'; - $this->func = 'category_info'; - } elseif ($this->relatedname == 'module') { - // 模型字段 - $this->load->model('module_model'); - $this->data = $this->module_model->get($this->relatedid); - $this->backuri = 'admin/module/index'; // 返回uri地址 - $this->cacheuri = 'module'; // 缓存文件标示名称 - $this->name = '模型【'.$this->data['dirname'].'】字段'; - $this->func = 'module'; - } elseif ($this->relatedname == 'member') { - // 会员字段 - $ismain = 1; - $this->name = '会员字段'; - $this->backuri = 'member/admin/home/index'; // 返回uri地址 - $this->cacheuri = 'member'; // 缓存文件标示名称 - $this->func = 'member'; - } - // load - $this->load->library('Dfield', array($this->data['dirname'])); - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - lang('返回') => array($this->backuri, 'reply'), - $this->name ? $this->name : fc_lang('字段管理') => array('admin/field/index/rname/'.$this->relatedname.'/rid/'.$this->relatedid, 'cube'), - fc_lang('添加') => array('admin/field/add/rname/'.$this->relatedname.'/rid/'.$this->relatedid,'plus') - )), - 'rid' => $this->relatedid, - 'rname' => $this->relatedname, - 'module' => $this->data['dirname'], - 'ismain' => $ismain, - 'issearch' => $issearch, - 'iscategory' => $iscategory, - )); - } - - /** - * 管理 - */ - public function index() { - - if (IS_POST) { - if ($this->input->post('action') == 'del') { - $ids = $this->input->post('ids'); - $this->field_model->del($ids); - $this->system_log('删除'.$this->name.'【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功'))); - } else { - $_ids = $this->input->post('ids'); - $_data = $this->input->post('data'); - foreach ($_ids as $id) { - $this->db->where('id', $id)->update('field', $_data[$id]); - } - $this->system_log('修改排序'.$this->name.'【#'.@implode(',', $_ids).'】'); // 记录日志 - unset($_ids, $_data); - exit(dr_json(1, fc_lang('操作成功'))); - } - } - - $data = $this->field_model->get_data(); - $group = array(); - if ($data) { - foreach ($data as $t) { - if (($t['fieldtype'] == 'Group' || $t['fieldtype'] == 'Merge') - && preg_match_all('/\{(.+)\}/U', $t['setting']['option']['value'], $value)) { - $group[$t['fieldname']] = dr_random_color(); - foreach ($value[1] as $v) { - $group[$v] = $group[$t['fieldname']]; - } - } - } - } - - $this->template->assign(array( - 'list' => $data, - 'group' => $group - )); - $this->template->display('field_index.html'); - } - - /** - * 添加 - */ - public function add() { - - // 初始化部分值 - $page = max((int)$this->input->post('page'), 0); - $result = $code = $data['fieldtype'] = $data['setting']['option'] = ''; - $data['setting']['validate']['required'] = $id = 0; - // 可用字段类别 - $ftype = $this->dfield->type($this->module); - - if ($this->relatedname != 'module' - && strpos($this->relatedname, 'extend') === false) { - // 非模型和扩展字段时不显示的类别 - foreach ($ftype as $i => $t) { - if (in_array($t['id'], array('Fees', 'Syn', 'Price'))) { - unset($ftype[$i]); - } - } - } - if ($this->relatedname != 'module') { - // 非模型字段时不显示的类别 - foreach ($ftype as $i => $t) { - if (in_array($t['id'], array( - 'Price', - 'Syn', - 'Mycategory', - 'Property2', - 'Shipping', - 'Shipping_param', - 'Specification', - ))) { - unset($ftype[$i]); - } - } - } - // 提交表单 - if (IS_POST) { - $data = $this->input->post('data'); - $field = $this->dfield->get($data['fieldtype']); - if (!$field) { - $page = 0; - $result = fc_lang('字段类别不存在'); - } elseif (empty($data['name'])) { - $page = 0; - $code = 'name'; - } elseif (!preg_match('/^[a-z]+[a-z0-9_\-]+$/i', $data['fieldname'])) { - $page = 0; - $code = 'fieldname'; - $result = fc_lang('字段名称不规范'); - } elseif (strlen($data['fieldname']) > 15) { - $page = 0; - $code = 'fieldname'; - $result = fc_lang('字段名称太长'); - } elseif ($this->field_model->exitsts($data['fieldname'])) { - $page = 0; - $code = 'fieldname'; - $result = fc_lang('字段已经存在'); - } else { - $this->clear_cache($this->cacheuri); - $sql = $field->create_sql($data['fieldname'], $data['setting']['option']); - $this->field_model->add($data, $sql); - $this->system_log('添加'.$this->name.'【'.$data['fieldname'].'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功'), dr_url('field/index', array('rname' => $this->relatedname, 'rid' => $this->relatedid)), 1); - - } - - } - - $this->template->assign(array( - 'id' => $id, - 'page' => $page, - 'code' => $code, - 'data' => $data, - 'role' => $this->get_cache('role'), - 'ftype' => $ftype, - 'result' => $result, - 'relatedid' => $this->relatedid, - 'relatedname' => $this->relatedname, - )); - $this->template->display('field_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->field_model->get($id); - if (!$data) { - $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - } - - $page = (int)$this->input->post('page'); - $ftype = $this->dfield->type(); - $result = $code = ''; - - if (IS_POST) { - $_data = $data; - $data = $this->input->post('data'); - $field = $this->dfield->get($_data['fieldtype']); - if (!$field) { - $page = 0; - $result = fc_lang('字段类别不存在'); - } elseif (!$data['name']) { - $page = 0; - $code = 'name'; - } else { - $this->clear_cache($this->cacheuri); - $this->field_model->edit($_data, $data, $field->alter_sql($_data['fieldname'], $data['setting']['option'])); - $this->system_log('修改'.$this->name.'【'.$_data['fieldname'].'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功'), dr_url('field/index', array('rname' => $this->relatedname, 'rid' => $this->relatedid)), 1); - } - $data['fieldname'] = $_data['fieldname']; - $data['fieldtype'] = $_data['fieldtype']; - - } - - $this->template->assign(array( - 'id' => $id, - 'page' => $page, - 'code' => $code, - 'data' => $data, - 'role' => $this->get_cache('role'), - 'ftype' => $ftype, - 'result' => $result, - 'relatedid' => $this->relatedid, - 'relatedname' => $this->relatedname, - )); - $this->template->display('field_add.html'); - } - - /** - * 通用操作 - */ - public function option() { - - $id = (int)$this->input->get('id'); - $data = $this->db->where('id', $id)->limit(1)->get('field')->row_array(); - switch ($this->input->get('op')) { - case 'disabled': - $value = $data['disabled'] == 1 ? 0 : 1; - $this->db->where('id', $id)->update('field', array('disabled' => $value)); - $this->system_log(($value ? '禁用' : '启用').$this->name.'【'.$data['fieldname'].'】'); // 记录日志 - $this->clear_cache($this->cacheuri); - exit(dr_json(1, fc_lang('操作成功'))); - break; - case 'xss': - $data['setting'] = dr_string2array($data['setting']); - $data['setting']['validate']['xss'] = $value = $data['setting']['validate']['xss'] ? 0 : 1; - $this->db->where('id', $id)->update('field', array( - 'setting' => dr_array2string($data['setting']) - )); - $this->system_log($this->name.'【'.$data['fieldname'].'】'.($value ? '开启XSS' : '关闭XSS')); // 记录日志 - break; - case 'member': - $value = $data['ismember'] ? 0 : 1; - $this->db->where('id', $id)->update('field', array( - 'ismember' => $value - )); - $this->system_log($this->name.'【'.$data['fieldname'].'】'.($value ? '前端显示' : '前端隐藏')); // 记录日志 - break; - } - - $this->clear_cache($this->cacheuri); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('admin/field/index', array('rname'=>$this->relatedname, 'rid'=>$this->relatedid)), 1); - } - - /** - * 删除 - */ - public function del() { - - $id = (int)$this->input->get('id'); - $this->field_model->del(array($id)); - $this->system_log('删除'.$this->name.'【#'.$id.'】'); // 记录日志 - $this->clear_cache($this->cacheuri); - - exit(dr_json(1, fc_lang('操作成功'))); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Form.php b/finecms/finecms/dayrui/controllers/admin/Form.php deleted file mode 100644 index 4fcc573..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Form.php +++ /dev/null @@ -1,112 +0,0 @@ -load->model('form_model'); - } - - /** - * 管理 - */ - public function index() { - $this->template->assign(array( - 'list' => $this->db->get($this->form_model->prefix)->result_array(), - 'menu' => $this->get_menu_v3(array( - fc_lang('表单管理') => array('admin/form/index', 'table'), - fc_lang('添加') => array('admin/form/add', 'plus') - )), - )); - $this->template->display('form_index.html'); - } - - /** - * 添加 - */ - public function add() { - - if (IS_POST) { - $data = $this->input->post('data'); - $result = $this->form_model->add($data); - if ($result === TRUE) { - $this->form_model->cache(); - $this->system_log('添加网站表单【#'.$data['table'].'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('form/index'), 1); - } - } - - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('表单管理') => array('admin/form/index', 'table'), - fc_lang('添加') => array('admin/form/add', 'plus'), - fc_lang('更新缓存') => array('admin/form/cache', 'refresh'), - )), - 'data' => $data, - 'result' => $result, - )); - $this->template->display('form_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->db->where('id', $id)->limit(1)->get($this->form_model->prefix)->row_array(); - if (!$data) { - $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - } - - if (IS_POST) { - $this->system_log('修改网站表单【#'.$data['table'].'】'); // 记录日志 - $data = $this->input->post('data'); - $this->form_model->edit($id, $data); - $this->form_model->cache(); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('form/index'), 1); - } - - $data['setting'] = dr_string2array($data['setting']); - - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('表单管理') => array('admin/form/index', 'table'), - fc_lang('添加') => array('admin/form/add', 'plus'), - fc_lang('更新缓存') => array('admin/form/cache', 'refresh'), - )), - 'data' => $data, - )); - $this->template->display('form_add.html'); - } - - /** - * 删除 - */ - public function del() { - $id = (int)$this->input->get('id'); - $this->form_model->del($id); - $this->system_log('删除网站表单【#'.$id.'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('form/index'), 1); - } - - - /** - * 缓存 - */ - public function cache() { - $this->form_model->cache($site = isset($_GET['site']) && $_GET['site'] ? (int)$_GET['site'] : SITE_ID); - (int)$_GET['admin'] or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Home.php b/finecms/finecms/dayrui/controllers/admin/Home.php deleted file mode 100644 index 608d3f0..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Home.php +++ /dev/null @@ -1,324 +0,0 @@ -output->enable_profiler(FALSE); - } - - /** - * 重置 - */ - public function home() { - $this->index(); - } - - /** - * 首页 - */ - public function index() { - - $top = array(); - $smenu = $this->_get_menu(); - $topid = 0; // 顶部菜单id - $top_menu = array(); // 生成的菜单 - foreach ($smenu as $ii => $t) { - //$string.= '
  • '.$t['top']['name'].'

  • '; - $_link = 0; // 是否第一个链接菜单,0表示第一个 - $_left = 0; // 是否第一个分组菜单,0表示第一个 - $string = ''; - foreach ($t['data'] as $left) { - $string.= ''; - $top_menu[$ii] = $string; - } - unset($t['top']['left']); - $top[$topid] = $t['top']; - $topid ++; - } - - $mysite = array(); - foreach ($this->site_info as $sid => $t) { - $mysite[$sid] = $t['SITE_NAME']; - } - - ob_start(); - ob_clean(); - $this->template->assign(array( - 'mysite' => $mysite, - 'top' => $top, - 'left' => $top_menu, - )); - - $this->template->display('index.html'); - } - - /** - * 菜单缓存格式化 - */ - private function _get_menu() { - - $menu = require WEBPATH.'config/admin_menu.php'; - $smenu = array(); - foreach ($menu as $i => $t) { - $left = array(); - $t['id'] = $i; - $t['pid'] = 0; - $t['tid'] = 0; - foreach ($t['menu'] as $j => $m) { - $m['id'] = $i.'-'.$j; - $m['pid'] = $i; - $m['tid'] = $i; - $link = array(); - if ($m['mark'] == 'content-content') { - // 表单模型 - $form = $this->dcache->get('form-'.SITE_ID); - if ($form) { - $mmm = array(); - foreach ($form as $mm) { - $mmm[] = array( - 'name' => $mm['name'].'表单', - 'uri' => 'fcontent/index/mid/'.$mm['table'], - 'icon' => 'fa fa-circle-o', - ); - } - foreach ($m['menu'] as $n) { - $mmm[] = $n; - } - $m['menu'] = $mmm; - } - // 表示内容模型的 - $module = $this->dcache->get('module'); - if ($module) { - $mmm = array(); - foreach ($module as $mm) { - $mmm[] = array( - 'name' => $mm['name'].'管理', - 'uri' => 'content/index/mid/'.$mm['dirname'], - 'icon' => 'fa fa-circle-o', - ); - } - foreach ($m['menu'] as $n) { - $mmm[] = $n; - } - $m['menu'] = $mmm; - } - } elseif ($m['mark'] == 'app') { - $local = $this->local_app(); - if ($local) { - foreach ($local as $tt) { - if ($tt['menu']) { - foreach ($tt['menu'] as $curi => $cv) { - $m['menu'][] = array( - 'name' => $cv[0], - 'uri' => $curi, - 'icon' => $cv[1], - ); - } - } - } - } - } - if (is_array($m['menu'])) { - foreach ($m['menu'] as $k => $n) { - $n['id'] = $i.'-'.$j.'-'.$k; - $n['pid'] = $i.'-'.$j; - $n['tid'] = $i; - if ($n['uri']) { - $n['url'] = $this->duri->uri2url($n['uri']); - } - - $link[] = $n; - } - } - if ($link) { - $left[] = array('left' => $m, 'data' => $link); - } - - } - if ($left) { - $smenu[$i] = array('top' => $t, 'data' => $left); - } - } - - return $smenu; - } - - - /** - * 后台首页 - */ - public function main() { - - if (is_file(WEBPATH.'cache/install.new')) { - @unlink(WEBPATH.'cache/install.new'); - $this->cache(); - return; - } - $data = $this->customer_model->getCustomerTime(); - $date = time(); - $customerInfo = []; - - foreach ( $data as $k => $v) { - if($v['saleTime']) { - $meet = ($date - strtotime($v['saleTime']))/(24*60*60); - if($meet > $v['meetTime']) { - $customerInfo[] = $v; - } - } - - } - $debtData = $this->customer_model->getCustomerDebt(); - $debtInfo = []; - foreach ( $debtData as $k => $v) { - if($v['saleTime'] || $v['alldebt'] > 0) { - $meet = ($date - strtotime($v['saleTime']))/(24*60*60); - if($meet > $v['debtTime']) { - $debtInfo[] = $v; - } - } - - } - $server = @explode(' ', strtolower($_SERVER['SERVER_SOFTWARE'])); - if (isset($server[0]) && $server[0]) { - $server = dr_strcut($server[0], 15); - } else { - $server = 'web'; - } - - $this->template->assign(array( - 'sip' => $this->_get_server_ip(), - 'mymain' => 1, - 'customerInfo' => $customerInfo, - 'server' => ucfirst($server), - 'sqlversion' => $this->db->version(), - )); - $this->template->display('main.html'); - } - - /** - * 更新全站缓存 - */ - public function cache() { - - $this->system_log('更新全站缓存'); - - $this->template->assign(array( - 'app' => array(), - 'list' => $this->_cache_url(), - )); - $this->template->display('cache.html'); - - } - - // 清除缓存数据 - public function clear() { - if (IS_AJAX || $this->input->get('todo')) { - $this->_clear_data(); - if (!IS_AJAX) { - $this->admin_msg(fc_lang('全站缓存数据更新成功'), '', 1); - } - } else { - $this->admin_msg('Clear ... ', dr_url('home/clear', array('todo' => 1)), 2); - } - } - - - // 更新表结构 - public function dbcache() { - if (IS_AJAX || $this->input->get('todo')) { - $this->dcache->delete('table'); - $this->system_model->cache(); - if (!IS_AJAX) { - $this->admin_msg(fc_lang('数据表结构缓存更新成功'), '', 1); - } - } else { - $this->admin_msg('Clear ... ', dr_url('home/dbcache', array('todo' => 1)), 2); - } - } - - // 域名检查 - public function domain() { - $ip = $this->_get_server_ip(); - $domain = $this->input->get('domain'); - if (gethostbyname($domain) != $ip) { - exit(fc_lang('请将域名【%s】解析到【%s】', $domain, $ip)); - } - exit(''); - } - - // 清除缓存数据 - private function _clear_data() { - - // 删除全部缓存文件 - $this->load->helper('file'); - delete_files(WEBPATH.'cache/sql/'); - delete_files(WEBPATH.'cache/file/'); - delete_files(WEBPATH.'cache/page/'); - delete_files(WEBPATH.'cache/index/'); - delete_files(WEBPATH.'cache/templates/'); - - - // 重置Zend OPcache - function_exists('opcache_reset') && opcache_reset(); - - } - - function mbonline() { - - $this->template->assign(array( - 'url' => 'http://api.poscms.net/shop/search-template-v-1-cxbb-1-iscms-1.html', - )); - $this->template->display('online.html'); - } - - function cjonline() { - - $this->template->assign(array( - 'url' => 'http://api.poscms.net/shop/search-app-v-1-cxbb-1-iscms-1.html', - )); - $this->template->display('online.html'); - } - - function helponline() { - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - '帮助手册' => array('admin/home/helponline', 'book'), - )), - )); - $this->template->display('help.html'); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Linkage.php b/finecms/finecms/dayrui/controllers/admin/Linkage.php deleted file mode 100644 index 167d623..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Linkage.php +++ /dev/null @@ -1,323 +0,0 @@ -load->model('linkage_model'); - } - - /** - * index - */ - public function index() { - - if (IS_POST) { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } elseif (!$this->is_auth('admin/linkage/del')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - $this->db->where_in('id', $ids)->delete('linkage'); - foreach ($ids as $key) { - $this->db->query('DROP TABLE `'.$this->db->dbprefix('linkage_data_'.$key).'`'); - $this->system_log('删除联动菜单【#'.$key.'】'); // 记录日志 - } - exit(dr_json(1, fc_lang('操作成功'))); - } - - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('联动菜单') => array(APP_DIR.'/admin/linkage/index', 'windows'), - fc_lang('添加') => array(APP_DIR.'/admin/linkage/add_js', 'plus'), - fc_lang('更新缓存') => array(APP_DIR.'/admin/linkage/cache', 'refresh'), - )), - 'list' => $this->linkage_model->get_data(), - 'dt_data' => array( - 1 => '省级', - 2 => '省市', - 3 => '省市县', - ), - )); - $this->template->display('linkage_index.html'); - } - - /** - * 添加 - */ - public function add() { - - if (IS_POST) { - $result = $this->linkage_model->add($this->input->post('data')); - if (is_array($result)) { - exit(dr_json(0, $result['error'], $result['name'])); - } else { - $this->system_log('添加联动菜单【#'.$result.'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - - $this->template->display('linkage_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->linkage_model->get($id); - if (!$data) { - exit(fc_lang('对不起,数据被删除或者查询不存在')); - } - - if (IS_POST) { - $result = $this->linkage_model->edit($id, $this->input->post('data')); - if (is_array($result)) { - exit(dr_json(0, $result['error'], $result['name'])); - } else { - $this->system_log('修改联动菜单【#'.$id.'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - - $this->template->assign(array( - 'data' => $data, - )); - $this->template->display('linkage_add.html'); - } - - /** - * 菜单 - */ - public function data() { - - $key = (int)$this->input->get('key'); - $pid = (int)$this->input->get('pid'); - $link = $this->linkage_model->get($key); - if (!$link) { - $this->admin_msg(fc_lang('联动菜单不存在!')); - } - - if (IS_POST) { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - if ($this->input->post('action') == 'order') { - $data = $this->input->post('data'); - foreach ($ids as $id) { - $this->db->where('id', (int)$id)->update('linkage_data_'.$key, $data[$id]); - } - $this->system_log('排序联动菜单【#'.$key.'】数据值【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功'))); - } elseif ($this->input->post('action') == 'move') { - $pid = (int)$this->input->post('pid'); - foreach ($ids as $id) { - $this->db->where('id', (int)$id)->update('linkage_data_'.$key, array('pid' => $pid)); - } - $this->system_log('移动分类联动菜单【#'.$key.'】数据值【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功'))); - } else { - if (!$this->is_auth(APP_DIR.'/admin/linkage/del')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - $delete = ''; - foreach ($ids as $id) { - $data = $this->db->where('id', $id)->get('linkage_data_'.$key)->row_array(); - if ($data['childids']) { - $delete.= $data['childids'].','; - } - } - $delete = trim($delete, ','); - if ($delete) { - $this->db->query("delete from {$this->db->dbprefix('linkage_data_'.$key)} where id in ($delete)"); - $this->linkage_model->repair($key); - } - $this->system_log('删联动菜单【#'.$key.'】数据值【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功'))); - } - } - $this->template->assign(array( - 'key' => $key, - 'pid' => $pid, - 'list' => $this->linkage_model->get_list_data($link, $pid), - 'menu' => $this->get_menu_v3(array( - lang('返回') => array(APP_DIR.'/admin/linkage/index', 'reply'), - fc_lang('联动菜单') => array(APP_DIR.'/admin/linkage/data/key/'.$key, 'windows'), - fc_lang('添加') => array(APP_DIR.'/admin/linkage/adds/key/'.$key.'_js', 'plus'), - )), - 'select' => $this->select_linkage($this->linkage_model->get_list_data($link), 0, 'name=\'pid\'', fc_lang('顶级菜单')), - )); - $this->template->display('linkage_data.html'); - } - - /** - * 添加 - */ - public function adds() { - - $pid = (int)$this->input->get('pid'); - $key = (int)$this->input->get('key'); - $link = $this->linkage_model->get($key); - if (!$link) { - exit(fc_lang('联动菜单不存在!')); - } - - if (IS_POST) { - $result = $this->linkage_model->adds($key, $this->input->post('data')); - if (is_array($result)) { - exit(dr_json(0, $result['error'], $result['name'])); - } else { - $this->system_log('添加联动菜单【#'.$key.'】数据值'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - $this->template->assign(array( - 'select' => $this->select_linkage($this->linkage_model->get_list_data($link), $pid, 'name=\'data[pid]\'', fc_lang('顶级菜单')), - )); - $this->template->display('linkage_adds.html'); - } - - /** - * 修改 - */ - public function edits() { - - $id = (int)$this->input->get('id'); - $key = (int)$this->input->get('key'); - $link = $this->linkage_model->get($key); - if (!$link) { - exit(fc_lang('联动菜单不存在!')); - } - $data = $this->linkage_model->gets($id, $key); - if (!$data) { - exit(fc_lang('对不起,数据被删除或者查询不存在')); - } - - if (IS_POST) { - $edit = $this->input->post('data'); - $edit['pid'] = $edit['pid'] == $id ? $data['pid'] : $edit['pid']; - $result = $this->linkage_model->edits($key, $id, $edit); - if (is_array($result)) { - exit(dr_json(0, $result['error'], $result['name'])); - } else { - $this->system_log('修改联动菜单【#'.$key.'】数据值【#'.$id.'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - exit; - } - - $this->template->assign(array( - 'data' => $data, - 'select' => $this->select_linkage($this->linkage_model->get_list_data($link), $data['pid'], 'name=\'data[pid]\'', fc_lang('顶级菜单')), - )); - $this->template->display('linkage_adds.html'); - } - - // 设置隐藏 - public function hidden() { - - $id = (int)$this->input->get('id'); - $key = (int)$this->input->get('key'); - $link = $this->linkage_model->get($key); - if (!$link) { - exit(fc_lang('联动菜单不存在!')); - } - $data = $this->linkage_model->gets($id, $key); - if (!$data) { - exit(fc_lang('对不起,数据被删除或者查询不存在')); - } - - $this->db->where('id IN ('.$data['childids'].')')->update('linkage_data_'.$key, array( - 'hidden' => $data['hidden'] ? 0 : 1, - )); - $this->system_log('更新联动菜单【#'.$key.'-'.$data['name'].'】显示状态'); // 记录日志 - $this->admin_msg(fc_lang('操作成功'), dr_url('linkage/data', array('key'=>$key)), 1); - } - - /** - * 导入联动数据 - */ - public function import() { - if ($this->input->get('admin')) { - - $id = (int)$_GET['id']; - $lid = (int)$_GET['lid']; - !is_file(FCPATH.'dayrui/libraries/Linkage/'.$id.'.php') && $this->admin_msg(fc_lang('数据文件不存在无法导入')); - - // 清空数据 - $table = 'linkage_data_'.$lid; - $this->db->query('TRUNCATE `'.$this->db->dbprefix($table).'`'); - $count = 0; - - // 开始导入 - $data = require FCPATH.'dayrui/libraries/Linkage/'.$id.'.php'; - foreach ($data as $t) { - $rt = $this->db->insert($table, $t); - if ($rt) { - $count++; - } - } - - $this->admin_msg(fc_lang('共%s条数据,导入成功%s条', count($data), $count), dr_url('linkage/index'), 1); - } else { - $this->admin_msg('导入中 ... ', dr_url('linkage/import', array('admin' => 1, 'id' => $_GET['id'], 'lid' => $_GET['lid'])), 2, 0); - } - } - - /** - * 缓存 - */ - public function cache() { - $this->linkage_model->cache(isset($_GET['site']) && $_GET['site'] ? (int)$_GET['site'] : SITE_ID); - (int)$_GET['admin'] or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } - - /** - * 栏目选择 - * - * @param array $data 栏目数据 - * @param intval/array $id 被选中的ID,多选是可以是数组 - * @param string $str 属性 - * @param string $default 默认选项 - * @return string - */ - public function select_linkage($data, $id = 0, $str = '', $default = ' -- ') { - $tree = array(); - $string = ''; - return $string; - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Login.php b/finecms/finecms/dayrui/controllers/admin/Login.php deleted file mode 100644 index 60cb5ff..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Login.php +++ /dev/null @@ -1,91 +0,0 @@ -output->enable_profiler(FALSE); - } - - public function index() { - - - $id = 0; - $error = ''; - - if (IS_POST) { - if (SITE_ADMIN_CODE && !$this->check_captcha('code')) { - $error = fc_lang('验证码不正确'); - } else { - $u = $this->input->post('username', true); - $p = $this->input->post('password', true); - $uid = $this->member_model->admin_login($u, $p); - if ($uid > 0) { - $url = $this->input->get('backurl') ? urldecode($this->input->get('backurl', true)) : dr_url('home'); - $url = pathinfo($url); - $url = $url['basename'] ? $url['basename'] : SELF; - $this->admin_msg(fc_lang('登录成功'), $url, 1); - } - - $this->system_log('登录后台失败,账号【'.$u.'】,密码【'.$p.'】', 1); - if ($uid == -1) { - $id = 1; - $error = fc_lang('会员['.$u.']不存在'); - } elseif ($uid == -2) { - $error = fc_lang('密码['.$p.']不正确'); - } elseif ($uid == -3) { - $error = fc_lang('您无权限登录管理平台'); - } elseif ($uid == -4) { - $error = fc_lang('您无权限登录该站点'); - } else { - $error = fc_lang('未定义的操作'); - } - } - } - - $this->template->assign('id', $id); - $this->template->assign('error', $error); - $this->template->assign('username', $this->input->post('username', TRUE)); - $this->template->display('login.html'); - } - - public function ajax() { - - $data = $this->input->post('data', TRUE); - $uid = $this->member_model->admin_login($data['username'], $data['password']); - if ($uid > 0) { - set_cookie('finecms-admin-login', $data['username'], 999999); - exit(dr_json(1, 1, 1)); - } - if ($uid == -1) { - $error = fc_lang('会员不存在'); - exit(dr_json(0, $error, 'username')); - } elseif ($uid == -2) { - $error = fc_lang('密码不正确'); - exit(dr_json(0, $error, 'password')); - } elseif ($uid == -3) { - $error = fc_lang('您无权限登录管理平台'); - exit(dr_json(0, $error, 'username')); - } elseif ($uid == -4) { - $error = fc_lang('您无权限登录该站点'); - exit(dr_json(0, $error, 'username')); - } else { - $error = fc_lang('未定义的操作'); - exit(dr_json(0, $error, 'username')); - } - - } - - public function logout() { - $this->session->unset_userdata('admin'); - $this->session->unset_userdata('siteid'); - $this->admin_msg(fc_lang('您已经安全退出系统了'), dr_url(''), 1); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Mail.php b/finecms/finecms/dayrui/controllers/admin/Mail.php deleted file mode 100644 index c3dfb79..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Mail.php +++ /dev/null @@ -1,189 +0,0 @@ -template->assign('menu', $this->get_menu_v3(array( - fc_lang('邮件系统') => array('admin/mail/index', 'envelope'), - fc_lang('添加SMTP') => array('admin/mail/add_js', 'plus'), - fc_lang('错误日志') => array('admin/mail/log', 'calendar'), - ))); - // 缓存文件名称 - $this->cache_file = md5('sendmail'.$this->uid.$this->input->ip_address().$this->input->user_agent()); - } - - /** - * 管理 - */ - public function index() { - - if (IS_POST) { - $ids = $this->input->post('ids'); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - if ($this->input->post('action') == 'del') { - // 删除邮件配置 - if (!$this->is_auth('admin/mail/del')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - $this->db->where_in('id', $ids)->delete('mail_smtp'); - $this->system_log('删除邮件服务器【#'.@implode(',', $ids).'】'); // 记录日志 - } else { - // 更新排序号 - if (!$this->is_auth('admin/mail/edit')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - $data = $this->input->post('data'); - foreach ($ids as $id) { - $this->db->where('id', $id)->update('mail_smtp', array('displayorder' => (int)$data[$id])); - } - $this->system_log('排序邮件服务器【#'.@implode(',', $ids).'】'); // 记录日志 - } - - $this->cache(1); - exit(dr_json(1, fc_lang('操作成功'))); - } - - $this->template->assign(array( - 'list' => $this->db->order_by('displayorder asc')->get('mail_smtp')->result_array(), - )); - $this->template->display('mail_index.html'); - } - - /** - * 添加 - */ - public function add() { - - if (IS_POST) { - $data = $this->input->post('data'); - $data['port'] = (int)$data['port']; - $data['displayorder'] = 0; - $this->db->insert('mail_smtp', $data); - $this->system_log('添加邮件服务器【#'.$this->db->insert_id().'】'.$data['host']); // 记录日志 - $this->cache(1); - exit(dr_json(1, fc_lang('操作成功'), '')); - } - - $this->template->display('mail_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->db->where('id', $id)->limit(1)->get('mail_smtp')->row_array(); - if (!$data) { - exit(fc_lang('对不起,数据被删除或者查询不存在')); - } - - if (IS_POST) { - $data = $this->input->post('data'); - $data['port'] = (int)$data['port']; - if ($data['pass'] == '******') { - unset($data['pass']); - } - $this->db->where('id', $id)->update('mail_smtp', $data); - $this->system_log('修改邮件服务器【#'.$id.'】'.$data['host']); // 记录日志 - $this->cache(1); - exit(dr_json(1, fc_lang('操作成功'), '')); - } - - $this->template->assign(array( - 'data' => $data, - )); - $this->template->display('mail_add.html'); - } - - /** - * 日志 - */ - public function log() { - - if (IS_POST) { - @unlink(WEBPATH.'cache/mail_error.log'); - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - $data = $list = array(); - $file = @file_get_contents(WEBPATH.'cache/mail_error.log'); - if ($file) { - $data = explode(PHP_EOL, $file); - $data = $data ? array_reverse($data) : array(); - unset($data[0]); - $page = max(1, (int)$this->input->get('page')); - $limit = ($page - 1) * SITE_ADMIN_PAGESIZE; - $i = $j = 0; - foreach ($data as $v) { - if ($i >= $limit && $j < SITE_ADMIN_PAGESIZE) { - $list[] = $v; - $j ++; - } - $i ++; - } - } - - $total = count($data); - $this->template->assign(array( - 'list' => $list, - 'total' => $total, - 'pages' => $this->get_pagination(dr_url('mail/log'), $total) - )); - $this->template->display('mail_log.html'); - } - - /** - * test - */ - public function test() { - - $id = (int)$this->input->get('id'); - $data = $this->db - ->where('id', $id) - ->limit(1) - ->get('mail_smtp') - ->row_array(); - if (!$data) { - exit(fc_lang('对不起,数据被删除或者查询不存在')); - } - - $this->load->library('Dmail'); - $this->dmail->set(array( - 'host' => $data['host'], - 'user' => $data['user'], - 'pass' => $data['pass'], - 'port' => $data['port'], - 'from' => $data['user'] - )); - - if ($this->dmail->send(SYS_EMAIL, 'test', 'test for '.SITE_NAME)) { - echo 'ok'; - } else { - echo 'Error: '.$this->dmail->error(); - } - } - - /** - * 缓存 - */ - public function cache($update = 0) { - $this->system_model->email(); - ((int)$_GET['admin'] || $update) or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Member.php b/finecms/finecms/dayrui/controllers/admin/Member.php deleted file mode 100644 index 8682efd..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Member.php +++ /dev/null @@ -1,280 +0,0 @@ -template->assign('menu', $this->get_menu_v3(array( - fc_lang('会员管理') => array('admin/member/index', 'user'), - fc_lang('添加') => array('admin/member/add_js', 'plus') - ))); - } - - /** - * 首页 - */ - public function index() { - - if (IS_POST && $this->input->post('action')) { - - // ID格式判断 - $ids = $this->input->post('ids'); - !$ids && exit(dr_json(0, fc_lang('您还没有选择呢'))); - - if ($this->input->post('action') == 'del') { - // 删除 - !$this->is_auth('member/admin/home/del') && exit(dr_json(0, fc_lang('您无权限操作'))); - $this->member_model->delete($ids); - defined('UCSSO_API') && ucsso_delete($ids); - $this->system_log('删除会员【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } else { - // 修改会员组 - !$this->is_auth('member/admin/home/edit') && exit(dr_json(0, fc_lang('您无权限操作'))); - $gid = (int)$this->input->post('groupid'); - $note = fc_lang('您的会员组由管理员%s改变成:%s', $this->member['username'], $this->get_cache('member', 'group', $gid, 'name')); - $this->db->where_in('uid', $ids)->update('member', array('groupid' => $gid)); - - foreach ($ids as $uid) { - // 会员组升级挂钩点 - $this->hooks->call_hook('member_group_upgrade', array('uid' => $uid, 'groupid' => $gid)); - // 表示审核会员 - $this->member_model->update_admin_notice('member/admin/home/index/field/uid/keyword/'.$uid, 3); - } - $this->system_log('修改会员【#'.@implode(',', $ids).'】的会员组'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - - // 重置页数和统计 - IS_POST && $_GET['page'] = $_GET['total'] = 0; - - // 根据参数筛选结果 - $param = $this->input->get(NULL, TRUE); - unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']); - - // 数据库中分页查询 - list($data, $param) = $this->member_model->limit_page($param, max((int)$_GET['page'], 1), (int)$_GET['total']); - - - $field = $this->get_cache('member', 'field'); - $field = array( - 'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')), - 'name' => array('fieldname' => 'name','name' => fc_lang('姓名')), - 'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')), - 'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')), - ) + ($field ? $field : array()); - - // 存储当前页URL - $this->_set_back_url('member/index', $param); - - $this->template->assign(array( - 'list' => $data, - 'field' => $field, - 'param' => $param, - 'pages' => $this->get_pagination(dr_url('member/index', $param), $param['total']), - )); - $this->template->display('member_index.html'); - } - - /** - * 添加 - */ - public function add() { - - - $MEMBER = $this->get_cache('member'); - - if (IS_POST) { - - $all = $this->input->post('all'); - $info = $this->input->post('info'); - $data = $this->input->post('data'); - - - if ($all) { - // 批量添加 - !$info && exit(dr_json(0, fc_lang('批量注册信息填写不完整'), 'info')); - $data = explode(PHP_EOL, $info); - $success = $error = 0; - foreach ($data as $t) { - list($username, $password, $email, $phone) = explode('|', $t); - if ($username || $password || $email || $phone) { - $uid = $this->member_model->register(array( - 'phone' => $phone, - 'email' => $email, - 'username' => $username, - 'password' => trim($password), - ), $data['groupid']); - if ($uid > 0) { - $success ++; - $this->system_log('添加会员【#'.$uid.'】'.$username); // 记录日志 - } else { - $error ++; - } - } - } - exit(dr_json(1, fc_lang('批量注册成功%s,失败%s', $success, $error))); - } else { - // 单个添加 - $uid = $this->member_model->register(array( - 'email' => $data['email'], - 'phone' => $data['phone'] ? $data['phone'] : '', - 'username' => $data['username'], - 'password' => trim($data['password']), - ), $data['groupid']); - if ($uid == -1) { - exit(dr_json(0, fc_lang('该会员【%s】已经被注册', $data['username']), 'username')); - } elseif ($uid == -2) { - exit(dr_json(0, fc_lang('邮箱格式不正确'), 'email')); - } elseif ($uid == -3) { - exit(dr_json(0, fc_lang('该邮箱【%s】已经被注册', $data['email']), 'email')); - } elseif ($uid == -4) { - exit(dr_json(0, fc_lang('同一IP在限制时间内注册过多'), 'username')); - } elseif ($uid == -5) { - exit(dr_json(0, fc_lang('Ucenter:会员名称不合法'), 'username')); - } elseif ($uid == -6) { - exit(dr_json(0, fc_lang('Ucenter:包含不允许注册的词语'), 'username')); - } elseif ($uid == -7) { - exit(dr_json(0, fc_lang('Ucenter:Email格式有误'), 'username')); - } elseif ($uid == -8) { - exit(dr_json(0, fc_lang('Ucenter:Email不允许注册'), 'username')); - } elseif ($uid == -9) { - exit(dr_json(0, fc_lang('Ucenter:Email已经被注册'), 'username')); - } elseif ($uid == -10) { - exit(dr_json(0, fc_lang('手机号码必须是11位的整数'), 'phone')); - } elseif ($uid == -11) { - exit(dr_json(0, fc_lang('该手机号码已经注册'), 'phone')); - } else { - $this->system_log('添加会员【#'.$uid.'】'.$data['username']); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - } - - $this->template->display('member_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $uid = (int)$this->input->get('uid'); - $page = (int)$this->input->get('page'); - $data = $this->member_model->get_member($uid); - - !$data && $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - - $field = array(); - $MEMBER = $this->get_cache('member'); - - - if ($MEMBER['field']) { - foreach ($MEMBER['field'] as $t) { - $field[] = $t; - } - } - - if (IS_POST) { - $edit = $this->input->post('member'); - $page = (int)$this->input->post('page'); - $post = $this->validate_filter($field, $data); - if (isset($post['error'])) { - $error = $post['msg']; - } else { - $post[1]['uid'] = $uid; - $post[1]['is_auth'] = (int)$data['is_auth']; - $post[1]['complete'] = (int)$data['complete']; - $this->db->replace('member_data', $post[1]); - $this->attachment_handle($uid, $this->db->dbprefix('member').'-'.$uid, $field, $data); - $update = array( - 'name' => $edit['name'], - 'phone' => $edit['phone'], - 'groupid' => $edit['groupid'], - ); - // 修改密码 - $edit['password'] = trim($edit['password']); - if ($edit['password']) { - if (defined('UCSSO_API')) { - $rt = ucsso_edit_password($uid, $edit['password']); - // 修改失败 - if (!$rt['code']) { - $this->admin_msg(fc_lang($rt['msg'])); - } - } - $update['password'] = md5(md5($edit['password']).$data['salt'].md5($edit['password'])); - $this->member_model->add_notice($uid, 1, fc_lang('您的密码被管理员%s修改了', $this->member['username'])); - $this->system_log('修改会员【'.$data['username'].'】密码'); // 记录日志 - } - // 修改邮箱 - if ($edit['email'] != $data['email']) { - !preg_match('/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/', $edit['email']) && $this->admin_msg(fc_lang('邮箱格式不正确')); - $this->db->where('email', $edit['email'])->where('uid<>', $uid)->count_all_results('member') && $this->admin_msg(fc_lang('该邮箱【%s】已经被注册', $edit['email'])); - - if (defined('UCSSO_API')) { - $rt = ucsso_edit_email($uid, $edit['email']); - // 修改失败 - if (!$rt['code']) { - $this->admin_msg(fc_lang($rt['msg'])); - } - } - $update['email'] = $edit['email']; - $this->member_model->add_notice($uid, 1, fc_lang('您的注册邮箱被管理员%s修改了', $this->member['username'])); - $this->system_log('修改会员【'.$data['username'].'】邮箱'); // 记录日志 - } - // 修改手机 - if ($edit['phone'] != $data['phone']) { - if (defined('UCSSO_API')) { - $rt = ucsso_edit_phone($uid, $edit['phone']); - // 修改失败 - if (!$rt['code']) { - $this->admin_msg(fc_lang($rt['msg'])); - } - } - } - $this->db->where('uid', $uid)->update('member', $update); - - $this->system_log('修改会员【'.$data['username'].'】资料'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('member/edit', array('uid' => $uid, 'page' => $page)), 1); - } - $this->admin_msg($error, dr_url('member/edit', array('uid' => $uid, 'page' => $page))); - } - - $this->template->assign(array( - 'data' => $data, - 'page' => $page, - 'myfield' => $this->field_input($field, $data, TRUE), - )); - $this->template->display('member_edit.html'); - } - - public function ajax_email() { - - $uid = (int)$this->input->get('uid'); - $email = $this->input->get('email'); - - if (!$email || !preg_match('/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/', $email)) { - exit(fc_lang('邮箱格式不正确')); - } elseif ($this->db->where('email', $email)->where('uid<>', $uid)->count_all_results('member')) { - exit(fc_lang('该邮箱【%s】已经被注册', $email)); - } - - exit(0); - } - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Member_setting.php b/finecms/finecms/dayrui/controllers/admin/Member_setting.php deleted file mode 100644 index dd62ea5..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Member_setting.php +++ /dev/null @@ -1,91 +0,0 @@ -input->get('page'); - $result = 0; - - if (IS_POST) { - $post = $this->input->post('data', true); - $page = (int)$this->input->post('page'); - $this->member_model->member($post); - $data = $post; - $cache = $this->member_model->cache(); - $result = 1; - $this->system_log('会员配置'); // 记录日志 - } else { - $cache = $this->member_model->cache(); - $data = $cache['setting']; - } - - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('功能配置') => array('member_setting/index', 'cog') - )), - 'data' => $data, - 'page' => $page, - 'result' => $result, - 'synurl' => $cache['synurl'], - )); - $this->template->display('setting_index.html'); - } - - - /** - * OAuth2授权登录 - */ - public function oauth() { - - $oauth = array('qq' => 'QQ', 'sina' => '微博', 'weixin' => '微信'); // - $this->load->library('dconfig'); - $config = require WEBPATH.'config/oauth.php'; - - if (IS_POST) { - $cfg = array(); - $data = $this->input->post('data'); - foreach ($oauth as $i => $name) { - $cfg[$i] = array( - 'key' => trim($data['key'][$i]), - 'use' => isset($data['use'][$i]) ? 1 : 0, - 'name' => $config[$i]['name'] ? $config[$i]['name'] : $name, - 'icon' => $config[$i]['icon'] ? $config[$i]['icon'] : $i, - 'secret' => trim($data['secret'][$i]) - ); - } - $this->dconfig->file(WEBPATH.'config/oauth.php')->note('OAuth2授权登录')->to_require($cfg); - $config = $cfg; - $this->system_log('快捷登录配置'); // 记录日志 - $this->template->assign('result', fc_lang('配置文件更新成功')); - } - - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - 'OAuth' => array('member/admin/setting/oauth', 'weibo'), - )), - 'data' => $config, - 'oauth' => $oauth - )); - $this->template->display('setting_oauth.html'); - } - - /** - * 缓存 - */ - public function cache() { - $site = $this->input->get('site') ? $this->input->get('site') : SITE_ID; - $admin = (int)$this->input->get('admin'); - $this->member_model->cache($site); - $admin or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Module.php b/finecms/finecms/dayrui/controllers/admin/Module.php deleted file mode 100644 index a703a85..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Module.php +++ /dev/null @@ -1,133 +0,0 @@ -_menu = array( - fc_lang('模型管理') => array('admin/module/index', 'cogs'), - ); - $this->template->assign(array( - 'menu' => $this->get_menu_v3($this->_menu), - 'duri' => $this->duri - )); - $this->load->model('module_model'); - } - - /** - * 模型 - */ - public function index() { - - $this->template->assign(array( - 'list' => $this->module_model->get_data(), - )); - $this->template->display('module_index.html'); - } - - /** - * 配置 - */ - public function config() { - - $id = $this->input->get('id'); - $data = $this->module_model->get($id); - if (!$data) { - $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - } - - if (IS_POST) { - $post = $this->input->post('site'); - $post['use'] = 1; - $data['site'] = $post; - $this->db->where('id', $id)->update('module', array( - 'site' => dr_array2string($data['site']), - )); - $this->system_log('配置模型【'.$data['dirname'].'】'); // 记录日志 - $this->clear_cache('module'); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('module/index', array('id' => $id)), 1); - } - - - $this->template->assign(array( - 'data' => $data, - 'theme' => dr_get_theme(), - 'is_theme' => strpos($data['site']['theme'], 'http://') === 0 ? 1 : 0, - 'template_path' => dr_dir_map(TPLPATH.'pc/web/', 1), - )); - $this->template->display('module_config.html'); - } - - /** - * 禁用/可用 - */ - public function disabled() { - $id = (int)$this->input->get('id'); - $_data = $this->db->where('id', $id)->get('module')->row_array(); - $value = $_data['disabled'] == 1 ? 0 : 1; - $this->db->where('id', $id)->update('module', array('disabled' => $value)); - $this->system_log(($value ? '禁用' : '启用').'模型【'.$_data['dirname'].'】'); // 记录日志 - $this->clear_cache('module'); - } - - /** - * 创建 - */ - public function add() { - - if (IS_POST) { - - $data = $this->input->post('data'); - if (!$data['dirname'] || !preg_match('/^[a-z]+$/U', $data['dirname'])) { - exit(dr_json(0, fc_lang('模型目录格式不正确,只能由英文字母组成'))); - } elseif ($data['name'] && strpos($data['name'], "'") !== FALSE) { - exit(dr_json(0, fc_lang('名称不不规范'))); - } - - $rt = $this->module_model->add($data['name'], $data['dirname']); - if ($rt) { - exit(dr_json(0, fc_lang($rt))); - } - - $this->system_log('创建模型'.$data['dirname'].'】'); // 记录日志 - exit(dr_json(1, fc_lang('模型创建成功'))); - } else { - $this->template->display('module_add.html'); - } - } - - - /** - * 卸载 - */ - public function uninstall() { - $id = $this->input->get('id'); - $this->module_model->del((int)$id); - $this->system_log('卸载模型【#'.$id.'】'); // 记录日志 - $this->clear_cache('module'); - $this->admin_msg(fc_lang('全部站点卸载成功(请更新模型缓存)'), dr_url('module/index'), 1); - } - - - /** - * 缓存 - * - */ - public function cache() { - $this->module_model->cache(); - } - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Root.php b/finecms/finecms/dayrui/controllers/admin/Root.php deleted file mode 100644 index a530e5b..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Root.php +++ /dev/null @@ -1,227 +0,0 @@ -template->assign('menu', $this->get_menu_v3(array( - fc_lang('管理员管理') => array('admin/root/index', 'users'), - fc_lang('添加') => array('admin/root/add_js', 'plus-square') - ))); - } - - /** - * 管理员管理 - */ - public function index() { - - if (IS_POST && $_POST['action'] == 'del') { - $ids = $this->input->post('ids'); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } elseif (!$this->is_auth('admin/root/del')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - foreach ($ids as $id) { - if ($id == 1) { - exit(dr_json(0, fc_lang('无法删除创始人管理权限'))); - } - $this->member_model->del_admin($id); - } - $this->system_log('删除后台管理员【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'), '')); - } - - $this->template->assign('list', $this->member_model->get_admin_all((int)$this->input->get('roleid'), $this->input->post('keyword', TRUE))); - $this->template->display('admin_index.html'); - } - - /** - * 添加 - */ - public function add() { - - $role = $this->dcache->get('role'); - - if (IS_POST) { - - $data = $this->input->post('data', TRUE); - - $check = $this->db - ->select('uid,adminid') - ->where('username', $data['username']) - ->limit(1) - ->get($this->db->dbprefix('member')) - ->row_array(); - $uid = $check['uid']; - - if (!$check) { // 会员不存在时,需要注册 - $member = array( - 'username' => $data['username'], - 'password' => trim($data['password']), - 'phone' => $data['phone'] ? $data['phone'] : '', - 'email' => $data['email'] - ); - $uid = $this->member_model->register($member, 3); - if ($uid == -1) { - exit(dr_json(0, fc_lang('该会员【%s】已经被注册', $data['username']), 'username')); - } elseif ($uid == -2) { - exit(dr_json(0, fc_lang('邮箱格式不正确'), 'email')); - } elseif ($uid == -3) { - exit(dr_json(0, fc_lang('该邮箱【%s】已经被注册', $data['email']), 'email')); - } elseif ($uid == -4) { - exit(dr_json(0, fc_lang('同一IP在限制时间内注册过多'), 'username')); - } elseif ($uid == -5) { - exit(dr_json(0, fc_lang('UCSSO:会员名称不合法'), 'username')); - } elseif ($uid == -6) { - exit(dr_json(0, fc_lang('UCSSO:包含不允许注册的词语'), 'username')); - } elseif ($uid == -7) { - exit(dr_json(0, fc_lang('UCSSO:Email格式有误'), 'username')); - } elseif ($uid == -8) { - exit(dr_json(0, fc_lang('UCSSO:Email不允许注册'), 'username')); - } elseif ($uid == -9) { - exit(dr_json(0, fc_lang('UCSSO:Email已经被注册'), 'username')); - } elseif ($uid == -10) { - exit(dr_json(0, fc_lang('手机号码必须是11位的整数'), 'phone')); - } elseif ($uid == -11) { - exit(dr_json(0, fc_lang('该手机号码已经注册'), 'phone')); - } - } - - $menu = array(); - if ($data['usermenu']) { - foreach ($data['usermenu']['name'] as $id => $v) { - $v && $data['usermenu']['url'][$id] && $menu[$id] = array('name' => $v, 'url' => $data['usermenu']['url'][$id]); - } - } - - $insert = array( - 'uid' => $uid, - 'realname' => $data['realname'], - 'usermenu' => dr_array2string($menu) - ); - $update = array('adminid' => 1); - $this->system_log('添加后台管理员【#'.$uid.'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'), $this->member_model->insert_admin($insert, $update, $uid))); - } - - $this->template->assign('role', $role); - $this->template->display('admin_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $uid = (int)$this->input->get('id'); - $data = $this->member_model->get_admin_member($uid); - !$data && exit(fc_lang('对不起,数据被删除或者查询不存在')); - - - if (IS_POST) { - $menu = array(); - $data = $this->input->post('data', TRUE); - if ($data['usermenu']) { - foreach ($data['usermenu']['name'] as $id => $v) { - $v && $data['usermenu']['url'][$id] && $menu[$id] = array('name' => $v, 'url' => $data['usermenu']['url'][$id]); - } - } - $insert = array( - 'uid' => $uid, - 'realname' => $data['realname'], - 'usermenu' => dr_array2string($menu) - ); - $update = array('adminid' => 1); - $this->system_log('修改后台管理员【#'.$uid.'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'), $this->member_model->update_admin($insert, $update, $uid))); - } - - $this->template->assign(array( - 'data' => $data - )); - $this->template->display('admin_add.html'); - } - - /** - * 修改资料 - */ - public function my() { - - if (IS_POST) { - $menu = array(); - $data = $this->input->post('data', TRUE); - $password = trim($data['password']); - if ($data['usermenu']) { - foreach ($data['usermenu']['name'] as $id => $v) { - $v && $data['usermenu']['url'][$id] && $menu[$id] = array('name' => $v, 'url' => $data['usermenu']['url'][$id]); - } - } - // 修改密码 - if ($password) { - if (defined('UCSSO_API')) { - $rt = ucsso_edit_password($this->uid, $password); - // 修改失败 - if (!$rt['code']) { - $this->admin_msg(fc_lang($rt['msg'])); - } - } - $this->db->where('uid', $this->uid)->update('member', array( - 'password' => md5(md5($password).$this->member['salt'].md5($password)) - )); - } - $this->db->where('uid', $this->uid)->update('admin', array( - 'color' => $data['color'], - 'realname' => $data['realname'], - 'usermenu' => dr_array2string($menu) - )); - $this->system_log('修改后台管理员资料【#'.$this->uid.'】'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('root/my'), 1); - } else { - $this->template->display('admin_my.html'); - } - } - - /** - * 删除 - */ - public function del() { - - $id = (int)$this->input->get('id'); - // 认证权限 - if ($id == 1) { - exit(dr_json(0, fc_lang('无法删除创始人管理权限'))); - } - - $this->member_model->del_admin($id); - $this->system_log('删除后台管理员资料【#'.$id.'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - /** - * 检查用户情况 - */ - public function check_username() { - $result = $this->db - ->select('uid,adminid') - ->where('username', $this->input->post('username', TRUE)) - ->limit(1) - ->get($this->db->dbprefix('member')) - ->row_array(); - !$result && exit(dr_json(1, '')); - // 已经属于管理组 - exit(dr_json(0, '', $result['uid'])); // 已经注册会员 - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Route.php b/finecms/finecms/dayrui/controllers/admin/Route.php deleted file mode 100644 index b6003f6..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Route.php +++ /dev/null @@ -1,385 +0,0 @@ -将以下内容保存为.htaccess文件,放到网站根目录'; - $code = 'RewriteEngine On'.PHP_EOL - .'RewriteBase /'.PHP_EOL - .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL - .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL - .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ /index.php [NC,L]'; - } elseif (strpos($server, 'iis/7') !== FALSE || strpos($server, 'iis/8') !== FALSE) { - $name = $server; - $note = '将以下内容保存为Web.config文件,放到网站根目录'; - $code = ''.PHP_EOL - .''.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .' '.PHP_EOL - .''; - } elseif (strpos($server, 'iis/6') !== FALSE) { - $name = $server; - $note = '建议使用isapi_rewrite第三版,老版本的rewrite不支持RewriteCond语法
    将以下内容保存为.htaccess文件,放到网站根目录'; - $code = 'RewriteEngine On'.PHP_EOL - .'RewriteBase /'.PHP_EOL - .'RewriteCond %{REQUEST_FILENAME} !-f'.PHP_EOL - .'RewriteCond %{REQUEST_FILENAME} !-d'.PHP_EOL - .'RewriteRule !.(js|ico|gif|jpe?g|bmp|png|css)$ /index.php'; - } elseif (strpos($server, 'nginx') !== FALSE) { - $name = $server; - $note = '将以下代码放到Nginx配置文件中去(如果是绑定了域名,所绑定目录也要配置下面的代码),您懂得!'; - $code = 'location / { '.PHP_EOL - .' if (-f $request_filename) {'.PHP_EOL - .' break;'.PHP_EOL - .' }'.PHP_EOL - .' if ($request_filename ~* "\.(js|ico|gif|jpe?g|bmp|png|css)$") {'.PHP_EOL - .' break;'.PHP_EOL - .' }'.PHP_EOL - .' if (!-e $request_filename) {'.PHP_EOL - .' rewrite . /index.php last;'.PHP_EOL - .' }'.PHP_EOL - .'}'; - } else { - $name = $server; - $note = '当前服务器不提供伪静态规则,请自己将所有页面定向到index.php文件'; - } - - $this->template->assign('menu', $this->get_menu_v3(array( - fc_lang('URL规则') => array('admin/urlrule/index', 'magnet'), - fc_lang('添加') => array('admin/urlrule/add', 'plus'), - fc_lang('伪静态规则') => array('admin/route/index', 'safari'), - ))); - $this->template->assign(array( - 'name' => $name, - 'code' => $code, - 'note' => $note, - 'count' => $code ? count(explode(PHP_EOL, $code)) : 0, - )); - $this->template->display('route_index.html'); - } - - /** - * 生成路由临时文件 - */ - public function todo() { - - $code = array(); - $module = $this->get_cache('module'); - $urlrule = $this->get_cache('urlrule'); - - echo '
    ';
    -
    -
    -
    -
    -		foreach ($this->site_info as $siteid => $site) {
    -
    -			// 站点URL
    -			if ($site['SITE_REWRITE']) {
    -
    -				$value = $urlrule[intval($site['SITE_REWRITE'])]['value'];
    -				if ($value) {
    -					$code[] = array(
    -						'name' => '站点[' . $siteid . '] 站点URL规则',
    -						'preg' => '开始',
    -						'rule' => ''
    -					);
    -
    -                    if ($value['share_search_page']) {
    -                        list($preg, $rname) = $this->_rule_preg_value($value['share_search_page']);
    -                        $write = 'search/index/rewrite/$'.$rname['{param}'];
    -                        $code[] = array(
    -                            'name' => '内容模型搜索',
    -                            'preg' => $preg,
    -                            'rule' => $write
    -                        );
    -                    }
    -
    -                    if ($value['tags']) {
    -                        list($preg, $rname) = $this->_rule_preg_value($value['tags']);
    -                        $write = 'tag/index/name/$'.$rname['{tag}'];
    -                        $code[] = array(
    -                            'name' => 'tag关键词库',
    -                            'preg' => $preg,
    -                            'rule' => $write
    -                        );
    -                    }
    -					$code[] = array(
    -						'name' => '站点[' . $siteid . '] 站点URL规则',
    -						'preg' => '结束',
    -						'rule' => ''
    -					);
    -				}
    -			}
    -
    -
    -			// 栏目
    -			$category = $this->get_cache('category-'.$siteid);
    -			if ($category) {
    -				foreach ($category as $t) {
    -					$dir = '';
    -					$value = $urlrule[intval($t['setting']['urlrule'])]['value'];
    -					if ($t['tid'] != 2 && $value && !$t['setting']['html']) {
    -						$code[] = array(
    -							'name' => '站点['.$siteid.'] 栏目['.$t['name'].' '.$t['dirname'].']',
    -							'preg' => '开始',
    -							'rule' => ''
    -						);
    -						if ($value['list_page']) {
    -							// 模型栏目列表(分页)
    -							$rule = str_replace('{modname}', $dir, $value['list_page']);
    -							list($preg, $rname) = $this->_rule_preg_value($rule);
    -							if (isset($rname['{dirname}'])) {
    -								// 目录格式
    -								$write = 'category/index/dir/$'.$rname['{dirname}'].'/page/$'.$rname['{page}'];
    -							} elseif (isset($rname['{pdirname}'])) {
    -								// 层次目录格式
    -								$write = 'category/index/dir/$'.$rname['{pdirname}'].'/page/$'.$rname['{page}'];
    -							} else {
    -								// id模式
    -								$write = 'category/index/id/$'.$rname['{id}'].'/page/$'.$rname['{page}'];
    -							}
    -							$code[] = array(
    -								'name' => '栏目列表(分页)',
    -								'preg' => $preg,
    -								'rule' => $write
    -							);
    -						}
    -						if ($value['list']) {
    -							// 模型栏目列表
    -							$rule = str_replace('{modname}', $dir, $value['list']);
    -							list($preg, $rname) = $this->_rule_preg_value($rule);
    -							if (isset($rname['{dirname}'])) {
    -								// 目录格式
    -								$write = 'category/index/dir/$'.$rname['{dirname}'];
    -							} elseif (isset($rname['{pdirname}'])) {
    -								// 层次目录格式
    -								$write = 'category/index/dir/$'.$rname['{pdirname}'];
    -							} else {
    -								// id模式
    -								$write = 'category/index/id/$'.$rname['{id}'];
    -							}
    -							$code[] = array(
    -								'name' => '栏目列表',
    -								'preg' => $preg,
    -								'rule' => $write
    -							);
    -						}
    -						if ($value['show_page']) {
    -							// 模型内容页(分页)
    -							$rule = str_replace('{modname}', $dir, $value['show_page']);
    -							list($preg, $rname) = $this->_rule_preg_value($rule);
    -							$write = 'show/index/id/$'.$rname['{id}'].'/page/$'.$rname['{page}'];
    -							$code[] = array(
    -								'name' => '内容页(分页)',
    -								'preg' => $preg,
    -								'rule' => $write
    -							);
    -						}
    -						if ($value['show']) {
    -							// 模型内容页
    -							$rule = str_replace('{modname}', $dir, $value['show']);
    -							list($preg, $rname) = $this->_rule_preg_value($rule);
    -							$write = 'show/index/id/$'.$rname['{id}'];
    -							$code[] = array(
    -								'name' => '内容页',
    -								'preg' => $preg,
    -								'rule' => $write
    -							);
    -						}
    -
    -						$code[] = array(
    -							'name' => '站点['.$siteid.'] 栏目['.$t['name'].' '.$t['dirname'].']',
    -							'preg' => '结束',
    -							'rule' => ''
    -						);
    -					}
    -				}
    -			}
    -
    -			$code[] = array(
    -				'name' => '站点['.$siteid.'] 栏目',
    -				'preg' => '全部结束',
    -				'rule' => ''
    -			);
    -
    -		}
    -
    -		if (!$code) {
    -			exit('没有设置伪静态');
    -		}
    -
    -		$html = '';
    -		foreach ($code as $t) {
    -			if ($t['rule']) {
    -				$html.= '	// '.$t['name'].PHP_EOL;
    -				$html.= '	"'.$t['preg'].'"'.$this->_space($t['preg']).'=>	"'.$t['rule'].'",'.PHP_EOL;
    -			} else {
    -				$html.= PHP_EOL.'	/*-------------------'.$t['name'].' '.$t['preg'].'-----------------*/ '.PHP_EOL.PHP_EOL;
    -			}
    -		}
    -
    -		echo '';
    -		exit;
    -
    -    }
    -
    -	// 正则解析
    -	private function _rule_preg_value($rule) {
    -
    -		$rule = trim(trim($rule, '/'));
    -
    -		if (preg_match_all('/\{(.*)\}/U', $rule, $match)) {
    -
    -			$value = array();
    -			foreach ($match[0] as $k => $v) {
    -				$value[$v] = ($k + 1);
    -			}
    -
    -			$preg = preg_replace(
    -				array(
    -					'#\{id\}#U',
    -					'#\{uid\}#U',
    -					'#\{mid\}#U',
    -					'#\{fid\}#U',
    -					'#\{page\}#U',
    -
    -					'#\{pdirname\}#Ui',
    -					'#\{dirname\}#Ui',
    -					'#\{modname\}#Ui',
    -					'#\{name\}#Ui',
    -
    -					'#\{tag\}#U',
    -					'#\{param\}#U',
    -
    -					'#\{y\}#U',
    -					'#\{m\}#U',
    -					'#\{d\}#U',
    -
    -					'#\{.+}#U',
    -					'#/#'
    -				),
    -				array(
    -					'(\d+)',
    -					'(\d+)',
    -					'(\d+)',
    -					'(\w+)',
    -					'(\d+)',
    -
    -					'([\w\/]+)',
    -					'([a-z0-9]+)',
    -					'([a-z]+)',
    -					'([a-z]+)',
    -
    -					'(.+)',
    -					'(.+)',
    -
    -					'(\d+)',
    -					'(\d+)',
    -					'(\d+)',
    -
    -					'(.+)',
    -					'\/'
    -				),
    -				$rule
    -			);
    -
    -            // 替换特殊的结果
    -            $preg = str_replace(
    -                array('(.+))}-'),
    -                array('(.+)-'),
    -                $preg
    -            );
    -
    -			return array($preg, $value);
    -		}
    -
    -		return array($rule, array());
    -	}
    -
    -	// 将规则生成至文件
    -	private function _to_file($path, $data, $note) {
    -
    -		$file =  WEBPATH.'config/rewrite.php';
    -
    -		$string = ' $val) {
    -                if (strpos($key, '(.+)') === 0) {
    -                    $end[$key] = $val;
    -                } else {
    -				    $string.= '$route[\''.$key.'\']'.$this->_space($key).'= \''.$val.'\'; // '.$this->_get_name($val).' 对应规则:'.$note[$key].PHP_EOL;
    -                }
    -			}
    -            if ($end) {
    -                $string.= PHP_EOL.PHP_EOL.PHP_EOL;
    -                foreach ($end as $key => $val) {
    -                    $string.= '$route[\''.$key.'\']'.$this->_space($key).'= \''.$val.'\'; // '.$this->_get_name($val).' 对应规则:'.$note[$key].PHP_EOL;
    -                }
    -            }
    -		}
    -
    -		file_put_contents($file, $string);
    -	}
    -
    -	// 获取页面名称
    -	private function _get_name($rule) {
    -		if (strpos($rule, 'show/index') !== FALSE) {
    -			return '【内容页】';
    -		} elseif (strpos($rule, 'category/index') !== FALSE) {
    -			return '【栏目页】';
    -		} elseif (strpos($rule, 'search/index') !== FALSE) {
    -			return '【搜索页】';
    -		} elseif (strpos($rule, 'tag/index') !== FALSE) {
    -			return '【标签页】';
    -		}
    -	}
    -
    -	/**
    -	 * 补空格
    -	 *
    -	 * @param	string	$name	变量名称
    -	 * @return	string
    -	 */
    -	private function _space($name) {
    -		$len = strlen($name) + 2;
    -	    $cha = 60 - $len;
    -	    $str = '';
    -	    for ($i = 0; $i < $cha; $i ++) $str .= ' ';
    -	    return $str;
    -	}
    -}
    \ No newline at end of file
    diff --git a/finecms/finecms/dayrui/controllers/admin/Saler.php b/finecms/finecms/dayrui/controllers/admin/Saler.php
    deleted file mode 100644
    index 23e6b69..0000000
    --- a/finecms/finecms/dayrui/controllers/admin/Saler.php
    +++ /dev/null
    @@ -1,968 +0,0 @@
    -template->assign('menu', $this->get_menu_v3(array(
    -			fc_lang('添加') => array('admin/saler/add_js', 'plus')
    -		)));
    -    }
    -
    -    /**
    -     * 首页
    -     */
    -    public function index() {
    -
    -        // 重置页数和统计
    -        IS_POST && $_GET['page'] = $_GET['total'] = 0;
    -	
    -		// 根据参数筛选结果
    -        $param = $this->input->get(NULL, TRUE);
    -        unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']);
    -		
    -		// 数据库中分页查询
    -		list($data, $param) = $this->saler_model->limit_page($param, max((int)$_GET['page'], 1), (int)$_GET['total']);
    -
    -        $field = $this->get_cache('member', 'field');
    -        $field = array(
    -            'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')),
    -            'name' => array('fieldname' => 'name','name' => fc_lang('姓名')),
    -            'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')),
    -            'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')),
    -        ) + ($field ? $field : array());
    -
    -        // 存储当前页URL
    -        $this->_set_back_url('member/index', $param);
    -        foreach ($data as $k => $v) {
    -        	$sum['allknot'] += $v['allknot'];
    -        	$sum['allbucket'] += $v['allbucket'];
    -        	$sum['allbottleNum'] += $v['allbottleNum'];
    -        	$sum['alldrinkNum'] += $v['alldrinkNum'];
    -        }
    -        $this->template->assign('sum',$sum);
    -		$this->template->assign(array(
    -			'list' => $data,
    -            'field' => $field,
    -			'param'	=> $param,
    -			'pages'	=> $this->get_pagination(dr_url('saler/index', $param), $param['total']),
    -		));
    -		$this->template->display('saler_index.html');
    -    }
    -
    -    //销售导出
    -    public function saler_exp()
    -    {
    -    	        // 重置页数和统计
    -        IS_POST && $_GET['page'] = $_GET['total'] = 0;
    -	
    -		// 根据参数筛选结果
    -        $param = $this->input->get(NULL, TRUE);
    -        unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']);
    -		
    -    	list($data,$param) = $this->saler_model->limit_page($param,1,100);
    -    	$exp = array();
    -    	foreach ($data as $k => $v) {
    -    		$exp[$k]['name'] = $v['name'];
    -    		$exp[$k]['carNo'] = $v['carNo'];
    -    		$exp[$k]['phone'] = $v['phone'];
    -    		$exp[$k]['typename'] = $v['typename'];
    -    		$exp[$k]['allknot'] = $v['allknot'];
    -    		$exp[$k]['allbucket'] = $v['allbucket'];
    -    		$exp[$k]['allbottleNum'] = $v['allbottleNum'];
    -    		$exp[$k]['alldrinkNum'] = $v['alldrinkNum'];
    -    	}
    -
    -    	$date = date('Y-m-d');
    -    	$filename = $date.'销售信息.xls';
    -    	header('content-type:application/vnd.ms-excel;charset=UTF-8');
    -        header('content-disposition:attachment;filename='.$filename);
    -        header('Content-Transfer-Encoding: binary');
    -        header('Pragma:no-cache');
    -        header('Expires:0');
    -        header("Pragma: public");
    -        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    -        header("Content-Type:application/force-download");
    -        header("Content-Type:application/octet-stream");
    -        header("Content-Type:application/download");
    -
    -        $title = array(
    -            '姓名',
    -            '车牌号',
    -            '电话',
    -            '公司',
    -            '结款',
    -            '桶装水',
    -            '饮料',
    -            '瓶装水',
    -        );
    -        echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n";
    -        foreach ($exp as $key => $value) {
    -            echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n";
    -        }
    -        return false;
    -    }
    -
    -	/**
    - * 添加
    - */
    -	public function add() {
    -
    -		if (IS_POST) {
    -
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -
    -			// 单个添加
    -			$uid = $this->saler_model->addSaler( [
    -				'name'   => $data['name'],
    -				'carNo'  => $data['carNo'],
    -				'phone'  => $data['phone'],
    -				'type'   => $data['type'],
    -				'remark' => $info?:'',
    -			] );
    -
    -			exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) );
    -
    -		}
    -
    -
    -		$this->template->display('saler_add.html');
    -	}
    -
    -
    -
    -
    -	/**
    -	 * 修改
    -	 */
    -	public function edit() {
    -
    -		$salerId = (int)$this->input->get('salerId');
    -		$page = (int)$this->input->get('page');
    -		$data = $this->saler_model->get_saler($salerId);
    -		!$data && $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在'));
    -
    -		$field = array();
    -
    -		if (IS_POST) {
    -			$edit = $this->input->post('member');
    -			$page = (int)$this->input->post('page');
    -			$post = $this->validate_filter($field, $data);
    -			if (isset($post['error'])) {
    -				$error = $post['msg'];
    -			} else {
    -				$update = array(
    -					'name' => $edit['name'],
    -					'phone' => $edit['phone'],
    -					'carNo' => $edit['carNo'],
    -					'type' => $edit['type'],
    -				);
    -
    -
    -				$this->db->where('id', $salerId)->update('saler', $update);
    -
    -				$this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('saler/index', array( 'page' => $page)), 1);
    -			}
    -			$this->admin_msg($error, dr_url('saler/index', array( 'page' => $page)));
    -		}
    -
    -		$this->template->assign(array(
    -			'data' => $data,
    -			'page' => $page,
    -			'myfield' => $this->field_input($field, $data, TRUE),
    -		));
    -		$this->template->display('saler_edit.html');
    -	}
    -
    -
    -	public function fuel() {
    -		$search = [];
    -		$salerId = $_GET['salerId'];
    -		$time  =  isset($_POST['data']['time']) && $_POST['data']['time'] ? (int)$_POST['data']['time'] : (int)$this->input->get('time');
    -		if($time) {
    -			$search['start'] = date('Y-m-d',$_POST['data']['time']);
    -			$search['end'] = date('Y-m-d',$_POST['data']['time1'] );
    -			$time1 = strtotime($search['end']);
    -		}
    -		$time =  $time ? $time : SYS_TIME;
    -		if(!$time1) {
    -			$time1 = $time;
    -		}
    -	    // 重置页数和统计
    -	    IS_POST && $_GET['page'] = $_GET['total'] = 0;
    -
    -	    // 根据参数筛选结果
    -	    $param = $this->input->get(NULL, TRUE);
    -	    unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']);
    -
    -	    // 数据库中分页查询
    -	    list($data, $param) = $this->saler_model->get_saler_fuel($salerId, max((int)$_GET['page'], 1), (int)$_GET['total'], $search);
    -
    -	    $field = $this->get_cache('member', 'field');
    -	    $field = array(
    -			    'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')),
    -			    'name' => array('fieldname' => 'name','name' => fc_lang('姓名')),
    -			    'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')),
    -			    'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')),
    -		    ) + ($field ? $field : array());
    -	    // 存储当前页URL
    -		$url = 'admin/saler/fueladd/salerId/'.$salerId;
    -	    $this->template->assign('menubill', $this->get_menu_v3(array(
    -		    fc_lang('返回') => array('admin/saler/index', 'reply'),
    -			fc_lang('添加') => array($url, 'plus')
    -
    -	    )));
    -	    $salerInfo = $this->saler_model->get_saler($salerId);
    -	    $this->template->assign('salerId',$salerId);
    -	    $this->template->assign('salerInfo',$salerInfo);
    -	    $this->template->assign(array(
    -		    'time' => $time,
    -		    'time1' => $time1,
    -		    'list' => $data,
    -		    'field' => $field,
    -		    'param'	=> $param,
    -		    'pages'	=> $this->get_pagination(dr_qxurl('saler/fuel/salerId/'.$salerId, $param), $param['total']),
    -	    ));
    -	    $this->template->display('salerfuel_index.html');
    -	}
    -
    -	public function fueladd() {
    -		$salerId = $_GET['salerId'];
    -		if (IS_POST) {
    -
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -			$id = $data['salerId'];
    -			// 单个添加
    -			$uid = $this->saler_model->addSalerFuel( [
    -				'salerId'   => $data['salerId'],
    -				'rise'   => $data['rise'],
    -				'money'  => $data['money'],
    -				'date'  => date('Y-m-d',$data['time'])
    -			] );
    -
    -			$this->admin_msg(
    -				fc_lang('操作成功,正在刷新...'),
    -				$this->_get_back_url('saler/fuel', array('salerId' =>$id)),
    -				1,
    -				1
    -			);
    -		}
    -
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array($url, 'reply'),
    -		)));
    -		$data = $this->saler_model->get_saler($salerId);
    -		$this->template->assign('salerId', $salerId);
    -		$this->template->assign('data', $data);
    -		$this->template->assign('time', time());
    -		$this->template->display('salerfuel_add.html');
    -	}
    -
    -	public function fueledit() {
    -		$salerId = (int)$this->input->get('salerId');
    -		$salerInfo = $this->saler_model->get_saler($salerId);
    -		$fuelId = (int)$this->input->get('fuelId');
    -		$data = $this->saler_model->get_fuel_detail($fuelId);
    -		!$data && $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在'));
    -
    -		$field = array();
    -
    -		if (IS_POST) {
    -			$edit = $this->input->post('data');
    -			if (isset($post['error'])) {
    -				$error = $post['msg'];
    -			} else {
    -				$update = array(
    -					'rise' => $edit['rise'],
    -					'money' => $edit['money'],
    -					'date' => date('Y-m-d',$edit['time']),
    -					'remark' => $edit['remark'],
    -				);
    -
    -				$this->db->where('id', $fuelId)->update('saler_fuel', $update);
    -
    -				$this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('saler/fuel', array('salerId' => $salerId, 'page' => $page)), 1);
    -			}
    -		}
    -
    -		$this->template->assign(array(
    -			'data' => $data,
    -			'time' => strtotime($data['date']),
    -			'salerInfo' => $salerInfo,
    -			'page' => $page,
    -			'myfield' => $this->field_input($field, $data, TRUE),
    -		));
    -		$this->template->display('salerfuel_add.html');
    -	}
    -	/**
    -	 * 首页
    -	 */
    -	public function bill() {
    -
    -		// 重置页数和统计
    -		IS_POST && $_GET['page'] = $_GET['total'] = 0;
    -		$time  =  isset($_POST['data']['time']) && $_POST['data']['time'] ? (int)$_POST['data']['time'] : (int)$this->input->get('time');
    -		if($time) {
    -			$search['start'] = date('Y-m-d',$_POST['data']['time']);
    -			$search['end'] = date('Y-m-d',$_POST['data']['time1'] );
    -			$time1 = strtotime($search['end']);
    -		}
    -		$page = $_GET['page']?:1;
    -		$time =  $time ? $time : SYS_TIME;
    -		if(!$time1) {
    -			$time1 = $time;
    -		}
    -		// 根据参数筛选结果
    -		$param = $this->input->get(NULL, TRUE);
    -		unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']);
    -
    -		$salerId = $_GET['salerId'];
    -		// 数据库中分页查询
    -		list($data, $param) = $this->saler_model->bill_limit_page($salerId, max((int)$_GET['page'], 1), (int)$_GET['total'], $search);
    -
    -
    -
    -		
    -
    -		$field = $this->get_cache('member', 'field');
    -		$field = array(
    -				'username' => array('fieldname' => 'username','name' => fc_lang('会员名称')),
    -				'name' => array('fieldname' => 'name','name' => fc_lang('姓名')),
    -				'email' => array('fieldname' => 'email','name' => fc_lang('会员邮箱')),
    -				'phone' => array('fieldname' => 'phone','name' => fc_lang('手机号码')),
    -				''
    -			) + ($field ? $field : array());
    -		$url = "admin/saler/billadd/salerId/{$salerId}";
    -		$this->template->assign('salerId',$salerId);
    -		// 存储当前页URL
    -		$this->_set_back_url('saler/bill/billId/'.$salerId, $param);
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array('admin/saler/index', 'reply'),
    -			fc_lang('添加') => array($url, 'plus')
    -
    -		)));
    -		foreach ($data as $k => $v) {
    -        	$sum['bucketNum'] += $v['bucketNum'];
    -        	$sum['backNumTotal'] += $v['backNumTotal'];
    -        	$sum['bottleNum'] += $v['bottleNum'];
    -        	$sum['drinkNum'] += $v['drinkNum'];
    -        	$sum['bucketleft'] += $v['bucketNum'] - $v['bucketTotal'];
    -        	$sum['bottleleft'] += $v['bottleNum'] - $v['bottleTotal'];
    -        	$sum['drinkleft'] += $v['drinkNum'] - $v['drinkTotal'];
    -        	$sum['knotTotal'] += $v['knotTotal'];
    -        }
    -		$this->template->assign(array(
    -			'time' => $time,
    -			'time1' => $time1,
    -			'list' => $data,
    -			'field' => $field,
    -			'sum' => $sum,
    -			'param'	=> $param,
    -			'page' => $page,
    -			'pages'	=> $this->get_pagination(dr_qxurl('saler/bill/salerId/'.$salerId, $param), $param['total']),
    -		));
    -		$this->template->display('salerbill_index.html');
    -	}
    -
    -	/**
    -	 * 添加
    -	 */
    -	public function billadd() {
    -		$id = $_GET['salerId'];
    -		if (IS_POST) {
    -
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -			// 单个添加
    -			$uid = $this->saler_model->addSalerBill( [
    -				'salerId'   => $data['salerId'],
    -				'salerName'   => $data['salerName'],
    -				'bucketNum'  => $data['bucketNum'],
    -				'bottleNum'  => $data['bottleNum'],
    -				'drinkNum'   => $data['drinkNum'],
    -				'checker' => $data['checker'],
    -				'saleTime' => $data['saleTime']?:date('Y-m-d'),
    -				'remark' => $info?:'',
    -			] );
    -
    -			$this->admin_msg(
    -				fc_lang('操作成功,正在刷新...'),
    -				$this->_get_back_url('saler/bill', array('salerId' =>$id)),
    -				1,
    -				1
    -			);
    -		}
    -		$url = 'admin/saler/bill/salerId/'.$id;
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array($url, 'reply')
    -		)));
    -		$data = $this->saler_model->get_saler();
    -		$this->template->assign('salerId', $id);
    -		$this->template->assign('time', time());
    -		$this->template->display('salerbill_add.html');
    -	}
    -
    -	/**
    -	 * 修改
    -	 */
    -	public function billedit() {
    -
    -		$billId = (int)$this->input->get('billId');
    -		$salerId = (int)$this->input->get('salerId');
    -		$page = (int)$this->input->get('page');
    -		$billInfo = $this->saler_model->get_sumdetail($billId);
    -		$data = $this->saler_model->get_saler_bill($billId);
    -
    -		!$data && $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在'));
    -
    -		$field = array();
    -
    -		if (IS_POST) {
    -			$edit = $this->input->post('data');
    -			$update = array(
    -				'salerName' => $edit['salerName'],
    -				'bucketNum' => $edit['bucketNum'],
    -				'bottleNum' => $edit['bottleNum'],
    -				'drinkNum' => $edit['drinkNum'],
    -				'checker' => $edit['checker'],
    -				'saleTime' => date('Y-m-d',$edit['time']),
    -				'remark' => $edit['remark'],
    -			);
    -			$this->db->where('id', $billId)->update('saler_bill', $update);
    -			$this->admin_msg(
    -				fc_lang('操作成功,正在刷新...'),
    -				$this->_get_back_url('saler/bill', array('salerId' =>$salerId)),
    -				1,
    -				1
    -			);
    -
    -		}
    -		$url = 'admin/saler/billdetailadd/billId/'.$billId;
    -		// 存储当前页URL
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array('admin/saler/bill/salerId/'.$salerId.'/page/'.$page, 'reply'),
    -
    -		)));
    -		$this->template->assign(array(
    -			'time' => strtotime($data['saleTime']) ,
    -			'data' => $data,
    -			'backNumTotal' => $billInfo['backNumTotal'],
    -			'myfield' => $this->field_input($field, $data, TRUE),
    -		));
    -		$this->template->display('salerbill_add.html');
    -	}
    -
    -	/**
    -	 * 首页
    -	 */
    -	public function billdetail() {
    -
    -
    -		$billId = $_GET['billId'];
    -		$salerId = $_GET['salerId'];
    -		$page = $_GET['page'];
    -
    -		// 重置页数和统计
    -		IS_POST && $_GET['page'] = $_GET['total'] = 0;
    -
    -		// 根据参数筛选结果
    -		$param = $this->input->get(NULL, TRUE);
    -		unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']);
    -
    -		// 数据库中分页查询
    -		$data = $this->saler_model->get_bill_detail($billId);
    -
    -		$url = 'admin/saler/billdetailadd/billId/'.$billId;
    -		// 存储当前页URL
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array('admin/saler/bill/salerId/'.$salerId.'/page/'.$page, 'reply'),
    -			fc_lang('添加') => array($url.'_js', 'plus')
    -
    -		)));
    -		foreach ($data as $k => $v) {
    -        	$sum['bucketNum'] += $v['bucketNum'];
    -        	$sum['bottleNum'] += $v['bottleNum'];
    -        	$sum['drinkNum'] += $v['drinkNum'];
    -        	$sum['backBucketNum'] += $v['backBucketNum'];
    -        	$sum['knot'] += $v['knot'];
    -        	$sum['debt'] += $v['debt'];
    -        	$sum['debtBucket'] += $v['debtBucket'];
    -        	$sum['depositBucket'] += $v['depositBucket'];
    -        }
    -
    -		$this->template->assign(array(
    -			'salerId' => $salerId,
    -			'billId' => $billId,
    -			'list' => $data,
    -			'sum' => $sum,
    -			'param'	=> $param,
    -			'pages'	=> $this->get_pagination(dr_url('member/index', $param), $param['total']),
    -		));
    -		$this->template->display('billdetail_index.html');
    -	}
    -
    -	//明细导出
    -	public function billdetail_exp() {
    -		$billId = $_GET['billId'];
    -		$salerId = $_GET['salerId'];
    -
    -		// 重置页数和统计
    -		IS_POST && $_GET['page'] = $_GET['total'] = 0;
    -
    -		// 根据参数筛选结果
    -		$param = $this->input->get(NULL, TRUE);
    -		unset($param['s'], $param['c'], $param['m'], $param['d'], $param['page']);
    -
    -		// 数据库中分页查询
    -		$data = $this->saler_model->get_bill_detail($billId);
    -		$exp = array();
    -		foreach ($data as $k => $v) {
    -			$exp[$k]['cname'] = $v['cname'];
    -			$exp[$k]['bucketNum'] = $v['bucketNum'];
    -			$exp[$k]['bottleNum'] = $v['bottleNum'];
    -			$exp[$k]['drinkNum'] = $v['drinkNum'];
    -			$exp[$k]['price'] = $v['price'];
    -			$exp[$k]['backBucketNum'] = $v['backBucketNum'];
    -			$exp[$k]['knot'] = $v['knot'];
    -			$exp[$k]['debt'] = $v['debt'];
    -			$exp[$k]['debtBucket'] = $v['debtBucket'];
    -			$exp[$k]['depositBucket'] = $v['depositBucket'];
    -			$exp[$k]['saleTime'] = $v['saleTime'];
    -			$exp[$k]['remark'] = $v['remark'];
    -		}
    -		$date = date('Y-m-d');
    -    	$filename = $date.'订单明细.xls';
    -    	header('content-type:application/vnd.ms-excel;charset=UTF-8');
    -        header('content-disposition:attachment;filename='.$filename);
    -        header('Content-Transfer-Encoding: binary');
    -        header('Pragma:no-cache');
    -        header('Expires:0');
    -        header("Pragma: public");
    -        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    -        header("Content-Type:application/force-download");
    -        header("Content-Type:application/octet-stream");
    -        header("Content-Type:application/download");
    -
    -        $title = array(
    -            '客户姓名',
    -            '桶装水',
    -            '瓶装水',
    -            '饮料',
    -            '价格',
    -            '回桶',
    -            '结款',
    -            '欠款',
    -            '欠桶',
    -            '押桶',
    -            '时间',
    -            '备注'
    -        );
    -        echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n";
    -        foreach ($exp as $key => $value) {
    -            echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n";
    -        }
    -        return false;
    -	}
    -
    -	
    -
    -
    -	public function billdetailadd() {
    -		$id = $_GET['billId'];
    -
    -
    -		if (IS_POST) {
    -
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -			$customerId = $this->customer_model->get_customer_name($data['cname']);
    -			// 单个添加
    -			$uid = $this->saler_model->addBillDetail( [
    -				'billId'   => $data['billId'],
    -				'customerId'   => $customerId,
    -				'priceId'   => $data['priceId'],
    -				'bucketNum'  => $data['bucketNum'],
    -				'bottleNum'  => $data['bottleNum'],
    -				'drinkNum'  => $data['drinkNum'],
    -				'backBucketNum'  => $data['backBucketNum'],
    -				'knot'  => $data['knot'],
    -				'debt'  => $data['debt'],
    -				'depositBucket'  => $data['depositBucket'],
    -				'debtBucket' => $data['debtBucket'],
    -				'remark' => $info?:'',
    -			] );
    -
    -			exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) );
    -//			$this->admin_msg(
    -//				fc_lang('操作成功,正在刷新...'),
    -//				$this->_get_back_url('saler/bill', array('id' =>$id)),
    -//				1,
    -//				1
    -//			);
    -		}
    -		$url = 'admin/saler/billdetail/billId/'.$id;
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array($url, 'reply')
    -		)));
    -		$customer = $this->customer_model->get_all_customer();
    -		$this->template->assign('customer',$customer);
    -		$data = $this->saler_model->get_saler();
    -		$this->template->assign('billId', $id);
    -		$this->template->assign('time', time());
    -		$this->template->display('billdetail_add.html');
    -	}
    -
    -	public function detaildel() {
    -		$detailId = $_GET['detailId'];
    -		$billId = $_GET['billId'];
    -		$salerId = $_GET['salerId'];
    -		$id = $this->saler_model->delBillDetail($detailId);
    -		$this->admin_msg(
    -				fc_lang('操作成功,正在刷新...'),
    -				$this->_get_back_url('saler/billdetail', array('billId' =>$billId,'salerId'=>$salerId)),
    -				1,
    -				1
    -			);
    -
    -
    -	}
    -
    -
    -	public function billdetailedit() {
    -		$detailId = $_GET['detailId'];
    -		$data = $this->saler_model->get_bill_detail_info($detailId);
    -		$customerId = $data['customerId'];
    -		$priceInfo = $this->customer_model->get_customer_price($customerId);
    -		if (IS_POST) {
    -
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -			$customerId = $this->customer_model->get_customer_name($data['cname']);
    -			// 单个添加
    -			$uid = $this->saler_model->editBillDetail($detailId,$customerId, [
    -				'customerId'   => $customerId,
    -				'priceId'   => $data['priceId'],
    -				'bucketNum'  => $data['bucketNum'],
    -				'bottleNum'  => $data['bottleNum'],
    -				'backBucketNum'  => $data['backBucketNum'],
    -				'knot'  => $data['knot'],
    -				'debt'  => $data['debt'],
    -				'depositBucket'  => $data['depositBucket'],
    -				'debtBucket' => $data['debtBucket'],
    -				'remark' => $info?:'',
    -			] );
    -
    -			exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) );
    -//			$this->admin_msg(
    -//				fc_lang('操作成功,正在刷新...'),
    -//				$this->_get_back_url('saler/bill', array('id' =>$id)),
    -//				1,
    -//				1
    -//			);
    -		}
    -		$url = 'admin/saler/billdetail/billId/'.$id;
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array($url, 'reply')
    -		)));
    -		$customer = $this->customer_model->get_all_customer();
    -		$this->template->assign('customer',$customer);
    -		$this->template->assign('data',$data);
    -		$this->template->assign('priceInfo',$priceInfo);
    -		$data = $this->saler_model->get_saler();
    -		$this->template->assign('billId', $id);
    -		$this->template->assign('time', time());
    -		$this->template->display('billdetail_add.html');
    -	}
    -
    -	//欠款列表
    -	public function debtlist() {
    -		$salerId = $_GET['salerId'];
    -		list($data, $param)  = $this->saler_model->getdebtlist($salerId);
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array('admin/saler/index', 'reply')
    -		)));
    -		$this->template->assign(array(
    -			'list' => $data,
    -			'salerId' => $salerId,
    -            'field' => $field,
    -			'param'	=> $param,
    -		));
    -		$this->template->display('saler_debtlist.html');
    -
    -	}
    -
    -	//欠款导出
    -	public function debtlist_exp() {
    -		$salerId = $_GET['salerId'];
    -		list($data, $param)  = $this->saler_model->getdebtlist($salerId);
    -		$exp = array();
    -		foreach ($data as $k => $v) {
    -			$exp[$k]['cname'] = $v['cname'];
    -			$exp[$k]['phone'] = $v['phone'];
    -			$exp[$k]['debtMoney'] = $v['debtMoney'];
    -		}
    -		$date = date('Y-m-d');
    -    	$filename = $date.'欠款统计.xls';
    -    	header('content-type:application/vnd.ms-excel;charset=UTF-8');
    -        header('content-disposition:attachment;filename='.$filename);
    -        header('Content-Transfer-Encoding: binary');
    -        header('Pragma:no-cache');
    -        header('Expires:0');
    -        header("Pragma: public");
    -        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    -        header("Content-Type:application/force-download");
    -        header("Content-Type:application/octet-stream");
    -        header("Content-Type:application/download");
    -
    -        $title = array(
    -            '姓名',
    -            '电话',
    -            '欠款',
    -        );
    -        echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n";
    -        foreach ($exp as $key => $value) {
    -            echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n";
    -        }
    -        return false;
    -	}
    -
    -	//陈列
    -	public function displayadd(){
    -		$salerId = $_GET['salerId'];
    -		if (IS_POST) {
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -			$customerId = $this->customer_model->get_customer_name($data['cname']);
    -			// 单个添加
    -			$uid = $this->saler_model->adddisplayDetail( [
    -				'salerId'      => $salerId,
    -				'customerId'   => $customerId,
    -				'bucketNum'  => $data['bucketNum'],
    -				'bottleNum'  => $data['bottleNum'],
    -				'drinkNum'  => $data['drinkNum'],
    -				'created'   => date('Y-m-d H:i:s',$data['time']),
    -				'remark' => $info?:'',
    -			] );
    -
    -			exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) );
    -//			$this->admin_msg(
    -//				fc_lang('操作成功,正在刷新...'),
    -//				$this->_get_back_url('saler/bill', array('id' =>$id)),
    -//				1,
    -//				1
    -//			);
    -		}
    -		$url = 'admin/saler/displaywater/salerId/'.$salerId;
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array($url, 'reply')
    -		)));
    -		$customer = $this->customer_model->get_all_customer();
    -		$this->template->assign('customer',$customer);
    -		$saler = $this->saler_model->get_saler($salerId);
    -		$this->template->assign('saler',$saler);
    -		$this->template->assign('time', time());
    -		$this->template->display('display_add.html');
    -	}
    -
    -	//陈列
    -	public function displayedit(){
    -		$id = $_GET['id'];
    -		$data = $this->saler_model->get_display_info($id);
    -		if (IS_POST) {
    -			$data = $this->input->post( 'data' );
    -			$info = $this->input->post( 'info' );
    -			$customerId = $this->customer_model->get_customer_name($data['cname']);
    -			// 单个添加
    -			$uid = $this->saler_model->editdisplayDetail($id, [
    -				'customerId'   => $customerId,
    -				'bucketNum'  => $data['bucketNum'],
    -				'bottleNum'  => $data['bottleNum'],
    -				'drinkNum'  => $data['drinkNum'],
    -				'created'   => date('Y-m-d H:i:s',$data['time']),
    -				'remark' => $info?:'',
    -			] );
    -
    -			exit( dr_json( 1, fc_lang( '操作成功,正在刷新...' ) ) );
    -//			$this->admin_msg(
    -//				fc_lang('操作成功,正在刷新...'),
    -//				$this->_get_back_url('saler/bill', array('id' =>$id)),
    -//				1,
    -//				1
    -//			);
    -		}
    -		$url = 'admin/saler/displaywater/salerId/'.$salerId;
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array($url, 'reply')
    -		)));
    -		$customer = $this->customer_model->get_all_customer();
    -		$this->template->assign('customer',$customer);
    -		$saler = $this->saler_model->get_saler($salerId);
    -		$this->template->assign('saler',$saler);
    -		$this->template->assign('data',$data);
    -		$this->template->assign('time', time());
    -		$this->template->display('display_add.html');
    -	}
    -
    -	public function displaydel() {
    -		$id = $_GET['id'];
    -		$salerId = $_GET['salerId'];
    -		$this->saler_model->deldisplay($id);
    -				$this->admin_msg(
    -				fc_lang('操作成功,正在刷新...'),
    -				$this->_get_back_url('saler/displaywater', array('salerId'=>$salerId)),
    -				1,
    -				1
    -			);
    -	}
    -
    -
    -	public function displaywater()  {
    -		$salerId = $_GET['salerId'];
    -		$data  = $this->saler_model->getdisplaylist($salerId);
    -		$saler = $this->saler_model->get_saler($salerId);
    -		
    -		$url = 'admin/saler/displayadd/salerId/'.$salerId;
    -		$this->template->assign('menubill', $this->get_menu_v3(array(
    -			fc_lang('返回') => array('admin/saler/index', 'reply'),
    -			fc_lang('添加') => array($url.'_js', 'plus')
    -		)));
    -		$this->template->assign(array(
    -			'list' => $data,
    -			'salerId' => $salerId,
    -            'saler' => $saler,
    -			'param'	=> $param,
    -		));
    -		$this->template->display('display_index.html');
    -	}
    -
    -	//陈列导出
    -	public function display_exp() {
    -		$salerId = $_GET['salerId'];
    -		$data  = $this->saler_model->getdisplaylist($salerId);
    -		$saler = $this->saler_model->get_saler($salerId);
    -		$exp = array();
    -    	foreach ($data as $k => $v) {
    -    		$exp[$k]['name'] = $saler['name'];
    -    		$exp[$k]['cname'] = $v['cname'];
    -    		$exp[$k]['bucketNum'] = $v['bucketNum'];
    -    		$exp[$k]['bottleNum'] = $v['bottleNum'];
    -    		$exp[$k]['drinkNum'] = $v['drinkNum'];
    -    		$exp[$k]['created'] = $v['created'];
    -    		$exp[$k]['remark'] = $v['remark'];
    -    	}
    -    	$date = date('Y-m-d');
    -    	$filename = $date.'陈列统计.xls';
    -    	header('content-type:application/vnd.ms-excel;charset=UTF-8');
    -        header('content-disposition:attachment;filename='.$filename);
    -        header('Content-Transfer-Encoding: binary');
    -        header('Pragma:no-cache');
    -        header('Expires:0');
    -        header("Pragma: public");
    -        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    -        header("Content-Type:application/force-download");
    -        header("Content-Type:application/octet-stream");
    -        header("Content-Type:application/download");
    -
    -        $title = array(
    -            '销售人员',
    -            '客户名',
    -            '桶装水',
    -            '瓶装水',
    -            '饮料',
    -            '时间',
    -            '备注',
    -        );
    -        echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n";
    -        foreach ($exp as $key => $value) {
    -            echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n";
    -        }
    -        return false;
    -	}
    -
    -	public function exportFuel() {
    -		$salerId = $_GET['salerId'];
    -    	$date = date('Y-m-d');
    -    	$filename = $date.'加油信息.xls';
    -    	header('content-type:application/vnd.ms-excel;charset=UTF-8');
    -        header('content-disposition:attachment;filename='.$filename);
    -        header('Content-Transfer-Encoding: binary');
    -        header('Pragma:no-cache');
    -        header('Expires:0');
    -        header("Pragma: public");
    -        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    -        header("Content-Type:application/force-download");
    -        header("Content-Type:application/octet-stream");
    -        header("Content-Type:application/download");
    -
    -        $title = array(
    -            '销售人员',
    -            '车牌号',
    -            '加油量',
    -            '金额',
    -            '时间',
    -            '备注',
    -            
    -        );
    -        echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n";
    -
    -        $list = $this->saler_model->get_fuel_exp($salerId);
    -        foreach ($list as $key => $value) {
    -            echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n";
    -        }
    -        return false;
    -	}
    -
    -	public function exportBill() {
    -		$salerId = $_GET['salerId'];
    -    	$date = date('Y-m-d');
    -    	$filename = $date.'销售账单.xls';
    -    	header('content-type:application/vnd.ms-excel;charset=UTF-8');
    -        header('content-disposition:attachment;filename='.$filename);
    -        header('Content-Transfer-Encoding: binary');
    -        header('Pragma:no-cache');
    -        header('Expires:0');
    -        header("Pragma: public");
    -        header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
    -        header("Content-Type:application/force-download");
    -        header("Content-Type:application/octet-stream");
    -        header("Content-Type:application/download");
    -
    -        $title = array(
    -            '销售人员',
    -            '桶装水',
    -            '回桶',
    -            '瓶装水',
    -            '饮料',
    -            '检核人',
    -            '剩余桶装水',
    -            '剩余瓶装水',
    -            '剩余饮料',
    -            '回款',
    -            '时间',
    -            '备注'
    -        );
    -        echo iconv('utf-8', 'gbk', implode("\t", $title)) . "\n";
    -        $list = $this->saler_model->get_saler_bill_exp($salerId);
    -        foreach ($list as $key => $value) {
    -            echo iconv('utf-8', 'gbk', implode("\t", $value)) . "\n";
    -        }
    -        return false;
    -	}
    -
    -
    -}
    \ No newline at end of file
    diff --git a/finecms/finecms/dayrui/controllers/admin/Site.php b/finecms/finecms/dayrui/controllers/admin/Site.php
    deleted file mode 100644
    index 15a1f35..0000000
    --- a/finecms/finecms/dayrui/controllers/admin/Site.php
    +++ /dev/null
    @@ -1,279 +0,0 @@
    -template->assign(array(
    -			'menu' => $this->get_menu_v3(array(
    -				fc_lang('网站管理') => array('admin/site/index', 'globe'),
    -				fc_lang('添加') => array('admin/site/add_js', 'plus'),
    -			))
    -		));
    -		
    -		$this->load->model('site_model');
    -		$this->load->library('dconfig');
    -    }
    -	
    -	/**
    -     * 切换
    -     */
    -    public function select() {
    -	
    -		$id	= (int)$this->input->post('id');
    -		if (!isset($this->site_info[$id])) {
    -            exit(dr_json(0, fc_lang('域名配置文件中站点(#%s)不存在', $id)));
    -        }
    -
    -		$this->session->set_userdata('siteid', $id); // 保存Session
    -		exit(dr_json(1, fc_lang('成功切换到站点[%s],正在刷新页面...', $this->site_info[$id]['SITE_NAME']), $id));
    -	}
    -
    -    /**
    -     * 管理
    -     */
    -    public function index() {
    -	
    -		if (IS_POST) {
    -			$ids = $this->input->post('ids');
    -			if (!$ids) {
    -                exit(dr_json(0, fc_lang('您还没有选择呢')));
    -            }
    -			$_data = $this->input->post('data', true);
    -			foreach ($ids as $id) {
    -                if ($this->db->where('id<>', (int)$id)->where('domain', $_data[$id]['domain'])->count_all_results('site')) {
    -                    exit(dr_json(0, fc_lang('域名【%s】已经被使用了', $_data[$id]['domain'])));
    -                }
    -				$this->db->where('id', (int)$id)->update('site', $_data[$id]);
    -			}
    -            $this->site_model->cache();
    -            $this->system_log('修改网站站点【#'.@implode(',', $ids).'】'); // 记录日志
    -			exit(dr_json(1, fc_lang('操作成功')));
    -		}
    -
    -		$this->template->assign('list', $this->site_model->get_site_data());
    -		$this->template->display('site_index.html');
    -	}
    -	
    -	/**
    -     * 添加
    -     */
    -    public function add() {
    -	
    -		if (IS_POST) {
    -			$this->load->library('dconfig');
    -			$data = $this->input->post('data', TRUE);
    -			$domain	= require WEBPATH.'config/domain.php';
    -            if (!$data['name']) {
    -                exit(dr_json(0, fc_lang('网站名字不存在'), 'name'));
    -            } elseif (!preg_match('/[\w-_\.]+\.[\w-_\.]+/i', $data['domain'])) {
    -                exit(dr_json(0, fc_lang('域名不规范'), 'domain'));
    -            } elseif (in_array($data['domain'], $domain)) {
    -                exit(dr_json(0, fc_lang('%s已经存在', $data['domain']), 'domain'));
    -            } elseif ($this->db->where('domain', $data['domain'])->count_all_results('site')) {
    -                exit(dr_json(0, fc_lang('域名【%s】已经被使用了', $data['domain']), 'domain'));
    -            }
    -			// 初始化网站配置
    -			$cfg['SITE_NAME'] = $data['name'];
    -			$cfg['SITE_DOMAIN'] = $data['domain'];
    -			$cfg['SITE_DOMAINS'] = '';
    -			$cfg['SITE_TIMEZONE'] = '8';
    -			$cfg['SITE_LANGUAGE'] = 'zh-cn';
    -			$cfg['SITE_TIME_FORMAT'] = 'Y-m-d H:i';
    -			// 入库
    -			$data['setting'] = $cfg;
    -			$id	= $this->site_model->add_site($data);
    -			if (!$id) {
    -                exit(dr_json(0, dr_fc_lang('数据异常,入库失败')));
    -            }
    -
    -			// 保存域名
    -			$domain[$data['domain']] = $id;
    -			$size = $this->dconfig->file(WEBPATH.'config/site/'.$id.'.php')->note('站点配置文件')->space(32)->to_require_one($this->site_model->config, $cfg);
    -			if (!$size) {
    -                exit(dr_json(0, fc_lang('网站域名文件创建失败,请检查config目录权限')));
    -            }
    -			$size = $this->dconfig->file(WEBPATH.'config/domain.php')->note('站点域名文件')->space(32)->to_require_one($domain);
    -			if (!$size) {
    -                exit(dr_json(0, fc_lang('站点配置文件创建失败,请检查config目录权限')));
    -            }
    -            $this->site_model->cache();
    -            $this->system_log('添加网站站点【#'.$id.'】'.$data['name']); // 记录日志
    -			exit(dr_json(1, fc_lang('操作成功')));
    -		} else {
    -			$this->template->display('site_add.html');
    -		}
    -    }
    -	
    -	/**
    -     * 站点配置
    -     */
    -    public function config() {
    -
    -		$id = isset($_GET['id']) ? max((int)$_GET['id'], 1) : SITE_ID;
    -		$data = $this->site_model->get_site_info($id);
    -		if (!$data) {
    -            $this->admin_msg(fc_lang('域名配置文件中站点(#%s)不存在', $id));
    -        }
    -
    -        $result	= '';
    -
    -		if (IS_POST) {
    -			$cfg = $this->input->post('data', true);
    -			$cfg['SITE_DOMAIN'] = $this->input->post('domain', true);
    -            // 查询非当前站点绑定的域名
    -            $as = array();
    -            $all = $this->db->where('id<>', $id)->get('site')->result_array();
    -            if ($all) {
    -                foreach ($all as $b) {
    -                    $set = dr_string2array($b['setting']);
    -                    $as[] = $b['domain'];
    -                    if ($set['SITE_MOBILE']) {
    -                        $as[] = $set['SITE_MOBILE'];
    -                    }
    -                    if ($set['SITE_DOMAINS']) {
    -                        $_arr = @explode(',', $set['SITE_DOMAINS']);
    -                        if ($_arr) {
    -                            foreach ($_arr as $_a) {
    -                                if ($_a) {
    -                                    $as[] = $_a;
    -                                }
    -                            }
    -                        }
    -                    }
    -                }
    -            }
    -            // 判断域名是否可用
    -            if (in_array($cfg['SITE_DOMAIN'], $as)) {
    -                $result = fc_lang('域名【%s】已经被使用了', $cfg['SITE_DOMAIN']);
    -            } else {
    -                $cfg['SITE_DOMAINS'] = str_replace(PHP_EOL, ',', $cfg['SITE_DOMAINS']);
    -                // 多域名验证
    -                if ($cfg['SITE_DOMAINS']) {
    -                    $arr = @explode(',', $cfg['SITE_DOMAINS']);
    -                    if ($arr) {
    -                        foreach ($arr as $a) {
    -                            if (in_array($a, $as)
    -                                || $a == $cfg['SITE_DOMAIN']
    -                                || $a == $cfg['SITE_MOBILE']) {
    -                                $result = fc_lang('域名【%s】已经被使用了', $a);
    -                                break;
    -                            }
    -                        }
    -                    }
    -                }
    -                if (!$result) {
    -                    $cfg['SITE_IMAGE_CONTENT'] = $cfg['SITE_IMAGE_WATERMARK'] ? $cfg['SITE_IMAGE_CONTENT'] : 0;
    -                    $data = array(
    -                        'name' => $cfg['SITE_NAME'],
    -                        'domain' => $cfg['SITE_DOMAIN'],
    -                        'setting' => $cfg
    -                    );
    -                    $this->site_model->edit_site($id, $data);
    -                    $domain	= require WEBPATH.'config/domain.php';
    -                    $domain[$cfg['SITE_DOMAIN']] = $id;
    -                    if ($cfg['SITE_MOBILE']) {
    -                        $domain[$cfg['SITE_MOBILE']] = $id;
    -                    }
    -                    $this->dconfig->file(WEBPATH.'config/site/'.$id.'.php')->note('站点配置文件')->space(32)->to_require_one($this->site_model->config, $cfg);
    -                    $this->dconfig->file(WEBPATH.'config/domain.php')->note('站点域名文件')->space(32)->to_require_one($domain);
    -                    $result	= 1;
    -                }
    -            }
    -            $data = $cfg;
    -            $this->site_model->cache();
    -			// 删除站点首页缓存
    -			$this->load->helper('file');
    -			delete_files(WEBPATH.'cache/index/');
    -            $this->system_log('配置网站站点【#'.$id.'】'.$data['name']); // 记录日志
    -		}
    -		
    -		$this->load->helper('directory');
    -		$files = directory_map(WEBPATH.'statics/watermark/', 1);
    -		$opacity = array();
    -		foreach ($files as $t) {
    -			if (substr($t, -3) == 'ttf') {
    -				$font[] = $t;
    -			} else {
    -				$opacity[] = $t;
    -			}
    -		}
    -
    -		$template_path = dr_dir_map(TPLPATH.'pc/', 1);
    -
    -
    -		$this->template->assign(array(
    -			'id' => $id,
    -            'ip' => $this->_get_server_ip(),
    -            'data' => $data,
    -			'page' => max((int)$this->input->post('page'), 0),
    -			'lang' => dr_dir_map(FCPATH.'dayrui/language/', 1),
    -			'theme' => dr_get_theme(),
    -			'result' => $result,
    -			'is_theme' => strpos($data['SITE_THEME'], 'http://') === 0 ? 1 : 0,
    -			'wm_opacity' => $opacity,
    -			'wm_font_path' => $font,
    -			'template_path' => $template_path,
    -			'wm_vrt_alignment' => array('top', 'middle', 'bottom'),
    -			'wm_hor_alignment' => array('left', 'center', 'right'),
    -		));
    -		$this->template->display('site_config.html');
    -    }
    -	
    -	/**
    -     * 删除
    -     */
    -    public function del() {
    -		$id = (int)$this->input->get('id');
    -		if (!$this->site_info[$id]) {
    -            $this->admin_msg(fc_lang('站点不存在,请尝试更新一次缓存'));
    -        }
    -		if ($id == 1) {
    -            $this->admin_msg(fc_lang('主站点不能删除'));
    -        }
    -		// 卸载模型
    -		$module = $this->db->get('module')->result_array();
    -		if ($module) {
    -			$this->load->model('module_model');
    -			foreach ($module as $t) {
    -				$this->module_model->uninstall($t['dirname'], $id);
    -			}
    -		}
    -		// 删除表
    -        $this->db->query('DROP TABLE IF EXISTS `'.$this->db->dbprefix($id.'_form').'`');
    -        $this->db->query('DROP TABLE IF EXISTS `'.$this->db->dbprefix($id.'_block').'`');
    -        $this->db->query('DROP TABLE IF EXISTS `'.$this->db->dbprefix($id.'_tag').'`');
    -        $this->db->query('DROP TABLE IF EXISTS `'.$this->db->dbprefix($id.'_index').'`');
    -        $this->db->query('DROP TABLE IF EXISTS `'.$this->db->dbprefix($id.'_category').'`');
    -		// 删除站点
    -		$this->db->delete('site', 'id='.$id);
    -        // 删除字段
    -		$this->db->where('relatedid', $id)->where('relatedname', 'category')->delete('field');
    -		// 删除该站配置
    -		unlink(WEBPATH.'config/site/'.$id.'.php');
    -		// 删除该站附件
    -		$this->load->model('attachment_model');
    -		$this->attachment_model->delete_for_site($id);
    -        $this->system_log('删除网站站点【#'.$id.'】'); // 记录日志
    -		$this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('site/index'), 1);
    -    }
    -	
    -	/**
    -     * 缓存
    -     */
    -    public function cache() {
    -		$this->site_model->cache();
    -        (int)$_GET['admin'] or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1);
    -	}
    -}
    \ No newline at end of file
    diff --git a/finecms/finecms/dayrui/controllers/admin/System.php b/finecms/finecms/dayrui/controllers/admin/System.php
    deleted file mode 100644
    index 429f87b..0000000
    --- a/finecms/finecms/dayrui/controllers/admin/System.php
    +++ /dev/null
    @@ -1,173 +0,0 @@
    -load->library('dconfig');
    -            $post = $this->input->post('data', true);
    -            $save = array(
    -                'SYS_DEBUG',
    -                'SYS_AUTO_CACHE',
    -                'SYS_CAT_MODULE',
    -                'SYS_HTTPS',
    -                'SYS_LOG',
    -                'SITE_ADMIN_CODE',
    -                'SITE_ADMIN_PAGESIZE',
    -                'SYS_EMAIL',
    -                'SYS_KEY',
    -            );
    -            foreach ($save as $key) {
    -                if ($key == 'SYS_KEY') {
    -                    $value = $post[$key] == '***' ? $data[$key] : $post[$key];
    -                } else {
    -                    $value = isset($post[$key]) ? $post[$key] : 0;
    -                    $value === 'TRUE' && $value = 1;
    -                }
    -                $data[$key] = $value;
    -            }
    -
    -            $this->dconfig->file(WEBPATH.'config/system.php')->note('系统配置文件')->space(32)->to_require($data);
    -
    -            $this->system_log('修改系统配置'); // 记录日志
    -            $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('system/'.$this->router->method), 1);
    -        }
    -
    -
    -        $this->template->assign(array(
    -            'page' => 0,
    -            'data' => $data,
    -            'menu' => $this->get_menu_v3(array(
    -                fc_lang('系统配置') => array('admin/system/config', 'cog'),
    -            ))
    -        ));
    -        $this->template->display('system_index.html');
    -    }
    -	
    -	/**
    -     * 系统操作日志
    -     */
    -    public function index() {
    -
    -		$time = isset($_POST['data']['time']) && $_POST['data']['time'] ? (int)$_POST['data']['time'] : (int)$this->input->get('time');
    -        $time = $time ? $time : SYS_TIME;
    -        $file = WEBPATH.'cache/optionlog/'.date('Ym', $time).'/'.date('d', $time).'.log';
    -
    -        $list = array();
    -        $data = @explode(PHP_EOL, file_get_contents($file));
    -        $data = @array_reverse($data);
    -
    -        $page = IS_POST ? 1 : max(1, (int)$this->input->get('page'));
    -        $total = count($data);
    -        $limit = ($page - 1) * SITE_ADMIN_PAGESIZE;
    -
    -        $i = $j = 0;
    -
    -        foreach ($data as $v) {
    -            if ($v && $i >= $limit && $j < SITE_ADMIN_PAGESIZE) {
    -                $list[] = $v;
    -                $j ++;
    -            }
    -            $i ++;
    -        }
    -
    -        $this->load->library('dip');
    -        $this->template->assign(array(
    -            'menu' => $this->get_menu_v3(array(
    -                fc_lang('操作日志') => array('admin/system/index', 'calendar'),
    -            ))
    -        ));
    -
    -        $this->template->assign(array(
    -            'time' => $time,
    -            'list' => $list,
    -            'total' => $total,
    -            'pages'	=> $this->get_pagination(dr_url('system/index', array('time' => $time)), $total)
    -        ));
    -        $this->template->display('system_oplog.html');
    -	}
    -
    -	/**
    -     * debug
    -     */
    -    public function debug() {
    -
    -		$time = isset($_POST['data']['time']) && $_POST['data']['time'] ? (int)$_POST['data']['time'] : (int)$this->input->get('time');
    -        $time = $time ? $time : SYS_TIME;
    -        $total = 0;
    -        $file = WEBPATH.'cache/errorlog/log-'.date('Y-m-d', $time).'.php';
    -        if (is_file($file)) {
    -
    -
    -            $log = trim(str_replace("", '', file_get_contents($file)), PHP_EOL);
    -
    -            $data = @explode(PHP_EOL, str_replace(chr(10), PHP_EOL, $log));
    -
    -            $data && $data = @array_reverse($data);
    -
    -            $page = IS_POST ? 1 : max(1, (int)$this->input->get('page'));
    -            $total = count($data);
    -            $limit = ($page - 1) * SITE_ADMIN_PAGESIZE;
    -
    -            $i = $j = 0;
    -
    -            foreach ($data as $t) {
    -                if ($t && $i >= $limit && $j < SITE_ADMIN_PAGESIZE) {
    -                    $v = @explode(' --> ', $t);
    -                    $time2 = $v ? @explode(' - ', $v[0]) : array(1=>'');
    -                    $list[] = array(
    -                        'time' => $time2[1],
    -                        'error' => $v[1],
    -                    );
    -                    $j ++;
    -                }
    -                $i ++;
    -            }
    -
    -        }
    -
    -        $this->template->assign(array(
    -            'menu' => $this->get_menu_v3(array(
    -                fc_lang('错误日志') => array('admin/system/debug', 'bug'),
    -            ))
    -        ));
    -        $this->template->assign(array(
    -            'time' => $time,
    -            'list' => $list,
    -            'total' => $total,
    -            'pages'	=> $this->get_pagination(dr_url('system/debug', array('time' => $time)), $total)
    -        ));
    -        $this->template->display('system_debug.html');
    -	}
    -
    -	/**
    -     * 生成安全码
    -     */
    -    public function syskey() {
    -		echo 'CI3'.strtoupper(substr((md5(SYS_TIME)), rand(0, 10), 13));exit;
    -	}
    -
    -	/**
    -     * 生成来路随机字符
    -     */
    -    public function referer() {
    -		$s = strtoupper(base64_encode(md5(SYS_TIME).md5(rand(0, 2015).md5(rand(0, 2015)))).md5(rand(0, 2009)));
    -		echo str_replace('=', '', substr($s, 0, 64));exit;
    -	}
    -
    -
    -}
    \ No newline at end of file
    diff --git a/finecms/finecms/dayrui/controllers/admin/Tag.php b/finecms/finecms/dayrui/controllers/admin/Tag.php
    deleted file mode 100644
    index 9532665..0000000
    --- a/finecms/finecms/dayrui/controllers/admin/Tag.php
    +++ /dev/null
    @@ -1,190 +0,0 @@
    -load->model('tag_model');
    -        $this->pid = intval($_GET['pid']);
    -        $this->mydb = $this->db; // 数据库
    -        $this->tfield = '`displayorder`'; // 时间字段用于搜索和排序
    -        $this->mytable = SITE_ID.'_tag';
    -        $this->mywhere = 'pid='.$this->pid;
    -        $this->post_param = array('pid' => $this->pid);
    -        $this->myfield = array(
    -            'name' => array(
    -                'ismain' => 1,
    -                'name' => fc_lang('名称'),
    -                'fieldname' => 'name',
    -                'fieldtype' => 'Text',
    -                'setting' => array(
    -                    'option' => array(
    -                        'width' => 200,
    -                    ),
    -                    'is_right' => 2,
    -                )
    -            ),
    -            'displayorder' => array(
    -                'name' => fc_lang('权重值'),
    -                'ismain' => 1,
    -                'fieldtype' => 'Text',
    -                'fieldname' => 'displayorder',
    -                'setting' => array(
    -                    'option' => array(
    -                        'width' => 200,
    -                        'value' => 0
    -                    ),
    -                    'validate' => array(
    -                        'tips' => fc_lang('权重值越高排列越靠前'),
    -                    )
    -                )
    -            ),
    -            'content' => array(
    -                'ismain' => 1,
    -                'name' => fc_lang('描述'),
    -                'fieldname' => 'content',
    -                'fieldtype' => 'Ueditor',
    -                'setting' => array(
    -                    'option' => array(
    -                        'mode' => 1,
    -                        'height' => 300,
    -                        'width' => '100%'
    -                    ),
    -                )
    -            ),
    -        );
    -        $field['name'] = $this->myfield['name'];
    -        $field['content'] = $this->myfield['content'];
    -        //$this->myfield = dr_array22array($this->myfield, $this->get_cache('tag-'.SITE_ID.'-field'));
    -        $this->template->assign(array(
    -            'pid' => $this->pid,
    -            'field' => $field,
    -            'menu' => $this->get_menu_v3(array(
    -                fc_lang('关键词库') => array('admin/tag/index', 'tag'),
    -                fc_lang('添加') => array('admin/tag/add', 'plus'),
    -                fc_lang('批量添加') => array('admin/tag/all_add', 'plus-square-o'),
    -                fc_lang('更新缓存') => array(APP_DIR.'/admin/tag/cache', 'refresh'),
    -                //'自定义字段' => array('admin/field/index/rname/tag/rid/'.SITE_ID, 'plus-square'),
    -            )),
    -        ));
    -    }
    -
    -    /**
    -     * 管理
    -     */
    -    public function index() {
    -
    -        if (IS_POST && $this->input->post('action') == 'del') {
    -            $ids = $this->input->post('ids', TRUE);
    -            if (!$ids) {
    -                exit(dr_json(0, fc_lang('您还没有选择呢')));
    -            }
    -            $this->db->where_in('id', $ids)->delete($this->mytable);
    -            $this->db->where_in('pid', $ids)->delete($this->mytable);
    -            exit(dr_json(1, fc_lang('操作成功,正在刷新...')));
    -        }
    -
    -        $this->_index();
    -        $this->template->display('tag_list.html');
    -    }
    -
    -
    -    public function add() {
    -
    -        $this->_add();
    -        $this->template->display('tag_post.html');
    -    }
    -
    -    public function edit() {
    -
    -
    -        $this->_edit();
    -        $this->template->assign(array(
    -            'pid' => $this->pid,
    -        ));
    -        $this->template->display('tag_post.html');
    -    }
    -
    -    // 后台批量添加内容
    -    public function all_add() {
    -
    -        if (IS_POST) {
    -            $rt = $this->tag_model->save_all_data($this->pid, $_POST['all']);
    -            $this->admin_msg($rt, dr_url($this->router->class.'/index', $this->post_param), 1);
    -        }
    -
    -        $this->template->display('tag_all.html');
    -    }
    -
    -    // 重写:获取数据
    -    public function _get_data($id) {
    -        $data = $this->mydb->where($this->myid, intval($id))->get($this->mytable)->row_array();
    -        $this->pid = $data['pid'];
    -        $this->post_param = array('pid' => $data['pid']);
    -        return $data;
    -    }
    -
    -    // 插入数据
    -    public function _insert_data($data) {
    -
    -
    -        $data['pid'] = (int)$this->pid;
    -        $data['name'] = dr_safe_replace($_POST['data']['name']);
    -        $data['code'] = dr_safe_replace($_POST['data']['code']);
    -        $data['hits'] = intval($_POST['data']['hits']);
    -
    -        if ($this->tag_model->check_code(0, $data['code'])) {
    -            $this->admin_msg(fc_lang('别名已经存在'));
    -        } elseif ($this->tag_model->check_name(0, $data['name'])) {
    -            $this->admin_msg(fc_lang('关键词名称已经存在'));
    -        }
    -        
    -        $data['childids'] = '';
    -        $data['pcode'] = '';
    -        $data['url'] = '';
    -        $data['total'] = 0;
    -
    -        $this->mydb->insert($this->mytable, $data);
    -
    -        return $this->mydb->insert_id();
    -    }
    -
    -    // 重写:更新数据
    -    public function _update_data($id, $data, $_data) {
    -
    -        $data['hits'] = intval($_POST['data']['hits']);
    -        $data['name'] = dr_safe_replace($_POST['data']['name']);
    -        $data['code'] = dr_safe_replace($_POST['data']['code']);
    -
    -        if ($this->tag_model->check_code($id, $data['code'])) {
    -            $this->admin_msg(fc_lang('别名已经存在'));
    -        } elseif ($this->tag_model->check_name($id, $data['name'])) {
    -            $this->admin_msg(fc_lang('关键词名称已经存在'));
    -        }
    -
    -        $this->mydb->where($this->myid, $id)->update($this->mytable, $data);
    -    }
    -
    -
    -
    -    /**
    -     * 缓存
    -     */
    -    public function cache() {
    -        $this->tag_model->cache(isset($_GET['site']) && $_GET['site'] ? (int)$_GET['site'] : SITE_ID);
    -        (int)$_GET['admin'] or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1);
    -    }
    -
    -}
    \ No newline at end of file
    diff --git a/finecms/finecms/dayrui/controllers/admin/Upgrade.php b/finecms/finecms/dayrui/controllers/admin/Upgrade.php
    deleted file mode 100644
    index 24f3bbe..0000000
    --- a/finecms/finecms/dayrui/controllers/admin/Upgrade.php
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -template->assign(array(
    -            'menu' => $this->get_menu_v3(array(
    -                fc_lang('程序升级') => array('admin/upgrade/index', 'refresh'),
    -            )),
    -        ));
    -        $this->template->display('upgrande.html');
    -    }
    -
    -
    -	// 版本列表
    -    public function vlist() {
    -
    -        $data = dr_catcher_data('http://www.finecms.net/version.php');
    -
    -        if (!$data) {
    -            exit('

    暂时无法获取到服务器端版本信息

    '); - } - - if (strlen($data) > 20) { - exit('

    返回数据不规范,请联系官方!

    '); - } - - $fwq = (string)(date('Y.m.d', strtotime($data))); - $azb = (string)(DR_UPDATE); - if ($fwq != $azb) { - $data.= ','.'有新版本可更新'; - - } - - - echo('

    本网站程序更新时间为: '.DR_UPDATE.'

    '); - - exit('

    服务器程序更新时间为: '.$data.'

    '); - - - } - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Urlrule.php b/finecms/finecms/dayrui/controllers/admin/Urlrule.php deleted file mode 100644 index 4d767d2..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Urlrule.php +++ /dev/null @@ -1,147 +0,0 @@ -type = array( - 3 => fc_lang('栏目'), - 4 => fc_lang('站点'), - ); - $this->template->assign('type', $this->type); - $this->template->assign('menu', $this->get_menu_v3(array( - fc_lang('URL规则') => array('admin/urlrule/index', 'magnet'), - fc_lang('添加') => array('admin/urlrule/add', 'plus'), - fc_lang('伪静态规则') => array('admin/route/index', 'safari'), - ))); - } - - /** - * 管理 - */ - public function index() { - - if (IS_POST) { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - if (!$this->is_auth('admin/urlrule/del')) { - exit(dr_json(0, fc_lang('您无权限操作'))); - } - $this->db->where_in('id', $ids)->delete('urlrule'); - $this->cache(1); - $this->system_log('删除URL规则【#'.@implode(',', $ids).'】'); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - $this->template->assign(array( - 'list' => $this->db->get('urlrule')->result_array(), - 'color' => array( - 0 => 'default', - 1 => 'info', - 2 => 'success', - 3 => 'warning', - 4 => 'danger', - 5 => '', - 6 => 'primary', - ), - )); - $this->template->display('urlrule_index.html'); - } - - /** - * 复制 - */ - public function copy() { - - $id = (int)$this->input->get('id'); - $data = $this->db - ->where('id', $id) - ->limit(1) - ->get('urlrule') - ->row_array(); - if ($data) { - $this->db->insert('urlrule', array( - 'type' => $data['type'], - 'name' => $data['name'].'_copy', - 'value' => $data['value'], - )); - $this->cache(1); - $this->system_log('复制URL规则【#'.$id.'】'); // 记录日志 - } - - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - - /** - * 添加 - */ - public function add() { - - if (IS_POST) { - $this->db->insert('urlrule', array( - 'type' => $this->input->post('type'), - 'name' => $this->input->post('name'), - 'value' => dr_array2string($this->input->post('data')), - )); - $this->system_log('添加URL规则【#'.$this->db->insert_id().'】'.$this->input->post('name')); // 记录日志 - $this->cache(1); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('urlrule/index'), 1); - } - - $this->template->display('urlrule_add.html'); - } - - /** - * 修改 - */ - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->db - ->where('id', $id) - ->limit(1) - ->get('urlrule') - ->row_array(); - if (!$data) { - $this->admin_msg(fc_lang('对不起,数据被删除或者查询不存在')); - } - - if (IS_POST) { - $this->db->where('id', $id)->update('urlrule', array( - 'name' => $this->input->post('name'), - 'value' => dr_array2string($this->input->post('data')), - )); - $this->cache(1); - $this->system_log('修改URL规则【#'.$id.'】'.$this->input->post('name')); // 记录 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url('urlrule/index'), 1); - } - - $data['value'] = dr_string2array($data['value']); - $this->template->assign(array( - 'data' => $data, - )); - $this->template->display('urlrule_add.html'); - } - - /** - * 缓存 - */ - public function cache($update = 0) { - $this->system_model->urlrule(); - ((int)$_GET['admin'] || $update) or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Weixin.php b/finecms/finecms/dayrui/controllers/admin/Weixin.php deleted file mode 100644 index 15a2560..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Weixin.php +++ /dev/null @@ -1,211 +0,0 @@ -load->model('weixin_model'); - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - fc_lang('微信配置') => array('admin/weixin/index', 'weixin'), - fc_lang('更新缓存') => array('admin/weixin/cache', 'refresh'), - )), - )); - } - - /** - * 公众号配置 - */ - public function index() { - - - $page = (int)$this->input->get('page'); - $field = array( - 'qrcode' => array( - 'ismain' => 1, - 'fieldtype' => 'File', - 'fieldname' => 'qrcode', - 'setting' => array( - 'option' => array( - 'ext' => 'jpg', - 'size' => 99999, - ) - ) - ), - ); - $data = $this->weixin_model->config('config'); - - if (IS_POST) { - $update = $this->input->post('data'); - $this->validate_filter($field); - $this->weixin_model->config('config', $update); - $this->attachment_handle($this->uid, $this->weixin_model->prefix.'-0', $field, $data); - $this->cache(1); - $this->system_log('微信:修改公众号配置'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url($this->router->class.'/'.$this->router->method, array('page' => (int)$this->input->post('page'))), 1); - } - - $this->template->assign(array( - 'page' => $page, - 'data' => $data, - 'field' => $field, - )); - $this->template->display('weixin_index.html'); - } - - // 回复设置 - public function reply() { - - $page = (int)$this->input->get('page'); - $data = $this->weixin_model->config('reply'); - - if (IS_POST) { - $update = $this->input->post('data'); - if ($update['hello'] && !$this->db->where('id', $update['hello'])->count_all_results($this->weixin_model->prefix.'_keyword')) { - $this->admin_msg('关键字ID('.$update['hello'].')不存在,请确保它存在于关键字库中'); - } - if ($update['reply'] && !$this->db->where('id', $update['reply'])->count_all_results($this->weixin_model->prefix.'_keyword')) { - $this->admin_msg('关键字ID('.$update['reply'].')不存在,请确保它存在于关键字库中'); - } - $this->weixin_model->config('reply', $update); - $this->cache(1); - $this->system_log('微信:修改公众号配置'); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url($this->router->class.'/'.$this->router->method, array('page' => (int)$this->input->post('page'))), 1); - } - - $this->template->assign(array( - 'page' => $page, - 'data' => $data, - 'menu' => $this->get_menu_v3(array( - fc_lang('系统回复设置') => array('admin/weixin/reply', 'cog'), - fc_lang('更新缓存') => array('admin/weixin/cache', 'refresh'), - )), - )); - $this->template->display('weixin_reply.html'); - } - - // 加载表情 - public function emoji() { - - $this->template->assign(array( - 'callback' => $_GET['callback'] - )); - $this->template->display('weixin_emoji.html'); - } - - // 上传文件upload - public function ajaxload() { - - $path = SYS_UPLOAD_PATH.'/weixin/'.date('Ym', SYS_TIME).'/'; - if (!is_dir($path)) { - dr_mkdirs($path); - } - - $this->load->library('upload', array( - 'max_size' => 102400, - 'overwrite' => FALSE, - 'file_name' => substr(md5(time()), rand(0, 20), 10), - 'upload_path' => $path, - 'allowed_types' => $this->input->get('ext'), - 'file_ext_tolower' => TRUE, - )); - if ($this->upload->do_upload('download')) { - $info = $this->upload->data(); - $this->load->model('attachment_model'); - $this->attachment_model->siteid = SITE_ID; - $result = $this->attachment_model->upload($this->uid, $info); - if (!is_array($result)) { - exit('0,'.$result); - } - list($id, $file, $_ext) = $result; - echo json_encode(array( - 'status'=>1, - 'info'=>'上传成功', - 'data'=> '', - 'id'=> $id, - 'path'=> $file, - 'file'=> $file, - 'url'=> $file, - ));exit; - } else { - echo json_encode(array('status'=>0, 'info'=>$this->upload->display_errors('', ''), 'data'=> ''));exit; - } - - } - - // 推送新闻 - public function ts() { - - $mid = $this->input->get('mid'); - $ids = $this->input->get('ids'); - $ok = (int)$this->input->get('ok'); - $sb = (int)$this->input->get('sb'); - $value = (int)$this->input->get('value'); - if (!$ids) { - $this->admin_msg(fc_lang('您还没有选择呢')); - } - - $url = dr_url('weixin/ts', array('mid'=>$mid, 'value'=>$value, 'ids' => $ids)); - - $page = (int)$this->input->get('page'); - if (!$page) { - $this->admin_msg(fc_lang('正在开始推送到微信端...'), $url.'&page=1', 2); - } - - $data = $this->db->where_in('id', $ids)->get(SITE_ID.'_'.$mid)->result_array(); - if (!$data) { - $this->admin_msg(fc_lang('没有可用内容')); - } - - // 全部粉丝 - $psize = 10; // 每次发送n个粉丝 - $allUser = $this->db->limit($psize, $psize * ($page - 1))->get($this->weixin_model->prefix.'_follow')->result_array(); - if (!$allUser) { - // 发送完毕 - $this->admin_msg(fc_lang('发送完毕,成功('.$ok.'),失败('.$sb.')'), '', 1); - } - - $articles = array(); - foreach ( $data as $vo ) { - // 文章内容 - $art ['title'] = $vo ['title']; - $art ['description'] = $vo ['description']; - $art ['url'] = $vo ['url']; - // 获取封面图片URL - $art ['picurl'] = dr_get_file( $vo ['thumb'] ); - $articles [] = $art; - } - - // 群发 - foreach ( $allUser as $k => $v ) { - $k = $v['openid']; - $param = array(); - $param ['news'] ['articles'] = $articles; - $result = $this->weixin_model->_replyData($k, $param, 'news'); - if ($result ['status'] == 1) { - $ok ++; - } else { - $sb ++; - } - } - - $this->admin_msg(fc_lang('正在开始推送到微信端('.$page.')...'), $url.'&page='.($page+1).'&ok='.$ok.'&sb='.$sb, 2); - - } - - /** - * 缓存 - */ - public function cache($update = 0) { - - $this->weixin_model->cache(isset($_GET['site']) && $_GET['site'] ? (int)$_GET['site'] : SITE_ID); - - ((int)$_GET['admin'] || $update) or $this->admin_msg(fc_lang('操作成功,正在刷新...'), isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', 1); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Wmenu.php b/finecms/finecms/dayrui/controllers/admin/Wmenu.php deleted file mode 100644 index bbf0518..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Wmenu.php +++ /dev/null @@ -1,187 +0,0 @@ -load->model('weixin_model'); - $this->mydb = $this->db; // 数据库 - $this->tfield = 'displayorder'; // 时间字段用于搜索和排序 - $this->mytable = $this->weixin_model->prefix . '_menu'; - - $this->template->assign(array( - 'menu' => $this->get_menu_v3(array( - '菜单管理' => array('admin/wmenu/index', 'table'), - '添加' => array('admin/wmenu/add', 'plus'), - '同步到微信服务器' => array('admin/wmenu/syc', 'refresh'), - )), - 'type' => array( - 'url' => 'URL链接', - 'member' => '登录授权', - ), - )); - } - - - // 同步到微信 - public function syc() { - - $data = $this->db->where('pid', 0)->order_by('displayorder asc')->get($this->mytable)->result_array(); - if ($data) { - $json = array(); - foreach ($data as $i => $t) { - $list = $this->db->where('pid', (int)$t['id'])->order_by('displayorder asc')->get($this->mytable)->result_array(); - if ($list) { - $val = array(); - foreach ($list as $c) { - $val[] = $this->_get_menu_data($c); - } - $json[] = array( - 'name' => $t['name'], - 'sub_button' => $val - ); - } else { - $json[] = $this->_get_menu_data($t); - } - } - - $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' . dr_get_access_token (); - $res = dr_weixin_post( $url, dr_weixin_en_json(array('button'=>$json))); - if (isset ( $res ['errcode'] ) && $res ['errcode'] != 0) { - $this->admin_msg(dr_error_msg ( $res, '' ) ); - }else{ - $this->admin_msg('同步成功,需要24小时微信客户端才会展现出来。', '', 1); - } - } else { - $this->admin_msg('你还没有创建菜单呢!'); - } - } - - // 获取同步规则值 - private function _get_menu_data($data) { - - // 按应用来判断类别 - if ($data['type'] == 'url') { - // 地址模式 - return array( - 'type' => 'view', - 'name' => $data['name'], - 'url' => $data['value'], - ); - } elseif ($data['type'] == 'member') { - // 授权模式 - return array( - 'type' => 'view', - 'name' => $data['name'], - 'url' => SITE_URL.'index.php?c=weixin&m=sync&url='.urlencode($data['value']), - ); - } - - } - - /** - * 菜单管理 - */ - public function index() { - - if (IS_POST) { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - // 可以不用判断权限 - if ($this->input->post('action') == 'order') { - $post = $this->input->post('data'); - foreach ($ids as $id) { - $this->db->where('id', (int)$id)->update($this->mytable, array('displayorder' => (int)$post[$id]['displayorder'])); - } - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } else { - foreach ($ids as $id) { - $this->db->where('id', (int)$id)->delete($this->mytable); - $this->db->where('pid', (int)$id)->delete($this->mytable); - } - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - - $data = $this->db->where('pid', 0)->order_by('displayorder asc')->get($this->mytable)->result_array(); - if ($data) { - foreach ($data as $i => $t) { - $data[$i]['data'] = $this->db - ->where('pid', (int)$t['id']) - ->order_by('displayorder asc') - ->get($this->mytable) - ->result_array(); - } - } - $this->template->assign(array( - 'list' => $data, - )); - $this->template->display('wmenu_index.html'); - } - - public function add() { - - $pid = (int)$this->input->get('pid'); - - if (IS_POST) { - $data = $this->input->post('data'); - $value = $this->input->post('value'); - if (!$data['name']) { - $this->admin_msg('名称不能为空!'); - } - $data['displayorder'] = 0; - $data['value'] = isset($value[$data['type']]) ? $value[$data['type']] : ''; - $this->db->insert($this->mytable, $data); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url($this->router->class.'/index'), 1); - } else { - $data['type'] = 'url'; - } - - $this->template->assign(array( - 'pid' => $pid, - 'top' => $this->db->where('pid', 0)->order_by('displayorder asc')->get($this->mytable)->result_array(), - 'data' => $data, - )); - $this->template->display('wmenu_add.html'); - } - - public function edit() { - - $id = (int)$this->input->get('id'); - $data = $this->db->where('id', $id)->get($this->mytable)->row_array(); - - if (IS_POST) { - $post = $this->input->post('data'); - if (!$post['name']) { - $this->admin_msg('名称不能为空!'); - } - $value = $this->input->post('value'); - $post['value'] = isset($value[$post['type']]) ? $value[$post['type']] : ''; - $this->db->where('id', $id)->update($this->mytable, $post); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url($this->router->class.'/index'), 1); - } - - $this->template->assign(array( - 'pid' => $data['pid'], - 'top' => $this->db->where('pid', 0)->order_by('displayorder asc')->get($this->mytable)->result_array(), - 'data' => $data, - )); - $this->template->display('wmenu_add.html'); - } - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/admin/Wuser.php b/finecms/finecms/dayrui/controllers/admin/Wuser.php deleted file mode 100644 index bff2354..0000000 --- a/finecms/finecms/dayrui/controllers/admin/Wuser.php +++ /dev/null @@ -1,196 +0,0 @@ -load->model('weixin_model'); - $this->mydb = $this->db; // 数据库 - $this->tfield = 'subscribe_time'; - $this->mytable = $this->weixin_model->prefix.'_user'; - $this->myfield = $field = array( - 'uid' => array( - 'name' => 'Uid', - 'ismain' => 1, - 'fieldname' => 'uid', - ), - 'username' => array( - 'name' => '会员账号', - 'ismain' => 1, - 'fieldname' => 'username', - ), - ); - $this->template->assign(array( - 'field' => $field, - 'menu' => $this->get_menu_v3(array( - '粉丝管理' => array('admin/wuser/index', 'user'), - '与微信公众平台同步' => array('admin/wuser/syc', 'refresh'), - )), - )); - } - - /** - * 微信粉丝管理 - */ - public function index() { - - if (IS_POST && $_POST['data']['field'] == 'nickname') { - $key = $_POST['data']['keyword']; - $key2 = str_replace ( '\u', '\\\\\\\\u', trim ( dr_deal_emoji ($key, 0 ), '"' ) ); - - // 搜索用户表 - $this->mywhere = "(nickname LIKE '%$key%' OR nickname LIKE '%$key2%')"; - } elseif (IS_POST && $this->input->post('action') == 'order') { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - $gid = (int)$this->input->post('gid'); - $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=' . dr_get_access_token (); - foreach ($ids as $id) { - $param = array(); - $param ['openid'] = $id; - $param ['to_groupid'] = $gid; - $param = JSON ( $param ); - dr_post_data( $url, $param ); - } - $this->db->where_in('openid', $ids)->update($this->weixin_model->prefix.'_user', array('groupid' => $gid)); - exit(dr_json(1, fc_lang('更改分组成功'))); - } elseif (IS_POST && $this->input->post('action') == 'del') { - $ids = $this->input->post('ids', TRUE); - if (!$ids) { - exit(dr_json(0, fc_lang('您还没有选择呢'))); - } - $this->db->where_in('openid', $ids)->delete($this->weixin_model->prefix.'_user'); - $this->db->where_in('openid', $ids)->delete($this->weixin_model->prefix.'_follow'); - exit(dr_json(1, fc_lang('成功删除粉丝'))); - } - - // 数据库中分页查询 - list($data, $total, $param) = $this->limit_page(); - $param['total'] = $total; - $this->template->assign(array( - 'list' => $data, - 'total' => $total, - 'pages' => $this->get_pagination(dr_url(APP_DIR.'/'.$this->router->class.'/'.$this->router->method, $param), $total), - 'param' => $param, - )); - - $this->template->display('wuser_index.html'); - } - - public function syc() { - - $action = $this->input->get('action'); - if (!$action) { - $url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.dr_get_access_token().'&next_openid='.$this->input->get('next_openid'); - $data = @json_decode(@wx_get_https_json_data ($url), true); - if (!isset($data['count']) || $data['count'] == 0) { - // 拉取完毕 全部设置为0状态 - $this->db->update($this->weixin_model->prefix.'_follow', array( - 'status' => 0, - )); - $this->admin_msg('同步用户数据中,请勿关闭', dr_url('wuser/syc', array('action'=>'user')),1,0); - } - - // 查询并入库 - $res = $this->db->where_in('openid', $data ['data'] ['openid'])->get($this->weixin_model->prefix.'_follow')->result_array(); - - if (count($res) != $data ['count']) { - // 更新的数量不一致,可能有增加的用户openid - $openids = array(); - if ($res) { - foreach ($res as $t) { - $openids[] = $t['openid']; - } - } - $diff = array_diff ( $data ['data'] ['openid'], $openids ); - if (! empty ( $diff )) { - foreach ( $diff as $id ) { - $save =array(); - $save ['openid'] = $id; - $save ['uid'] = 0; - $save ['status'] = 0; - $this->db->insert($this->weixin_model->prefix.'_follow', $save); - } - } - } - $this->admin_msg ( '同步用户OpenID中,请勿关闭', dr_url('wuser/syc', array('next_openid' => $data ['next_openid'])), 1, 0); - } elseif ($action == 'user') { - // 开始更新会员资料 - $list = $this->db->where('status', 0)->limit(50)->get($this->weixin_model->prefix.'_follow')->result_array(); - if (empty ( $list )) { - $this->admin_msg('同步用户完成', dr_url('wuser/index'),1,0); - exit (); - } - $param = $openids = $uids = array(); - foreach ( $list as $vo ) { - $param ['user_list'] [] = array ( - 'openid' => $vo ['openid'], - 'lang' => 'zh-CN' - ); - $openids[] = $vo ['openid']; - $uids [$vo ['openid']] = $vo ['uid']; - } - $url = 'https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=' . dr_get_access_token (); - $data = dr_post_data ( $url, $param ); - if (isset($data['errcode']) && $data['errcode'] != 0) { - $this->admin_msg(dr_error_msg($data)); - } - $update = array(); - foreach ($data['user_info_list'] as $u ) { - if ($u['subscribe'] == 0) { - continue; - } - $uid = intval($uids[$u['openid']]); - if ($uid == 0) { - // 新增加的用户 - $rs = $this->weixin_model->add_user($u); - } else { - // 更新的用户 - $rs = $this->weixin_model->edit_user($uid, array( - 'groupid' => (int)$u['groupid'], - 'openid' => $u['openid'], - 'nickname' => $u['nickname'], - 'sex' => $u['sex'], - 'city' => $u['city'], - 'country' => $u['country'], - 'province' => $u['province'], - 'language' => $u['language'], - 'headimgurl' => $u['headimgurl'], - 'subscribe_time' => $u['subscribe_time'], - )); - } - // 更新关注表状态 - $this->db->where('openid', $u['openid'])->update($this->weixin_model->prefix.'_follow', array( - 'status' => 1, - 'uid' => $rs, - )); - $update[] = $u['openid']; - } - // 判断没获取到的 - foreach ($list as $t) { - if (!in_array($t['openid'], $update)) { - $this->db->where('openid', $t['openid'])->update($this->weixin_model->prefix.'_follow', array( - 'status' => 1, - 'uid' => 0, - )); - } - } - $this->admin_msg ( '同步用中,请勿关闭', dr_url('wuser/syc', array('action' =>'user')), 1, 0); - } - - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/member/Account.php b/finecms/finecms/dayrui/controllers/member/Account.php deleted file mode 100644 index 3d9005f..0000000 --- a/finecms/finecms/dayrui/controllers/member/Account.php +++ /dev/null @@ -1,252 +0,0 @@ -input->get('id')); - if ($this->get_cache('member', 'setting', 'regoauth')) { - $this->msg(fc_lang('您的账号不支持解除绑定')); - } elseif (!$this->member['username'] && !$this->member['password']) { - $this->msg(fc_lang('操作成功,正在刷新...')); - } - - $this->db->where('uid', $this->uid)->where('oauth', $id)->delete('member_oauth'); - - // 解绑积分处理 - !$this->db - ->where('uid', $this->uid) - ->where('type', 0) - ->where('mark', 'jie_'.$id) - ->count_all_results('member_scorelog') && $this->member_model->update_score(0, $this->uid, (int)$this->member_rule['jie_experience'], 'jie_'.$id, 'OAuth账号解绑'); - - // 解绑虚拟币处理 - !$this->db - ->where('uid', $this->uid) - ->where('type', 1) - ->where('mark', 'jie_'.id) - ->count_all_results('member_scorelog') && $this->member_model->update_score(1, $this->uid, (int)$this->member_rule['jie_score'], 'jie_'.$id, 'OAuth账号解绑'); - - $this->msg(fc_lang('操作成功,正在刷新...'), dr_member_url('account/oauth'), 1, 3); - } - - /** - * OAuth绑定 - */ - public function bang() { - - $appid = dr_safe_replace($this->input->get('id')); - $oauth = require WEBPATH.'config/oauth.php'; - $config = $oauth[$appid]; - !$config && $this->msg(fc_lang('OAuth错误: 缺少OAuth参数')); - - $config['url'] = SITE_URL.'index.php?s=member&c=account&m=bang&id='.$appid; // 回调地址设置 - $this->load->library('OAuth2'); - - // OAuth - $code = $this->input->get('code', TRUE); - $oauth = $this->oauth2->provider($appid, $config); - - if (!$code) { // 登录授权页 - try { - $oauth->authorize(); - } catch (OAuth2_Exception $e) { - $this->msg(fc_lang('OAuth授权错误').' - '.$e); - } - } else { // 回调返回数据 - try { - $user = $oauth->get_user_info($oauth->access($code)); - if (is_array($user) && $user['oid']) { - if ($uid = $this->member_model->OAuth_bang($appid, $user)) { - $this->msg(fc_lang('抱歉!该授权已经被绑定过了,看看Ta是谁?', dr_space_url($uid))); - } else { - // 绑定积分处理 - !$this->db - ->where('uid', $this->uid) - ->where('type', 0) - ->where('mark', 'bang_'.$appid) - ->count_all_results('member_scorelog') && $this->member_model->update_score(0, $this->uid, (int)$this->member_rule['bang_experience'], 'bang_'.$appid, 'OAuth账号绑定'); - - // 绑定虚拟币处理 - !$this->db - ->where('uid', $this->uid) - ->where('type', 1) - ->where('mark', 'bang_'.$appid) - ->count_all_results('member_scorelog') && $this->member_model->update_score(1, $this->uid, (int)$this->member_rule['bang_score'], 'bang_'.$appid, 'OAuth账号绑定'); - $this->msg(fc_lang('绑定成功'), dr_member_url('account/oauth'), 1, 3); - } - } else { - $this->msg(fc_lang('OAuth回调错误: 获取用户信息失败')); - } - } catch (OAuth2_Exception $e) { - $this->msg(fc_lang('OAuth回调错误: 获取用户信息失败').' - '.$e); - } - } - } - - - /** - * OAuth - */ - public function oauth() { - $this->template->assign(array( - 'list' => $this->member['oauth'], - )); - $this->template->display('account_oauth.html'); - } - - /** - * 修改密码 - */ - public function password() { - - $error = 0; - - if (IS_POST) { - - $password = dr_safe_replace($this->input->post('password')); - $password1 = dr_safe_replace($this->input->post('password1')); - $password2 = dr_safe_replace($this->input->post('password2')); - - if (!$password1 || $password1 != $password2) { - $error = fc_lang('两次密码输入不一致'); - } elseif ($password == $password2) { - $error = fc_lang('不能与原密码相同'); - } elseif (md5(md5($password).$this->member['salt'].md5($password)) != $this->member['password']) { - $error = fc_lang('当前密码不正确'); - } else { - if (defined('UCSSO_API')) { - $rt = ucsso_edit_password($this->uid, $password1); - // 修改失败 - if (!$rt['code']) { - $this->admin_msg(fc_lang($rt['msg'])); - } - } elseif ($this->get_cache('MEMBER', 'setting', 'ucenter')) { - $ucresult = uc_user_edit($this->member['username'], $password, $password1, $this->member['email']); - $ucresult == -1 && $error = fc_lang('旧密码不正确'); - } - } - - if ($error === 0) { - $this->db->where('uid', $this->uid)->update('member', array( - 'password' => md5(md5($password1).$this->member['salt'].md5($password1)) - )); - $this->member_msg(fc_lang('密码修改成功'), dr_member_url('account/password'), 1); - } - - } - - $this->template->assign(array( - 'result_error' => $error - )); - $this->template->display('password.html'); - } - - /** - * 密码校验 - */ - public function cpassword() { - $password = dr_safe_replace($this->input->post('password')); - echo md5(md5($password).$this->member['salt'].md5($password)) == $this->member['password'] ? '' : fc_lang('旧密码不正确'); - } - - /** - * 上传头像 - */ - public function avatar() { - $this->template->display('avatar.html'); - } - - /** - * 上传头像处理 - * 传入头像压缩包,解压到指定文件夹后删除非图片文件 - */ - public function upload() { - - // 创建图片存储文件夹 - $dir = dr_upload_temp_path().'member/'.$this->uid.'/'; - @dr_dir_delete($dir); - !is_dir($dir) && dr_mkdirs($dir); - - if ($_POST['tx']) { - $file = str_replace(' ', '+', $_POST['tx']); - if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)){ - $new_file = $dir.'0x0.'.$result[2]; - if (!in_array(strtolower($result[2]), array('jpg', 'jpeg', 'png', 'gif'))) { - exit(dr_json(0, '目录权限不足')); - } - if (!@file_put_contents($new_file, base64_decode(str_replace($result[1], '', $file)))) { - exit(dr_json(0, '目录权限不足')); - } else { - list($width, $height, $type, $attr) = getimagesize($new_file); - if (!$type) { - @unlink($new_file); - exit(function_exists('iconv') ? iconv('UTF-8', 'GBK', '图片字符串不规范') : 'error3'); - } - $this->load->library('image_lib'); - $config['create_thumb'] = TRUE; - $config['thumb_marker'] = ''; - $config['maintain_ratio'] = FALSE; - $config['source_image'] = $new_file; - foreach (array(30, 45, 90, 180) as $a) { - $config['width'] = $config['height'] = $a; - $config['new_image'] = $dir.$a.'x'.$a.'.'.$result[2]; - $this->image_lib->initialize($config); - if (!$this->image_lib->resize()) { - exit(dr_json(0, '上传错误:'.$this->image_lib->display_errors())); - break; - } - } - - // ok - $my = SYS_UPLOAD_PATH.'/member/'.$this->uid.'/'; - @dr_dir_delete($my); - !is_dir($my) && dr_mkdirs($my); - - $c = 0; - if ($fp = @opendir($dir)) { - while (FALSE !== ($file = readdir($fp))) { - $ext = substr(strrchr($file, '.'), 1); - if (in_array(strtolower($ext), array('jpg', 'jpeg', 'png', 'gif'))) { - if (copy($dir.$file, $my.$file)) { - $c++; - } - } - } - closedir($fp); - } - if (!$c) { - exit(dr_json(0, fc_lang('未找到目录中的图片'))); - } - } - } else { - exit(dr_json(0, '图片字符串不规范')); - } - } else { - exit(dr_json(0, '图片不存在')); - } - -// 上传图片到服务器 - if (defined('UCSSO_API')) { - $rt = ucsso_avatar($this->uid, file_get_contents($dir.'90x90.jpg')); - !$rt['code'] && $this->_json(0, fc_lang('通信失败:%s', $rt['msg'])); - } - - - exit('1'); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/member/Api.php b/finecms/finecms/dayrui/controllers/member/Api.php deleted file mode 100644 index 8d5c419..0000000 --- a/finecms/finecms/dayrui/controllers/member/Api.php +++ /dev/null @@ -1,858 +0,0 @@ -template->admin(); - - // 登陆判断 - !$this->uid && $this->admin_msg(fc_lang('会话超时,请重新登录')); - - // 参数判断 - $dirname = dr_safe_replace($this->input->get('module')); - !$dirname && $this->admin_msg(fc_lang('模型module参数不存在')); - - // 站点选择 - $site = (int)$_GET['site']; - $site = $site ? $site : SITE_ID; - - // 模型缓存判断 - $module = $this->get_cache('module', $dirname); - !$module && $this->admin_msg(fc_lang('此模型(%s)缓存不存在', $dirname)); - - $db = $this->db; - $field = $module['field']; - $category = $this->get_cache('category-'.$site); - - $field['id'] = array( - 'name' => 'Id', - 'ismain' => 1, - 'fieldtype' => 'Text', - 'fieldname' => 'id', - ); - - if ($this->member['adminid']) { - $field['author'] = array( - 'name' => fc_lang('录入作者'), - 'ismain' => 1, - 'fieldtype' => 'Text', - 'fieldname' => 'author', - ); - } else { - $db->where('uid', $this->uid); - } - - if (IS_POST) { - $data = $this->input->post('data'); - $catid = (int)$this->input->post('catid'); - $catid && $db->where_in('catid', $category[$catid]['catids']); - if (isset($data['keyword']) && $data['keyword'] - && $data['field'] && isset($field[$data['field']])) { - $data['keyword'] = dr_safe_replace(urldecode($data['keyword'])); - if ($data['field'] == 'id') { - // id搜索 - $id = array(); - $ids = explode(',', $data['keyword']); - foreach ($ids as $i) { - $id[] = (int)$i; - } - $db->where_in('id', $id); - } elseif ($field[$data['field']]['fieldtype'] == 'Linkage' - && $field[$data['field']]['setting']['option']['linkage']) { - // 联动菜单搜索 - if (is_numeric($data['keyword'])) { - // 联动菜单id查询 - $link = dr_linkage($field[$data['field']]['setting']['option']['linkage'], (int)$data['keyword'], 0, 'childids'); - $link && $db->where($data['field'].' IN ('.$link.')'); - } else { - // 联动菜单名称查询 - $id = (int)$this->get_cache('linkid-'.SITE_ID, $field[$data['field']]['setting']['option']['linkage']); - $id && $db->where($data['field'].' IN (select id from `'.$db->dbprefix('linkage_data_'.$id).'` where `name` like "%'.$data['keyword'].'%")'); - } - } else { - // 其他模糊搜索 - $db->like($data['field'], urldecode($data['keyword'])); - } - } - } - - // 搜索结果显示条数 - $limit = (int)$_GET['limit']; - $limit = $limit ? $limit : 50; - - sort($field); - $list = $db->limit($limit) ->order_by('updatetime DESC')->select('id,title,updatetime,url')->get($site.'_'.$dirname)->result_array(); - - // 栏目选择 - $tree = array(); - $select = ''; - - $this->template->assign(array( - 'list' => $list, - 'param' => $data, - 'field' => $field, - 'select' => $select, - )); - $this->template->display('related.html', 'admin'); - } - - - /** - * 站点间的同步登录 - */ - public function synlogin() { - $this->api_synlogin(); - } - - /** - * 站点间的同步退出 - */ - public function synlogout() { - $this->api_synlogout(); - } - - /** - * 自定义信息JS调用 - */ - public function template() { - $this->api_template(); - } - - - /** - * 联动栏目分类调用 - */ - public function category() { - - $pid = (int)$this->input->get('parent_id'); - $json = array(); - $category = $this->get_cache('category-'.SITE_ID); - - foreach ($category as $k => $v) { - if ($v['pid'] == $pid) { - if (!$v['child'] && !$v['permission'][$this->markrule]['add']) { - continue; - } - $json[] = array( - 'region_id' => $v['id'], - 'region_name' => $v['name'], - 'region_child' => $v['child'] - ); - } - } - - echo json_encode($json); - } - - /** - * 联动菜单调用 - */ - public function linkage() { - - $pid = (int)$this->input->get('parent_id'); - $json = array(); - $code = $this->input->get('code', true); - $linkage = $this->get_cache('linkage-'.SITE_ID.'-'.$code); - - foreach ($linkage as $v) { - $v['pid'] == $pid && $json[] = array('region_id' => $v['ii'], 'region_name' => $v['name']); - } - - echo json_encode($json); - } - - /** - * Ajax调用字段属性表单 - * - * @return void - */ - public function field() { - - $id = (int)$this->input->post('id'); - $type = dr_safe_replace($this->input->post('type', true)); - - $this->load->model('field_model'); - $this->relatedid = $this->input->post('relatedid'); - $this->relatedname = $this->input->post('relatedname'); - - $data = $this->field_model->get($id); - $fields = $this->field_model->get_data(); - $related = $this->input->post('relatedname'); - if ($data) { - $value = dr_string2array($data['setting']); - $value = $value['option']; - } else { - $value = array(); - } - - $this->load->library('Dfield', array($this->input->post('module'))); - - define('TEXT_UNIQUE', $related == 'module' ? 1 : 0); - $return = $this->dfield->option($type, $value, $fields); - - if ($return !== 0) { - echo $return; - } - } - - /** - * 百度地图调用 - * - * @return void - */ - public function baidumap() { - - $list = $this->input->get('city', true) ? explode(',', urldecode($this->input->get('city', true))) : NULL; - $city = isset($list[0]) ? $list[0] : ''; - $value = $this->input->get('value', true); - $value = strlen($value) > 10 ? $value : ''; - - $this->template->assign(array( - 'city' => $city, - 'value' => $value, - 'list' => $list, - 'name' => $this->input->get('name', tru), - 'level' => (int)$this->input->get('level'), - 'width' => $this->input->get('width', tru), - 'height' => $this->input->get('height', tru) - 30, - )); - $this->template->display('baidumap.html', 'admin'); - - } - - /** - * 文件上传 - * - * @return void - */ - public function upload() { - - $site = (int)$this->input->get('siteid'); - $site = $site ? $site : SITE_ID; - $code = str_replace(' ', '+', $this->input->get('code')); - list($size, $ext, $path) = explode('|', dr_authcode($code, 'DECODE')); - - $uid = $this->uid; - // 附件上传时采用后台登陆会员 - $this->session->userdata('member_auth_uid') && $uid = $this->member_model->member_uid(1); - - $this->load->model('attachment_model'); - - $this->template->assign(array( - 'ext' => str_replace(',', '|', $ext), - 'code' => $code, - 'page' => 0, - 'size' => (int)$size * 1024, - 'name' => $this->input->get('name'), - 'types' => '*.'.str_replace(',', ';*.', $ext), - 'siteid' => $site, - 'fileid' => $this->input->get('filename'), - 'fcount' => (int)$this->input->get('count'), - 'session' => dr_authcode($uid, 'ENCODE'), - 'is_admin' => 0, - )); - $this->template->display('upload.html', 'admin'); - } - - /** - * fex文件上传 - * - * @return void - */ - public function fex_upload() { - - $site = (int)$this->input->get('siteid'); - $site = $site ? $site : SITE_ID; - $code = str_replace(' ', '+', $this->input->get('code')); - list($size, $ext, $path) = explode('|', dr_authcode($code, 'DECODE')); - - $uid = $this->uid; - // 附件上传时采用后台登陆会员 - $this->session->userdata('member_auth_uid') && $uid = $this->member_model->member_uid(1); - - $this->load->model('attachment_model'); - - $this->template->assign(array( - 'ext' => str_replace('|', ',', $ext), - 'code' => $code, - 'name' => $this->input->get('name'), - 'types' => '*.'.str_replace(',', ';*.', $ext), - 'size' => (int)$size * 1024, - 'name' => $this->input->get('name'), - 'siteid' => $site, - 'fileid' => $this->input->get('filename'), - 'fcount' => (int)$this->input->get('count'), - 'post_url' => '/index.php?s=member&c=api&m=fex_ajax_upload&code='.$code, - )); - $this->template->display('upload_fex.html', 'admin'); - } - - - // ajax 图片上传 - public function ajax_upload() { - - // 游客不允许上传 - !$this->member && exit(json_encode(array('code'=>0, 'msg'=>fc_lang('抱歉!游客不允许上传附件'), 'url'=> '', 'id'=>''))); - - - $ext = 'jpg,jpeg,gif,png'; - $site = (int)$this->input->get('siteid'); - $site = $site ? $site : SITE_ID; - $code = str_replace(' ', '+', $this->input->get('code')); - list($size, $path) = explode('|', dr_authcode($code, 'DECODE')); - - $path = SYS_UPLOAD_PATH.'/'.date('Ym', SYS_TIME).'/'; - !is_dir($path) && dr_mkdirs($path); - - $this->load->library('upload', array( - 'max_size' => (int)$size * 1024, - 'overwrite' => FALSE, - 'file_name' => substr(md5(time()), rand(0, 20), 10), - 'upload_path' => $path, - 'allowed_types' => str_replace(',', '|', $ext), - 'file_ext_tolower' => TRUE, - )); - - if ($this->upload->do_upload(isset($_GET['fname']) ? $_GET['fname'] : 'Filedata')) { - $info = $this->upload->data(); - $this->load->model('attachment_model'); - $this->attachment_model->siteid = $site; - $result = $this->attachment_model->upload($this->uid, $info); - !is_array($result) && exit('0,'.$result); - list($id, $file, $_ext) = $result; - echo json_encode(array('code'=>1, 'msg'=>'', 'name' => dr_strcut($info['filename'], 15).'.'.$_ext, 'id'=>$id, 'url' => dr_get_file($id)));exit; - } else { - echo json_encode(array('code'=>0, 'msg'=>$this->upload->display_errors('', ''), 'url'=> '', 'id'=>''));exit; - } - - } - - // 文件下载并上传 - public function down_file() { - - $p = array(); - $url = explode('&', $this->input->post('url')); - - foreach ($url as $t) { - $item = explode('=', $t); - $p[$item[0]] = $item[1]; - } - - !$this->uid && exit(dr_json(0, fc_lang('游客不允许上传附件'))); - - list($size, $ext) = explode('|', dr_authcode($p['code'], 'DECODE')); - $path = SYS_UPLOAD_PATH.'/'.date('Ym', SYS_TIME).'/'; - !is_dir($path) && dr_mkdirs($path); - - $furl = $this->input->post('file'); - $file = dr_catcher_data($furl); - !$file && exit(dr_json(0, '获取远程文件失败')); - - $fileext = strtolower(trim(substr(strrchr($furl, '.'), 1, 10))); //扩展名 - $exts = (array)explode(',', $ext); - !in_array($fileext, $exts) && exit(dr_json(0, '远程文件扩展名('.$fileext.')不允许')); - $fileext == 'php' && exit(dr_json(0, '远程文件扩展名('.$fileext.')不允许')); - - $filename = substr(md5(time()), 0, 7).rand(100, 999); - if (@file_put_contents($path.$filename.'.'.$fileext, $file)) { - $info = array( - 'file_ext' => '.'.$fileext, - 'full_path' => $path.$filename.'.'.$fileext, - 'file_size' => filesize($path.$filename.'.'.$fileext)/1024, - 'client_name' => '', - ); - $this->load->model('attachment_model'); - $this->attachment_model->siteid = $p['siteid'] ? $p['siteid'] : SITE_ID; - $result = $this->attachment_model->upload($this->uid, $info); - if (is_array($result)) { - list($id) = $result; - echo json_encode(array('status'=>1, 'id'=>$id, 'name' => dr_strcut($filename, 10).'.'.$fileext));exit; - } else { - @unlink($info['full_path']); - exit(dr_json(0, $result)); - } - } else { - exit(dr_json(0, '文件移动失败,目录无权限('.$path.')')); - } - } - - /** - * 文件上传处理 - * - * @return void - */ - public function swfupload() { - - $uid = (int)dr_authcode(str_replace(' ', '+', $this->input->post('session')), 'DECODE'); - !$uid && exit('0,'.fc_lang('游客不允许上传附件')); - - if (IS_POST) { - $code = str_replace(' ', '+', $this->input->post('code')); - list($size, $ext) = explode('|', dr_authcode($code, 'DECODE')); - $path = SYS_UPLOAD_PATH.'/'.date('Ym', SYS_TIME).'/'; - !is_dir($path) && dr_mkdirs($path); - $this->load->library('upload', array( - 'max_size' => (int)$size * 1024, - 'overwrite' => FALSE, - 'file_name' => substr(md5(time()), rand(0, 20), 10), - 'upload_path' => $path, - 'allowed_types' => str_replace(',', '|', $ext), - 'file_ext_tolower' => TRUE, - )); - if ($this->upload->do_upload('Filedata')) { - $info = $this->upload->data(); - $site = (int)$this->input->post('siteid'); - $this->load->model('attachment_model'); - $this->attachment_model->siteid = $site ? $site : SITE_ID; - $result = $this->attachment_model->upload($uid, $info); - !is_array($result) && exit('0,'.$result); - list($id, $file, $_ext) = $result; - $icon = is_file(WEBPATH.'statics/admin/images/ext/'.$_ext.'.gif') ? THEME_PATH.'admin/images/ext/'.$_ext.'.gif' : THEME_PATH.'admin/images/ext/blank.gif'; - //唯一ID,文件全路径,图标,文件名称,文件大小,扩展名 - exit($id.','.dr_file($file).','.$icon.','.str_replace(array('|', '.'.$_ext), '', $info['client_name']).','.dr_format_file_size($info['file_size'] * 1024).','.$_ext); - } else { - exit('0,'.$this->upload->display_errors('', '')); - } - } - } - - /** - * 新ajax文件上传处理 - * - * @return void - */ - public function new_ajax_upload() { - - // 游客不允许上传,未获取到会员信息时提示游客无法上传 - !$this->member && exit(json_encode(array('code'=>0, 'msg'=>fc_lang('抱歉!游客不允许上传附件')))); - - $code = str_replace(' ', '+', $this->input->get('code')); - list($size, $ext, $path) = explode('|', dr_authcode($code, 'DECODE')); - - $path = SYS_UPLOAD_PATH.'/'.date('Ym', SYS_TIME).'/'; - !is_dir($path) && dr_mkdirs($path); - - $this->load->library('upload', array( - 'max_size' => (int)$size * 1024, - 'overwrite' => FALSE, - 'file_name' => substr(md5(time()), rand(0, 20), 10), - 'upload_path' => $path, - 'allowed_types' => str_replace(',', '|', $ext), - 'file_ext_tolower' => TRUE, - )); - - if ($this->upload->do_upload('file')) { - $info = $this->upload->data(); - $site = (int)$this->input->get('siteid'); - $site = $site ? $site : SITE_ID; - $this->load->model('attachment_model'); - $this->attachment_model->siteid = $site; - $result = $this->attachment_model->upload($this->uid, $info); - !is_array($result) && exit('0,'.$result); - list($id, $file, $_ext) = $result; - $icon = is_file(WEBPATH.'statics/admin/images/ext/'.$_ext.'.gif') ? THEME_PATH.'admin/images/ext/'.$_ext.'.gif' : THEME_PATH.'admin/images/ext/blank.gif'; - echo json_encode(array('code'=>1, 'icon'=>$icon, 'id'=>$id, 'size'=>dr_format_file_size($info['file_size'] * 1024), 'name'=>str_replace(array('|', '.'.$_ext), '', $info['client_name'])));exit; - } else { - echo json_encode(array('code'=>0, 'msg'=> $this->upload->client_name.' : '.$this->upload->display_errors('', '')));exit; - } - } - - /** - * 删除附件 - */ - public function swfdelete() { - - if (!$this->uid) { - return NULL; - } - - $id = (int)$this->input->post('id'); - $site = (int)$this->input->get('siteid'); - $this->load->model('attachment_model'); - $this->attachment_model->siteid = $site ? $site : SITE_ID; - - // 删除未使用 - $data = $this->db->where('id', $id)->where('uid', $this->uid)->get('attachment')->row_array(); - if ($data) { - // 删除附件 - $this->db->delete('attachment', 'id='.$id); - $this->attachment_model->_delete_attachment($data); - } - } - - /** - * 网站附件浏览 - */ - public function myattach() { - - !$this->member['adminid'] && exit(fc_lang('只有管理组才能附件浏览')); - - $this->load->helper('directory'); - $this->input->get('dir').PHP_EOL; - $dir = trim(trim(str_replace('.', '', $this->input->get('dir')), '/'), DIRECTORY_SEPARATOR); - $root = SYS_ATTACHMENT_DIR ? (WEBPATH.trim(SYS_ATTACHMENT_DIR, '/').'/') : WEBPATH; - $root = SYS_ATTACHMENT_DIR == '/' ? WEBPATH : $root; - $path = $dir ? $root.$dir.'/' : $root; - $list = array(); - $data = directory_map($path, 1); - $fext = $this->input->get('ext'); - $exts = explode('|', $fext); - $fcount = max(1, (int)$this->input->get('fcount')); - $furl = '/index.php?s=member&c=api&m=myattach&ext='.$fext.'&fcount='.$fcount; - - if ($data) { - foreach ($data as $t) { - if (is_dir($path.'/'.$t)) { - $name = trim($t, DIRECTORY_SEPARATOR); - $list[] = array( - 'type' => 'dir', - 'name' => $name, - 'icon' => THEME_PATH.'admin/images/ext/dir.gif', - 'file' => $furl.'&dir='.str_replace($root, '', $path.$name), - ); - } else { - $ext = trim(strrchr($t, '.'), '.'); - if ($ext != 'php' && in_array($ext, $exts)) { - $list[] = array( - 'type' => 'file', - 'name' => $t, - 'size' => dr_format_file_size(@filesize($path.$t)), - 'file' => SITE_URL.str_replace(WEBPATH, '', $path).$t, - 'icon' => is_file(WEBPATH.'statics/admin/images/ext/'.$ext.'.gif') ? THEME_PATH.'admin/images/ext/'.$ext.'.gif' : THEME_PATH.'admin/images/ext/blank.gif', - ); - } - } - } - } - - $this->template->assign(array( - 'list' => $list, - 'path' => str_replace(WEBPATH, '/', $path), - 'purl' => $furl.'&dir='.dirname(str_replace($root, '/', $path)), - 'parent' => $dir, - 'fcount' => $fcount, - )); - $this->template->display('myattach.html', 'admin'); - } - - // 输入上传信息 - public function upload_input() { - $this->template->assign(array( - 'file' => dr_safe_replace($_GET['file']), - 'title' => dr_safe_replace($_GET['title']), - )); - $this->template->display('upload_input.html', 'admin'); - } - - - - /** - * 汉字转换拼音 - */ - public function pinyin() { - - $name = $this->input->get('name', TRUE); - !$name && exit(''); - - $this->load->library('pinyin'); - $py = $this->pinyin->result($name); - if (strlen($py) > 12) { - exit($this->pinyin->result($name, 0)); - } - exit($py); - } - - /** - * 标题检查 - */ - public function checktitle() { - - $id = (int)$this->input->get('id'); - $title = $this->input->get('title', TRUE); - $module = $this->input->get('module'); - - (!$title || !$module) && exit(''); - - $num = $this->db->where('id<>', $id)->where('title', $title)->count_all_results(SITE_ID.'_'.$module); - $num ? exit(fc_lang(''.fc_lang('重复').'')) : exit(''); - } - - /** - * 提取关键字 - */ - public function getkeywords() { - - $kw = $this->input->get('kw', TRUE); - $kw = dr_safe_replace($kw ? $kw : $this->input->get('title')); - // 返回数据 - - - $rt = ''; - - //tag数据 - $tags = $this->dcache->get('tags-'.SITE_ID); - if ($tags) { - foreach ($tags as $t) { - // 找到了 - if (strpos($kw, $t['name']) !== false) { - $rt.= ','.$t['tags']; - } - } - } - - if ($rt) { - exit(trim($rt, ',')) ; - } - - $return = array(); - //tag数据 - $tags = $this->dcache->get('tag-'.SITE_ID); - if ($tags) { - foreach ($tags as $t) { - strpos($kw, $t) !== false && $return[] = $t; - } - } - - if (!$return) { - exit; - } - - echo @implode(',', $return);exit; - } - - /** - * 文件信息 - */ - public function fileinfo() { - - $this->load->helper('system'); - $key = dr_safe_replace($this->input->get('name')); - $info = dr_file_info($key); - $file = $info['attachment'] ? dr_get_file($info['attachment']) : $key; - if (in_array($info['fileext'], array('jpg', 'jpeg', 'gif', 'png'))) { - echo '

    '; - echo '

    '.fc_lang('查看原图').'

    '; - } else { - echo '

    '.($info['filename'] ? $info['filename'] : $file).'

    '; - } - } - - /** - * 下载文件 - */ - public function file() { - - $id = (int)$this->input->get('id'); - $info = get_attachment($id); - $this->template->admin(); - - !$info && $this->admin_msg(fc_lang('附件不存在或者已经被删除')); - - - $file = $info['attachment']; - $this->db->where('id', $id)->set('download', 'download+1', FALSE)->update('attachment'); - - if (strpos($file, ':/')) { - //远程文件 - header("Location: $file"); - } else { - //本地文件 - $file = SYS_UPLOAD_PATH.'/'.str_replace('..', '', $file); - $file = str_replace('member/uploadfile/member/uploadfile', 'member/uploadfile', $file); - $name = urlencode(($info['filename'] ? $info['filename'] : $info['filemd5']).'.'.$info['fileext']); - $this->load->helper('download'); - force_download($name, file_get_contents($file)); - } - } - - - /** - * OAuth2授权登录 - */ - public function oauth() { - - $this->uid && $this->member_msg(fc_lang('请退出后再登录'), $_SERVER['HTTP_REFERER']); - - $appid = $this->input->get('id'); - $oauth = require WEBPATH.'config/oauth.php'; - $config = $oauth[$appid]; - !$config && $this->member_msg(fc_lang('OAuth错误: 缺少OAuth参数')); - - $code = $this->input->get('code', TRUE); - $MEMBER = $this->get_cache('member'); - - if (IS_POST) { - $user = dr_string2array(dr_authcode($this->input->post('code'), 'DECODE')); - !$user && $this->member_msg(fc_lang('数据已过期,请重新登录')); - // - $data = $this->input->post('data'); - $type = $this->input->post('type'); - $error1 = $error2 = ''; - - if ($type == 1) { - // 登录 - $rt = $this->member_model->login($data['username'], $data['password'], 36000); - if (strlen($rt) > 3) { - // 登录成功 - !$this->uid && $this->member_msg(fc_lang('绑定失败,请重新登录')); - // 绑定到此账号 - $user['uid'] = $this->uid; - $this->db->insert('member_oauth', $user); - $this->hooks->call_hook('member_login', $data); // 登录成功挂钩点 - $this->member_msg(dr_weixin_emoji($user['nickname']).','.fc_lang('登录成功').$rt, dr_member_url('home/index'), 1, 1); - } elseif ($rt == -1) { - $error1 = fc_lang('会员不存在'); - } elseif ($rt == -2) { - $error1 = fc_lang('密码不正确'); - } elseif ($rt == -3) { - $error1 = fc_lang('Ucenter注册失败'); - } elseif ($rt == -4) { - $error1 = fc_lang('Ucenter:会员名称不合法'); - } - } else { - // 注册 - $id = $this->member_model->register($data); - if ($id > 0) { - // 注册成功 - $data['uid'] = $this->uid; - $this->hooks->call_hook('member_register_after', $data); // 注册之后挂钩点 - // 注册后的登录 - $rt = $this->member_model->login($id, $data['password'], 86400, 0, 1); - strlen($rt) > 3 && $this->hooks->call_hook('member_login', $data); // 登录成功挂钩点 - // 绑定到此账号 - $user['uid'] = $id; - $this->db->insert('member_oauth', $user); - $this->member_msg(dr_weixin_emoji($user['nickname']).','.fc_lang('登录成功').$rt, dr_member_url('home/index'), 1, 1); - } elseif ($id == -1) { - $error = array('name' => 'username', 'msg' => fc_lang('该会员【%s】已经被注册', $data['username'])); - } elseif ($id == -2) { - $error = array('name' => 'email', 'msg' => fc_lang('邮箱格式不正确')); - } elseif ($id == -3) { - $error = array('name' => 'email', 'msg' => fc_lang('该邮箱【%s】已经被注册', $data['email'])); - } elseif ($id == -4) { - $error = array('name' => 'username', 'msg' => fc_lang('同一IP在限制时间内注册过多')); - } elseif ($id == -5) { - $error = array('name' => 'username', 'msg' => fc_lang('Ucenter:会员名称不合法')); - } elseif ($id == -6) { - $error = array('name' => 'username', 'msg' => fc_lang('Ucenter:包含不允许注册的词语')); - } elseif ($id == -7) { - $error = array('name' => 'username', 'msg' => fc_lang('Ucenter:Email格式有误')); - } elseif ($id == -8) { - $error = array('name' => 'username', 'msg' => fc_lang('Ucenter:Email不允许注册')); - } elseif ($id == -9) { - $error = array('name' => 'username', 'msg' => fc_lang('Ucenter:Email已经被注册')); - } elseif ($id == -10) { - $error = array('name' => 'phone', 'msg' => fc_lang('手机号码必须是11位的整数')); - } elseif ($id == -11) { - $error = array('name' => 'phone', 'msg' => fc_lang('该手机号码已经注册')); - } - $error2 = $error['msg']; - } - - $this->template->assign(array( - 'type' => $type, - 'code' => dr_authcode(dr_array2string($user), 'ENCODE'), - 'oauth' => $user, - 'error_1' => $error1, - 'error_2' => $error2, - 'regfield' => $MEMBER['setting']['regfield'], - )); - $this->template->display('oauth.html'); - exit; - } - - $config['url'] = SITE_URL.'index.php?s=member&c=api&m=oauth&id='.$appid; // 回调地址设置 - $this->load->library('OAuth2'); - - // OAuth - $oauth = $this->oauth2->provider($appid, $config); - - if (!$code) { - // 登录授权页 - try { - $oauth->authorize(); - } catch (OAuth2_Exception $e) { - $this->member_msg(fc_lang('OAuth授权错误').' _ '.$e); - } - } else { - // 回调返回数据 - try { - $user = $oauth->get_user_info($oauth->access($code)); - if (is_array($user) && $user['oid']) { - !$user['nickname'] && $user['nickname'] = substr($user['oid'], 0, 10); - $code = $this->member_model->OAuth_login($appid, $user); - if ($code == 'bang') { - // 绑定账号 - $this->template->assign(array( - 'type' => 1, - 'code' => dr_authcode(dr_array2string($user), 'ENCODE'), - 'oauth' => $user, - 'regfield' => $MEMBER['setting']['regfield'], - )); - $this->template->display('oauth.html'); - } else { - // 直接注册 - $this->member_msg(dr_weixin_emoji($user['nickname']).','.fc_lang('登录成功').$code, dr_member_url('home/index'), 1, 3); - } - } else { - $this->member_msg(fc_lang('OAuth回调错误: 获取用户信息失败')); - } - } catch (OAuth2_Exception $e) { - $this->member_msg(fc_lang('OAuth回调错误: 获取用户信息失败').' - '.$e); - } - } - } - - /** - * 更新模型浏览数 - */ - public function hits() { - - $id = (int)$this->input->get('id'); - $mid = (int)$this->input->get('mid'); - $mod = $this->get_cache('space-model', $mid); - if (!$mod) { - $data = $this->callback_json(array('html' => 0)); - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$data.')';exit; - } - - $table = $this->db->dbprefix('space_'.$mod['table']); - $name = $table.'-space-hits-'.$id; - $hits = (int)$this->get_cache_data($name); - if (!$hits) { - $data = $this->db->where('id', $id)->select('hits')->get($table)->row_array(); - $hits = (int)$data['hits']; - } - - $hits++; - $this->set_cache_data($name, $hits, SYS_CACHE_SPACE); - $this->db->where('id', $id)->update($table, array('hits' => $hits)); - - $data = $this->callback_json(array('html' => $hits)); - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$data.')';exit; - } - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/member/Home.php b/finecms/finecms/dayrui/controllers/member/Home.php deleted file mode 100644 index 6d15499..0000000 --- a/finecms/finecms/dayrui/controllers/member/Home.php +++ /dev/null @@ -1,97 +0,0 @@ -get_cache('member'); - $error = NULL; - $field = array( - 'name' => array( - 'name' => fc_lang('姓名'), - 'ismain' => 0, - 'ismember' => 1, - 'fieldname' => 'name', - 'fieldtype' => 'Text', - 'setting' => array( - 'option' => array( - 'width' => 200, - ), - 'validate' => array( - 'xss' => 1, - 'required' => 0, - ) - ) - ), - 'phone' => array( - 'name' => fc_lang('手机号码'), - 'ismain' => 0, - 'ismember' => 1, - 'fieldname' => 'phone', - 'fieldtype' => 'Text', - 'setting' => array( - 'option' => array( - 'width' => 200, - ), - 'validate' => array( - 'xss' => 1, - 'required' => 0, - ) - ) - ), - ); - - - - - // 可用字段 - if ($MEMBER['field']) { - foreach ($MEMBER['field'] as $t) { - $field[] = $t; - } - } - - if (IS_POST) { - - $data = $this->validate_filter($field, $this->member); - - if (isset($data['error'])) { - $error = $data; - (IS_AJAX || IS_API_AUTH) && exit(dr_json(0, $error['msg'], $error['error'])); - $data = $this->input->post('data', TRUE); - } else { - $this->member_model->edit($data[0], $data[1]); - $this->attachment_handle($this->uid, $this->db->dbprefix('member') . '-' . $this->uid, $field, $this->member); - - $this->member_msg(fc_lang('操作成功,正在刷新...'), dr_member_url('home/index'), 1); - } - - } else { - $data = $this->member; - } - - $this->template->assign(array( - 'data' => $data, - 'field' => $field, - 'myfield' => $this->field_input($field, $data, FALSE, 'uid'), - 'result_error' => $error - )); - $this->template->display('index.html'); - - } - - - - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/member/Login.php b/finecms/finecms/dayrui/controllers/member/Login.php deleted file mode 100644 index 981c4ca..0000000 --- a/finecms/finecms/dayrui/controllers/member/Login.php +++ /dev/null @@ -1,205 +0,0 @@ -get_cache('member'); - - if (IS_POST) { - $data = $this->input->post('data', TRUE); - $back_url = dr_member_url('home/index'); - if ($MEMBER['setting']['logincode'] && !$this->check_captcha('code')) { - $error = fc_lang('验证码不正确'); - } elseif (!$data['password'] || !$data['username']) { - $error = fc_lang('输入不完整'); - } else { - $code = $this->member_model->login($data['username'], $data['password'], $data['auto'] ? 864000000 : $MEMBER['setting']['loginexpire']); - if (strlen($code) > 3) { - // 登录成功 - $data['uid'] = $this->uid; - $success = $code; - } elseif ($code == -1) { - $error = fc_lang('会员不存在'); - } elseif ($code == -2) { - $error = fc_lang('密码不正确'); - } elseif ($code == -3) { - $error = fc_lang('注册失败'); - } elseif ($code == -4) { - $error = fc_lang('会员名称不合法'); - } elseif ($code == -5) { - $error = fc_lang('uid同步失败'); - } elseif ($code == -404) { - $error = fc_lang('服务端网络连接失败'); - } else { - $error = fc_lang('登录失败'.$code); - } - } - if (IS_AJAX) { - $error && exit(dr_json(0, $error)); - $success && exit(json_encode(array( - 'status' => 1, - 'backurl' => $back_url, - 'isdebug' => $_GET['debug'], - 'syncurl' => dr_member_sync_url($success)))); - } - $success && $this->member_msg(fc_lang('登录成功').$success, $back_url, 1, $_GET['debug'] ? 99999 : 3); - exit('error'); - } else { - $back_url = $this->input->get('back') ? $this->input->get('back') : (isset($_SERVER['HTTP_REFERER']) ? (strpos($_SERVER['HTTP_REFERER'], 'login') !== false ? '' : $_SERVER['HTTP_REFERER']) : ''); - } - - $this->template->assign(array( - 'data' => $data, - 'code' => $MEMBER['setting']['logincode'], - 'back_url' => $back_url, - 'meta_title' => fc_lang('会员登录'), - 'result_error' => $error, - )); - $this->template->display('login.html'); - } - - /** - * 找回密码 - */ - public function find() { - - $step = max(1, (int)$this->input->get('step')); - $error = ''; - - if (IS_POST) { - switch ($step) { - case 1: - !$this->check_captcha('code') && $this->member_msg(fc_lang('验证码不正确')); - if ($uid = get_cookie('find')) { - $this->member_msg( - fc_lang('验证码发送成功,请注意查收'), - dr_member_url('login/find', array('step' => 2, 'uid' => $uid)), - 1 - ); - } else { - $name = $this->input->post('name', TRUE); - $name = in_array($name, array('email', 'phone')) ? $name : 'email'; - $value = $this->input->post('value', TRUE); - $data = $this->db - ->select('uid,username,randcode') - ->where($name, $value) - ->limit(1) - ->get('member') - ->row_array(); - if ($data) { - $randcode = dr_randcode(); - if ($name == 'email') { - $this->load->helper('email'); - $code = @file_get_contents(WEBPATH.'cache/email/find_password.html'); - !$this->sendmail($value, fc_lang('找回密码通知'), fc_lang($code, $data['username'], $randcode, $this->input->ip_address())) && $this->member_msg(fc_lang('邮件发送失败,请联系管理员检查邮件日志')); - set_cookie('find', $data['uid'], 300); - $this->db->where('uid', $data['uid'])->update('member', array('randcode' => $randcode)); - $this->member_msg(fc_lang('验证码发送成功,请注意查收'), dr_member_url('login/find', array('step' => 2, 'uid' => $data['uid'])), 1); - } else { - $result = $this->member_model->sendsms($value, fc_lang('尊敬的用户,您的本次验证码是:%s', $randcode)); - if ($result['status']) { - // 发送成功 - set_cookie('find', $data['uid'], 300); - $this->db->where('uid', (int)$data['uid'])->update('member', array('randcode' => $randcode)); - $this->member_msg(fc_lang('验证码发送成功,请注意查收'), dr_member_url('login/find', array('step' => 2, 'uid' => $data['uid'])), 1); - } else { - // 发送失败 - $this->member_msg($result['msg']); - } - } - } else { - $error = $name == 'phone' ? fc_lang('该手机号码尚未注册') : fc_lang('该邮箱尚未注册'); - } - } - break; - - case 2: - - !$this->check_captcha('code2') && $this->member_msg(fc_lang('验证码不正确')); - - $uid = (int)$this->input->get('uid'); - $code = (int)$this->input->post('code'); - - (!$uid || !$code) && $this->member_msg(fc_lang('输入不完整')); - - $data = $this->db - ->where('uid', $uid) - ->where('randcode', $code) - ->select('salt,uid,username,email') - ->limit(1) - ->get('member') - ->row_array(); - if (!$data) { - $this->db->where('uid', $uid)->update('member', array('randcode' => '')); - $this->member_msg(fc_lang('验证码不正确,请重新发送验证码'), dr_member_url('login/find')); - } - - $password1 = $this->input->post('password'); - $password2 = $this->input->post('password2'); - if ($password1 != $password2) { - $error = fc_lang('两次密码输入不一致'); - } elseif (!$password1) { - $error = fc_lang('密码不能为空'); - } else { - if (defined('UCSSO_API')) { - $rt = ucsso_edit_password($data['uid'], $password1); - // 修改失败 - if (!$rt['code']) { - $this->admin_msg(fc_lang($rt['msg'])); - } - } - // 修改密码 - $this->db->where('uid', $data['uid'])->update('member', array( - 'randcode' => 0, - 'password' => md5(md5($password1).$data['salt'].md5($password1)) - )); - $this->get_cache('MEMBER', 'setting', 'ucenter') && uc_user_edit($data['username'], '', $password1, '', 1); - $this->hooks->call_hook('member_edit_password', array('member' => $data, 'password' => $password1)); - $this->member_msg(fc_lang('密码修改成功'), dr_member_url('login/index'), 1); - } - break; - } - } - - $this->template->assign(array( - 'step' => $step, - 'error' => $error, - 'action' => 'find', - 'mobile' => $this->get_cache('member', 'setting','ismobile'), - 'meta_title' => fc_lang('找回密码通知'), - 'result_error' => $error, - )); - $this->template->display('find.html'); - } - - - /** - * 退出 - */ - public function out() { - if (IS_AJAX) { - exit(json_encode(array( - 'backurl' => SITE_URL, - 'syncurl' => dr_member_sync_url($this->member_model->logout())))); - } else { - $this->template->assign('member', ''); - $this->member_msg(fc_lang('您已经成功退出了').$this->member_model->logout(), SITE_URL, 1, 3); - } - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/controllers/member/Register.php b/finecms/finecms/dayrui/controllers/member/Register.php deleted file mode 100644 index f4611a8..0000000 --- a/finecms/finecms/dayrui/controllers/member/Register.php +++ /dev/null @@ -1,99 +0,0 @@ -get_cache('MEMBER'); - - - - // 判断是否开启注册 - if (!$MEMBER['setting']['register']) { - $this->member_msg(fc_lang('站点已经关闭了会员注册')); - } - - if (IS_POST) { - $data = $this->input->post('data', TRUE); - $back_url = dr_member_url('home/index'); - if ($MEMBER['setting']['regcode'] && !$this->check_captcha('code')) { - $error = array('name' => 'code', 'msg' => fc_lang('验证码不正确')); - } elseif ($result = $this->is_username($data['username'])) { - $error = array('name' => 'username', 'msg' => $result); - } elseif (!$data['password']) { - $error = array('name' => 'password', 'msg' => fc_lang('密码不能为空')); - } elseif ($data['password'] !== $data['password2']) { - $error = array('name' => 'password2', 'msg' => fc_lang('两次密码输入不一致')); - } elseif ($result = $this->is_email($data['email'])) { - $error = array('name' => 'email', 'msg' => $result); - } else { - $id = $this->member_model->register($data, 0); - if ($id > 0) { - // 注册成功 - $data['uid'] = $id; - $this->hooks->call_hook('member_register_after', $data); // 注册之后挂钩点 - // 注册后的登录 - $code = $this->member_model->login($id, $data['password'], $data['auto'] ? 8640000 : $MEMBER['setting']['loginexpire'], 0, 1); - - } elseif ($id == -1) { - $error = array('name' => 'username', 'msg' => fc_lang('该会员【%s】已经被注册', $data['username'])); - } elseif ($id == -2) { - $error = array('name' => 'email', 'msg' => fc_lang('邮箱格式不正确')); - } elseif ($id == -3) { - $error = array('name' => 'email', 'msg' => fc_lang('该邮箱【%s】已经被注册', $data['email'])); - } elseif ($id == -4) { - $error = array('name' => 'username', 'msg' => fc_lang('同一IP在限制时间内注册过多')); - } elseif ($id == -5) { - $error = array('name' => 'username', 'msg' => fc_lang('UCSSO:会员名称不合法')); - } elseif ($id == -6) { - $error = array('name' => 'username', 'msg' => fc_lang('UCSSO:包含不允许注册的词语')); - } elseif ($id == -7) { - $error = array('name' => 'username', 'msg' => fc_lang('UCSSO:Email格式有误')); - } elseif ($id == -8) { - $error = array('name' => 'username', 'msg' => fc_lang('UCSSO:Email不允许注册')); - } elseif ($id == -9) { - $error = array('name' => 'username', 'msg' => fc_lang('UCSSO:Email已经被注册')); - } elseif ($id == -10) { - $error = array('name' => 'phone', 'msg' => fc_lang('手机号码必须是11位的整数')); - } elseif ($id == -11) { - $error = array('name' => 'phone', 'msg' => fc_lang('该手机号码已经注册')); - } else { - $error = array('name' => 'username', 'msg' => fc_lang('注册失败')); - } - } - if (IS_AJAX) { - $error && exit(dr_json(0, $error['msg'])); - $id > 0 && exit(json_encode(array( - 'status' => 1, - 'backurl' => $back_url, - 'syncurl' => dr_member_sync_url($code)))); - } - $code && $this->member_msg(fc_lang('注册成功').$code, $back_url, 1, 3); - exit; - } else { - $data = array(); - } - - $this->template->assign(array( - 'data' => $data, - 'code' => $MEMBER['setting']['regcode'], - 'back_url' => $back_url, - 'meta_title' => fc_lang('会员注册'), - )); - $this->template->display('register.html'); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/core/M_Controller.php b/finecms/finecms/dayrui/core/M_Controller.php deleted file mode 100644 index ae79ea8..0000000 --- a/finecms/finecms/dayrui/core/M_Controller.php +++ /dev/null @@ -1,2351 +0,0 @@ -replace_lang = 1; - $this->load->database(); - $this->load->library('user_agent'); - - define('IS_AJAX', $this->input->is_ajax_request()); - define('IS_POST', $_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST) ? TRUE : FALSE); - define('SYS_TIME', $_SERVER['REQUEST_TIME'] ? $_SERVER['REQUEST_TIME'] : time()); - define('SITE_PATH', '/'); - define('THEME_PATH', '/statics/'); - - // 全局化站点变量 - $config1 = require WEBPATH.'config/system.php'; // 加载网站系统配置文件 - !$config1['SYS_THUMB_DIR'] && $config1['SYS_THUMB_DIR'] = 'uploadfile/thumb'; - - // https模式 - if (isset($config1['SYS_HTTPS'])) { - define('SYS_HTTPS', intval($config1['SYS_HTTPS'])); - } else { - define('SYS_HTTPS', 0); - } - - $this->load->library('session'); - $domain = require WEBPATH.'config/domain.php'; // 加载站点域名配置文件 - $sitecfg = directory_map(WEBPATH.'config/site/'); // 加载全部站点的配置文件 - foreach ($sitecfg as $file) { - $id = (int)basename($file); - if (is_file(WEBPATH.'config/site/'.$file)) { - $this->site_info[$id] = require WEBPATH.'config/site/'.$file; - $this->site_info[$id]['SITE_ID'] = (int) $id; - $this->site_info[$id]['SITE_PC'] = $this->site_info[$id]['SITE_URL'] = dr_http_prefix(($this->site_info[$id]['SITE_DOMAIN'] ? $this->site_info[$id]['SITE_DOMAIN'] : DOMAIN_NAME).SITE_PATH); - $this->site_info[$id]['SITE_MURL'] = dr_http_prefix(($this->site_info[$id]['SITE_MOBILE'] ? $this->site_info[$id]['SITE_MOBILE'] : DOMAIN_NAME).SITE_PATH); - $this->site[$id] = $this->db; // 站点数据库对象 - } - } - unset($sitecfg); - - // 分析站点信息 - $siteid = (IS_ADMIN || $this->router->method == 'html') && $this->session->userdata('siteid') ? (int)$this->session->userdata('siteid') : 0; - if ($siteid && isset($this->site_info[$siteid])) { - // && isset($domain[DOMAIN_NAME]) - // 通过session来获取siteid - define('SITE_ID', $siteid); - } elseif (isset($domain[DOMAIN_NAME]) && isset($this->site_info[$domain[DOMAIN_NAME]])) { - // 通过域名来获取siteid - $siteid = (int)$domain[DOMAIN_NAME]; - $orthers = @explode(',', $this->site_info[$siteid]['SITE_DOMAINS']); - $this->site_info[$siteid]['SITE_M_URL'] = $this->site_info[$siteid]['SITE_PC'] = $this->site_info[$siteid]['SITE_URL']; // PC端为主域名 - $uri = isset($_SERVER['HTTP_X_REWRITE_URL']) && trim($_SERVER['REQUEST_URI'], '/') == SELF ? trim($_SERVER['HTTP_X_REWRITE_URL'], '/') : ($_SERVER['REQUEST_URI'] ? trim($_SERVER['REQUEST_URI'], '/') : ''); - if ($orthers && DOMAIN_NAME != $this->site_info[$siteid]['SITE_DOMAIN'] && in_array(DOMAIN_NAME, $orthers)) { - // 判断当前域名为“其他域名” - // 301 转向开启 - defined('SITE_URL_301') && SITE_URL_301 && redirect(dr_http_prefix($this->site_info[$siteid]['SITE_DOMAIN'].'/'.$uri), '', '301'); - $this->site_info[$siteid]['SITE_PC'] = $this->site_info[$siteid]['SITE_URL'] = dr_http_prefix(DOMAIN_NAME.'/'); - - } elseif (isset($this->site_info[$siteid]['SITE_MOBILE']) && $this->site_info[$siteid]['SITE_MOBILE']) { - // 当前网站存在移动端域名时 - if (DOMAIN_NAME == $this->site_info[$siteid]['SITE_MOBILE']) { - // 当此域名是移动端域名时重新赋值给主站URL - $this->site_info[$siteid]['SITE_URL'] = dr_http_prefix(DOMAIN_NAME.'/'); - $this->site_info[$siteid]['SITE_MOBILE'] = TRUE; - } elseif ($this->_is_mobile() - && $this->site_info[$siteid]['SITE_MOBILE_OPEN'] - && $this->site_info[$siteid]['SITE_MOBILE'] - && DOMAIN_NAME == $this->site_info[$siteid]['SITE_DOMAIN'] - && !IS_ADMIN) { - // 当网站开启强制定向时,并且存在移动端域名、URL是主站的域名、非后台 - redirect(dr_http_prefix($this->site_info[$siteid]['SITE_MOBILE'].'/'.$uri), '', '301'); - exit; - } - } elseif ($this->agent->is_mobile() && $this->site_info[$siteid]['SITE_MOBILE_OPEN']) { - // 识别移动端 - $this->site_info[$siteid]['SITE_MOBILE'] = TRUE; - } - define('SITE_ID', $siteid); - } else { - // 识别移动端 - if ($this->agent->is_mobile() && $this->site_info[1]['SITE_MOBILE_OPEN']) { - $this->site_info[1]['SITE_PC'] = $this->site_info[1]['SITE_URL']; - $this->site_info[1]['SITE_MOBILE'] = TRUE; - } - // 默认站点id - define('SITE_ID', 1); - } - - $config3 = array(); - $this->site_info[SITE_ID] && $config3 = array_merge($config1, $this->site_info[SITE_ID]); - - define('ADMIN_URL', dr_http_prefix(DOMAIN_NAME.'/')); - - // 默认文件上传目录 - $config3['SYS_UPLOAD_DIR'] = 'uploadfile'; - $config3['SYS_UPLOAD_PATH'] = WEBPATH.$config3['SYS_UPLOAD_DIR']; - $config3['SYS_ATTACHMENT_URL'] = $config3['SITE_URL'].$config3['SYS_UPLOAD_DIR']; - $config3['SYS_ATTACHMENT_URL'] = trim($config3['SYS_ATTACHMENT_URL'], '/').'/'; - $config3['UEDITOR_IMG_ID'] = md5($config3['SYS_ATTACHMENT_URL']); // 编辑器附件ID - - - // 将配置文件数组转换为常量 - foreach ($config3 as $var => $value) { - if ($var == 'SITE_MOBILE' && $value === TRUE && IS_ADMIN) { - $value = ''; - } elseif (($var == 'SITE_THEME' && $value =='SITE_THEME') - || ($var == 'SITE_TEMPLATE' && $value =='SITE_TEMPLATE')) { - $value = 'default'; - } elseif (strpos($value, 'SYS_CACHE') === 0) { - $value = (int)$value; - } - !defined($var) && define($var, $value); // 定义站点常量 - } - unset($config3, $config2, $config1); - - - // 定义模板目录 - define('TPLPATH', WEBPATH.'templates/'); - - // 定义pc端域名 - !defined('SITE_PC') && define('SITE_PC', SITE_URL); - - // 判断手机端与PC端模板 - $this->mobile = SITE_MOBILE === TRUE ? 1 : 0; - - // 是否移动端 - define('IS_MOBILE', $this->mobile); - - // 显示错误提示 - SYS_DEBUG && error_reporting(E_ALL ^ E_NOTICE); - - $this->config->set_item('language', SITE_LANGUAGE); // 网站语言 - date_default_timezone_set('Etc/GMT'.(SITE_TIMEZONE > 0 ? '-' : '+').abs(SITE_TIMEZONE)); // 设置时区 - - $this->load->model('system_model'); - - $this->load->model('member_model'); // 加载会员模型 - - $this->load->model('saler_model'); - - $this->load->model('customer_model'); - - $MEMBER = $this->get_cache('member'); - - if ($MEMBER['setting']['ucsso'] && is_file(WEBPATH.'api/ucsso/config.php')) { - include WEBPATH.'api/ucsso/client.php'; - } - - // 获取当前的登录记录 - $this->uid or $this->uid = (int)$this->member_model->member_uid(); - $this->member = $this->member_model->get_member($this->uid); - - // 验证账号cookie的有效性 - if (!$this->member_model->check_member_login()) { - $this->uid = 0; - $this->member = array(); - } - - // 会员不存在时,uid设置为0 - !$this->member && $this->uid = 0; - - // 全部模型 - $this->module = $this->get_cache('module'); - - define('MEMBER_URL', SITE_URL.'index.php?s=member'); - define('MEMBER_PATH', '/'); - - // 网站风格地址 - !defined('HOME_THEME_PATH') && define('HOME_THEME_PATH', strpos(SITE_THEME, 'http') === 0 ? trim(SITE_THEME, '/').'/' : THEME_PATH.SITE_THEME.'/'); - - $this->load->library('template'); - $this->template->mobile = $this->mobile; - - // 当网站处于关闭状态时,非管理员无法访问 - defined('SITE_CLOSE') && SITE_CLOSE && !IS_ADMIN - && !$this->member['adminid'] - && $this->router->class != 'api' - && !($this->router->class == 'home' && $this->router->method == 'captcha') - && $this->msg(SITE_CLOSE_MSG); - unset($url, $theme, $template); - - if (defined('IS_MEMBER') && IS_MEMBER) { - // 会员部分 - $this->load->helper(array('system', 'url')); - $uri = trim(str_replace('member/', '/', str_replace('/member/', '/', $this->duri->uri(NULL, TRUE))), '/'); - - - $this->template->assign(array( - 'uid' => $this->uid, - 'regverify' => $MEMBER['setting']['regverify'], - )); - - // 登录判断 - if (!defined('DR_UEDITOR') - && !defined('DR_PAY_ID') - && !defined('DISCUZ_ROOT') - && !in_array($this->router->class, array('register', 'login', 'api', 'sns'))) { - $url = dr_member_url('login/index', array('backurl' => urlencode(dr_now_url()))); - // 没有登录时 - !$this->member && $this->member_msg(fc_lang('会话超时,请重新登录').$this->member_model->logout(), $url); - } - - if (defined('DR_UEDITOR') && is_dir(WEBPATH.'api/'.DR_UEDITOR)) { - require WEBPATH.'api/'.DR_UEDITOR.'/php/controller.php'; - exit; - } - - } elseif (IS_ADMIN) { - - $this->load->helper(array('system', 'url')); - $uri = $this->duri->uri(); - $this->admin = $this->is_admin_login(); - - // 权限判断 - !$this->is_auth($uri) - && (IS_AJAX ? exit(fc_lang('您无权限操作(%s)', $uri)) : $this->admin_msg(fc_lang('您无权限操作(%s)', $uri))); - - $this->template->assign('admin', $this->admin); - - // 后台性能分析 - SYS_DEBUG && !IS_AJAX && IS_PC && $this->router->class != 'api' && $this->output->enable_profiler(TRUE); - - } - - // 销毁变量 - unset($MOD, $MEMBER); - - $this->template->ci = $this; - $this->template->assign(array( - 'get' => $this->input->get(NULL, TRUE), - 'member' => $this->member, - 'site_info' => $this->site_info, - 'is_mobile' => $this->template->mobile, - )); - - - $this->hooks->call_hook('finecms-init'); // 挂钩点 - } - - - - protected function _is_mobile() { - - if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) { - // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 - return true; - } elseif (isset ($_SERVER['HTTP_USER_AGENT'])) { - // 判断手机发送的客户端标志,兼容性有待提高 - $clientkeywords = array( - 'nokia', - 'sony', - 'ericsson', - 'mot', - 'samsung', - 'htc', - 'sgh', - 'lg', - 'sharp', - 'sie-', - 'philips', - 'panasonic', - 'alcatel', - 'lenovo', - 'iphone', - 'ipod', - 'blackberry', - 'meizu', - 'android', - 'netfront', - 'symbian', - 'ucweb', - 'windowsce', - 'palm', - 'operamini', - 'operamobi', - 'openwave', - 'nexusone', - 'cldc', - 'midp', - 'wap', - 'mobile' - ); - // 从HTTP_USER_AGENT中查找手机浏览器的关键字 - if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))){ - return true; - } - } - // 协议法,因为有可能不准确,放到最后判断 - if (isset ($_SERVER['HTTP_ACCEPT'])) { - // 如果只支持wml并且不支持html那一定是移动设备 - // 如果支持wml和html但是wml在html之前则是移动设备 - if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) - { - return true; - } - } - return false; - } - - public function clear_cache($name) { - - if (!$name) { - return; - } - - $name = strtolower($name); - - // 模型缓存时,清除所有相关文件 - if ($name == 'module') { - $data = $this->get_cache('module'); - if ($data) { - foreach ($data as $site => $t) { - if ($t) { - foreach ($t as $m) { - $tname = 'module-'.$site.'-'.$m; - SYS_MEMCACHE && $this->cache->memcached->is_supported() && $this->cache->memcached->delete(SYS_KEY.$tname); - } - } - } - } - } - - // 删除文件缓存 - $this->cache->file->delete($name); - - return; - } - - - public function get_cache() { - - $param = func_get_args(); - if (!$param) { - return NULL; - } - - // 取第一个参数作为缓存变量名称 - $data = $model = NULL; - $name = strtolower(array_shift($param)); - /* - isset($param[0]) - && strpos($param[0], '_model') !== false - && is_file(FCPATH.'dayrui/models/'.ucfirst($param[0]).'.php') && $model = strtolower(array_shift($param)); - */ - - if (!$data) { - $var = 'cache-'.$name; - if (isset($this->$var) && $this->$var) { - // 读取全局变量 - $data = $this->$var; - } else { - // 读取本地文件缓存数据 - $data = $this->$var = $this->dcache->get($name); - } - } - - if (!$param) { - return $data; - } - - $var = ''; - foreach ($param as $v) { - $var.= '[\''.dr_safe_replace($v).'\']'; - } - - $return = NULL; - @eval('$return = $data'.$var.';'); - - return $return; - } - - - public function get_cache_data($name) { - - if (!$name) { - return NULL; - } elseif (defined('SYS_AUTO_CACHE') && !SYS_AUTO_CACHE) { - // 禁用缓存 - return NULL; - } - - - return defined('SYS_MEMCACHE') && SYS_MEMCACHE && $this->cache->memcached->is_supported() ? $this->cache->memcached->get(SYS_KEY.$name) : @$this->cache->file->get($name); - } - - - public function set_cache_data($name, $data, $ttl = 10) { - - if (defined('SYS_AUTO_CACHE') && !SYS_AUTO_CACHE) { - // 禁用缓存 - return $data; - } - - $ttl = (int)$ttl; - - if (!$name || !$ttl) { - return $data; - } - - defined('SYS_MEMCACHE') && SYS_MEMCACHE && $this->cache->memcached->is_supported() ? $this->cache->memcached->save(SYS_KEY.$name, $data, $ttl) : $this->cache->file->save($name, $data, $ttl); - - return $data; - } - - - - public function is_auth($uri) { - - return TRUE; - } - - // 获取表字段结构 - public function get_table_field($table) { - - $field = $this->get_cache_data('field-'.$table); - if (!$field) { - $this->load->model('system_model'); - $tableinfo = $this->system_model->cache(); // 表结构缓存 - $field = $tableinfo[$table]['field']; - $this->set_cache_data('field-'.$table, $field, 3600); - } - - return $field; - } - - // 获取自定义控制器 - public function get_sysc($id) { - return $this->db->where('id', $id)->limit(1)->get('controller')->row_array(); - } - - // 服务器ip地址 - protected function _get_server_ip() { - - if (isset($_SERVER['SERVER_ADDR']) - && $_SERVER['SERVER_ADDR'] - && $_SERVER['SERVER_ADDR'] != '127.0.0.1') { - return $_SERVER['SERVER_ADDR']; - } - - return gethostbyname($_SERVER['HTTP_HOST']); - } - - /** - * 后台操作界面中的顶部导航菜单 - * - * @param array $menu - * @return string - */ - protected function get_menu_v3($menu) { - - if (!$menu) { - return NULL; - } - - $_i = 1; - $_cur = ''; // 表示当前菜单 - $_uri = $this->duri->uri(1); // 当前uri - $_name = ''; // 表示当前菜单名称 - $_link = ''; - $_first = ''; // 第一个菜单的名称 - $_quick = array(); // 作为快捷菜单 - foreach ($menu as $name => $t) { - $uri = $t[0]; - $uri = trim($uri, '/'); // 格式菜单uri - if (!$name || !$uri) { - continue; - } - // 获取URL - if (substr($uri, (int)strpos($uri, '_js')) == '_js') { - $uri = substr($uri, 0, -3); - $url = dr_dialog_url($this->duri->uri2url($uri), 'add'); - } elseif (strpos($uri, 'javascript') === 0) { - $url = $uri; - } elseif (strpos($uri, SELF) !== FALSE) { - $url = $uri; - } else { - $url = $this->duri->uri2url($uri); - } - // 验证URI权限 - if (!$this->is_auth($uri)) { - continue; - } - // 判断选中的当前菜单 - if ($_i > 1 && $this->get_menu_calss($menu, $uri, $_uri)) { - $_cur = $name; - $class = ' class="blue"'; - } elseif ($_i == 1) { - $class = ' class="{MARK}"'; - } else { - $class = ''; - } - $_first = $_i == 1 ? $name : $_first; - // 快捷菜单 - $_quick[] = array( - 'url' => $url, - 'name' => $name, - 'icon' => '', - ); - // 生成链接 - $_link.= '
  • '.($t[1] ? ' ' : '').$name.'
  • '; - $_i ++; - } - - // 修改菜单时 - if (!$_cur && $this->router->method == 'edit') { - $_link.= '
  • '.fc_lang('修改').' '; - $_cur = fc_lang('修改'); - } - - if (!$_cur) { - $_link = str_replace('{MARK}', 'blue', $_link); - !$_name && $_name = $_first; - } else { - $_name = $_cur; - } - - return array( - 'name' => $_name, - 'link' => $_link, - 'quick' => $_quick, - ); - } - - /** - * 后台操作界面中的顶部导航菜单 - * - * @param array $menu - * @return string - */ - protected function get_menu($menu) { - - if (!$menu) { - return NULL; - } - - $_i = 0; - $_str = ''; - $_uri = $this->duri->uri(1); // 当前uri - $_mark = TRUE; - - foreach ($menu as $name => $t) { - if (is_array($t)) { - $uri = $t[0]; - $name = ' '.$name; - } else { - $uri = $t; - } - $uri = trim($uri, '/'); - if (!$name || !$uri) { - continue; - } - $class = ''; - if (strpos($uri, '_js') !== FALSE) { - $uri = substr($uri, 0, -3); - $url = dr_dialog_url($this->duri->uri2url($uri), 'add'); - } elseif (strpos($uri, 'javascript') === 0) { - $url = $uri; - } else { - $url = $this->duri->uri2url($uri); - $class = ' class="onloading '.(!$_i ? '{FIR}' : '').'"'; - } - if (!$this->is_auth($uri)) { - continue; - } - $mark = $_i == 0 ? '{MARK}' : ''; - // 判断选中 - if ($this->get_menu_calss($menu, $uri, $_uri)) { - $_mark = FALSE; - $class = ' class="onloading on"'; - } - $class = strpos($url, 'target') ? '' : $class; - $_str.= ''.$name.'|'; - $_i ++; - } - - if ($_mark && $this->router->method == 'edit') { - $_str.= ''.fc_lang('修改').'|'; - $_mark = FALSE; - } - - $_str = $_mark ? str_replace('{FIR}', 'on', $_str) : $_str; - - return $_mark ? str_replace('{MARK}', ' class="on"', $_str) : str_replace('{MARK}', '', $_str); - } - - private function get_menu_calss($menu, $uri, $_uri) { - - if ($uri == $_uri) { - return TRUE; - } - - if (!in_array($_uri, $menu)) { - if (@strpos($_uri, $uri) === FALSE) { - return FALSE; - } - $uri_arr = explode('/', $_uri); - $uri_arr = array_slice($uri_arr, 0, -2); - $__uri = implode('/', $uri_arr); - if (in_array($__uri, $menu) && $__uri == $uri) { - return TRUE; - } - if ($this->get_menu_calss($menu, $uri, $__uri)) { - return TRUE; - } - if (strpos($__uri, $uri) === 0) { - return TRUE; - } - } - - } - - /** - * 用于后台的分页 - */ - protected function get_pagination($url, $total) { - - $this->load->library('pagination'); - - $config['base_url'] = $url; - $config['per_page'] = SITE_ADMIN_PAGESIZE; - $config['next_link'] = fc_lang('下一页'); - $config['prev_link'] = fc_lang('上一页'); - $config['last_link'] = fc_lang('最后一页'); - $config['first_link'] = fc_lang('第一页'); - $config['total_rows'] = $total; - $config['cur_tag_open'] = ''; - $config['cur_tag_close'] = ''; - $config['use_page_numbers'] = TRUE; - $config['query_string_segment'] = 'page'; - - $this->pagination->initialize($config); - - - return $this->pagination->create_links(); - } - - /** - * 会员中心分页 - */ - public function get_member_pagination($url, $total) { - - $this->load->library('pagination'); - - $config = array(); - is_file(FCPATH.'module/member/config/pagination.php') ? include FCPATH.'module/member/config/pagination.php' : include WEBPATH.'config/pagination.php'; - - $page = $config['pagination']; - $page['base_url'] = $url; - $page['per_page'] = $this->pagesize; - $page['total_rows'] = $total; - $page['use_page_numbers'] = TRUE; - $page['query_string_segment'] = 'page'; - - $this->pagination->initialize($page); - - return $this->pagination->create_links(); - } - - /** - * 后台登录判断,返回当前登录用户信息 - * - * @return void - */ - protected function is_admin_login() { - - if (IS_ADMIN && ($this->router->class == 'login' || $this->router->method == 'login')) { - return FALSE; - } - - $uid = (int) $this->session->userdata('uid'); - $admin = (int) $this->session->userdata('admin'); - if ($this->uid == FALSE - || $uid != $this->uid - || $admin != $uid) { - if (IS_AJAX) { - exit(fc_lang('登录超时')); - } elseif (IS_ADMIN) { - redirect(ADMIN_URL.dr_url('login/index', array('backurl' => urlencode(dr_now_url()))), 'refresh'); - } - return FALSE; - } - - $data = $this->member_model->get_admin_member($this->uid, 1); - if (!is_array($data)) { - if (IS_ADMIN) { - if ($data == 0) { - IS_AJAX ? exit(dr_json(0, fc_lang('会员不存在'))) : $this->admin_msg(fc_lang('会员不存在')); - } elseif ($data == -3) { - IS_AJAX ? exit(dr_json(0, fc_lang('您无权限登录管理平台'))) : $this->admin_msg(fc_lang('您无权限登录管理平台')); - } elseif ($data == -4) { - IS_AJAX ? exit(dr_json(0, fc_lang('您无权限登录该站点'))) : $this->admin_msg(fc_lang('您无权限登录该站点')); - } - } else { - return $data; - } - } - - return $data; - } - - // 返回json格式 - public function callback_json($data) { - - // 自定义返回名称 - $return = $this->input->get('return', true); - if (isset($data['error']) && !isset($data['msg'])) { - $data['msg'] = $data['error']; - unset($data['error']); - } - - if ($return) { - $temp = $data; - $data = array(); - foreach ($temp as $i => $t) { - $data[$i.'_'.$return] = $t; - } - } - - return json_encode($data); - } - - /** - * 后台提示消息显示 - * - * @param string $msg 提示信息 - * @param string $url 转向地址 - * @param int $mark 标示符号1:成功;0:失败;2:等待 - * @param int $time 等待时间 - * @return void - */ - public function admin_msg($msg, $url = '', $mark = 0, $time = 1) { - - IS_AJAX && exit(dr_json(($mark ? 1 : 0), $msg, $url)); - $this->template->assign(array( - 'msg' => $msg, - 'url' => $this->security->xss_clean($url), - 'time' => $time, - 'mark' => $mark, - 'cache_url' => IS_ADMIN && IS_PC ? $this->_cache_url() : array(), - )); - $this->template->display('msg.html', 'admin'); - exit; - } - - /** - * 会员提示消息显示 - * - * @param string $msg 提示信息 - * @param string $url 转向地址 - * @param int $mark 标示符号1:成功;0:失败;2:等待 - * @param int $time 等待时间 - * @param bool $ajax 是否ajax提交显示 - * @return void - */ - public function member_msg($msg, $url = '', $mark = 0, $time = 1, $ajax = FALSE) { - - // 当指定为ajax提交或者系统提交状态为ajax则返回json数据 - if ($ajax || IS_AJAX) { - exit(dr_json(($mark ? 1 : 0), $msg, $url)); - } else { - $this->template->assign(array( - 'msg' => $msg, - 'url' => $this->security->xss_clean($url), - 'time' => $time, - 'mark' => $mark, - 'meta_name' => fc_lang('提示信息') - )); - IS_MEMBER ? $this->template->display('msg.html', 'member') : $this->template->display('msg.html'); - } - exit; - } - - /** - * 前端提示消息显示 - * - * @param string $msg 提示信息 - * @param string $url 转向地址 - * @param int $mark 标示符号1:成功;0:失败;2:等待 - * @param int $time 等待时间 - * @return void - */ - public function msg($msg, $url = '', $mark = 0, $time = 1) { - - IS_AJAX && exit(dr_json(($mark ? 1 : 0), $msg, $url)); - $this->template->assign(array( - 'msg' => $msg, - 'url' => $this->security->xss_clean($url), - 'time' => $time, - 'mark' => $mark - )); - $this->template->display('msg.html', '/'); - - exit; - } - - /** - * 迷你提示消息显示 - * - * @param string $msg 提示信息 - * @param string $url 转向地址 - * @param int $mark 标示符号1:成功;0:失败;2:等待 - * @param int $time 等待时间 - * @return void - */ - public function mini_msg($msg, $url = '', $mark = 0, $time = 1) { - $this->template->assign(array( - 'msg' => $msg, - 'url' => $this->security->xss_clean($url), - 'time' => $time, - 'mark' => $mark - )); - $this->template->display('mini_msg.html', 'admin'); - exit; - } - - /** - * 付款提示消息显示 - * - * @param string $msg 提示信息 - * @param string $url 转向地址 - * @param intval $mark 标示符号1:成功;0:失败;2:等待 - * @return void - */ - protected function pay_msg($msg, $url = '', $mark = 0) { - $this->template->assign(array( - 'url' => $this->security->xss_clean($url), - 'msg' => $msg, - 'mark' => $mark, - )); - $this->template->display('pay_msg.html'); - exit; - } - - /** - * 验证码验证 - * - * @param string $id 验证码表单的name - * @return bool - */ - protected function check_captcha($id) { - - if (isset($_POST['geetest_challenge']) - && isset($_POST['geetest_validate'])) { - require FCPATH.'dayrui/libraries/Geetestlib.php'; - $GtSdk = new GeetestLib(); - if ($this->session->userdata('gtserver') == 1) { - $result = $GtSdk->validate( - $_POST['geetest_challenge'], - $_POST['geetest_validate'], - $_POST['geetest_seccode'] - ); - if ($result == TRUE) { - return TURE; - } else if ($result == FALSE) { - return FALSE; - } else { - return FALSE; - } - }else{ - if ($GtSdk->get_answer($_POST['geetest_validate'])) { - return TURE; - }else{ - return FALSE; - } - } - } else { - $data = $this->input->post($id); - $data = $data ? $data : $this->input->get($id); - if (!$data) { - return FALSE; - } - $code = $this->session->userdata('captcha'); - if (strtolower($data) == $code) { - $this->session->unset_userdata('captcha'); - return TRUE; - } - } - - return FALSE; - } - - /** - * 验证码 - */ - public function captcha() { - $this->load->library('captcha'); - $this->captcha->width = $this->input->get('width') ? $this->input->get('width') : 80; - $this->captcha->height = $this->input->get('height') ? $this->input->get('height') : 30; - $this->session->unset_userdata('captcha'); - $this->session->set_userdata('captcha', $this->captcha->get_code()); - $this->captcha->doimage(); - } - - /** - * 获取系统运行信息 - * - * @return string - */ - public function get_system_run_info() { - return dr_lang( - '页面执行时间%s秒,共%s个查询语句,消耗内存%s', - $this->benchmark->elapsed_time('total_execution_time_start', 'total_execution_time_end'), - count($this->db->queries), - str_replace(' ', '', dr_format_file_size(memory_get_usage() / 4)) - ); - } - - /** - * 表单提交数据验证和过滤 - * - * @param array $_field 字段 - * @param array $_data 修改前的数据 - * @return array - */ - protected function validate_filter($_field, $_data = array()) { - - if (!$_field) { - return; - } - - $this->_data = $_data; - $this->syn_content = $this->post = $this->data = array(); - $this->load->library('Dfield'); - $this->load->library('Dfilter'); - $this->load->library('Dvalidate'); - - foreach ($_field as $field) { - // 前端字段筛选 - if (!IS_ADMIN && !$field['ismember']) { - continue; - } - // 验证字段对象的有效性 - $obj = $this->dfield->get($field['fieldtype']); - if (!$obj) { - continue; - } - $name = $field['fieldname']; - $validate = $field['setting']['validate']; - // 禁止修改字段筛选 - if (IS_MEMBER && $validate['isedit'] && isset($_data[$name]) && $_data[$name]) { - $this->post[$name] = $_data[$name]; - $obj->insert_value($field); // 获取入库值 - continue; - } - // 编辑器默认关闭xss - $validate['xss'] = !isset($validate['xss']) && $field['fieldtype'] == 'Ueditor' ? 1 : $validate['xss']; - // 从表单获取值 - $this->post[$name] = $value = $this->input->post("data[$name]", $validate['xss'] ? FALSE : TRUE); - // 验证必填字段 - if ($field['fieldtype'] != 'Group' - && isset($validate['required']) - && $validate['required']) { - // 验证值为空 - if ($value == '') { - return array('error' => $name, 'msg' => fc_lang('%s不能为空!', $field['name'])); - } - // 当类别为联动时判定0值 - if ($field['fieldtype'] == 'Linkage' && !$value) { - return array('error' => $name, 'msg' => fc_lang('%s不能为空!', $field['name'])); - } - // 正则验证 - if (isset($validate['pattern']) - && $validate['pattern'] - && !preg_match($validate['pattern'], $value)) { - return array('error' => $name, 'msg' => $field['name'].':'.($validate['errortips'] ? $validate['errortips'] : fc_lang('格式不正确'))); - } - } - // 函数/方法校验 - if (isset($validate['check']) && $validate['check']) { - if (strpos($validate['check'], '_') === 0) { - // 方法格式:_方法名称[:现存数据字段,参数2...] - list($method, $_param) = explode(':', str_replace('::', ':', $validate['check'])); - $method = substr($method, 1); - if (method_exists($this->dvalidate, $method)) { - $param['value'] = $value; - if ('check_member' == $method && $value == 'guest') { - // 游客不验证 - } else { - if ($_param && $_value = explode(',', $_param)) { - foreach ($_value as $t) { - $param[$t] = isset($_POST['data'][$t]) ? $this->input->post("data[$t]") : $t; - } - } - if (call_user_func_array(array($this->dvalidate, $method), $param)) { - return array('error' => $name, 'msg' => $field['name'].':'.fc_lang('格式校验不正确')); - } - } - } else { - log_message('error', "校验方法 $method 不存在!"); - } - } else { - // 函数格式:函数名称[:现存数据字段,参数2...] - list($func, $_param) = explode(':', str_replace('::', ':', $validate['check'])); - if (function_exists($func)) { - $param['value'] = $value; - if ($_param && $_value = explode(',', $_param)) { - foreach ($_value as $t) { - $param[$t] = isset($_POST['data'][$t]) ? $this->input->post("data[$t]") : $t; - } - } - if (call_user_func_array($func, $param)) { - return array('error' => $name, 'msg' => $field['name'].':'.fc_lang('格式校验不正确')); - } - } else { - log_message('error', "校验函数 $func 不存在!"); - } - } - } - // 过滤函数 - if (isset($validate['filter']) && $validate['filter']) { - if (strpos($validate['filter'], '_') === 0) { - // 方法格式:_方法名称[:现存数据字段,参数2...] - list($method, $_param) = explode(':', str_replace('::', ':', $validate['filter'])); - $method = substr($method, 1); - if (method_exists($this->dfilter, $method)) { - $param['value'] = $value; - if ($_param && $_value = explode(',', $_param)) { - foreach ($_value as $t) { - $param[$t] = isset($_POST['data'][$t]) ? $this->input->post("data[$t]") : $t; - } - } - // 开始过滤 - $this->post[$name] = call_user_func_array(array($this->dfilter, $method), $param); - } else { - log_message('error', "过滤方法 $method 不存在!"); - } - } else { - // 函数格式:函数名称[:现存数据字段,参数2...] - list($func, $_param) = explode(':', str_replace('::', ':', $validate['filter'])); - if (function_exists($func)) { - $param['value'] = $value; - if ($_param && $_value = explode(',', $_param)) { - foreach ($_value as $t) { - $param[$t] = isset($_POST['data'][$t]) ? $this->input->post("data[$t]") : $t; - } - } - // 开始过滤 - $this->post[$name] = call_user_func_array($func, $param); - } else { - log_message('error', "过滤函数 $func 不存在!"); - } - } - } - // 判断表字段值的唯一性 - if ($field['ismain'] - && isset($field['setting']['option']['unique']) - && $field['setting']['option']['unique']) { - if ($this->db->where('id<>', (int)$_data['id'])->where($name, $this->post[$name])->count_all_results(SITE_ID.'_'.$this->mid)) { - return array('error' => $name, 'msg' => fc_lang('%s已经存在', $field['name'])); - } - } - $obj->insert_value($field); // 获取入库值 - if ($field['fieldtype'] == 'Baidumap') { - $this->data[$field['ismain']][$name.'_lng'] = (double)$this->data[$field['ismain']][$name.'_lng']; - $this->data[$field['ismain']][$name.'_lat'] = (double)$this->data[$field['ismain']][$name.'_lat']; - } else { - if (strpos($field['setting']['option']['fieldtype'], 'INT') !== FALSE) { - $this->data[$field['ismain']][$name] = (int)$this->data[$field['ismain']][$name]; - } elseif ($field['setting']['option']['fieldtype'] == 'DECIMAL' - || $field['setting']['option']['fieldtype'] == 'FLOAT') { - $this->data[$field['ismain']][$name] = (double)$this->data[$field['ismain']][$name]; - } - } - } - //echo '
    '; print_r($this->data);exit;
    -        unset($this->post, $this->_data);
    -        return $this->data;
    -    }
    -
    -    /**
    -     * 表单提交数据后执行的方法
    -     *
    -     * @param	intval	$id		主键id
    -     * @param	array	$_field	字段
    -     * @param	array	$_data	修改后的数据
    -     * @return  array
    -     */
    -    protected function validate_table($id, $_field, $_data = array()) {
    -
    -        if (!$_field) {
    -            return;
    -        }
    -
    -        $this->data = $_data;
    -        $this->load->library('Dfield', array(APP_DIR));
    -        foreach ($_field as $field) {
    -            // 验证字段对象的有效性
    -            $obj = $this->dfield->get($field['fieldtype']);
    -            if (!$obj) {
    -                continue;
    -            }
    -            // 执行脚本
    -            $obj->insert_last_value($id, $_data[$field['ismain']][$field['fieldname']], $field);
    -        }
    -    }
    -
    -    /**
    -     * 附件处理
    -     *
    -     * @param	intval	$uid		会员uid
    -     * @param	array	$field		表字段
    -     * @param	string	$related	使用源的标识(表名-ID1-ID2...)
    -     * @param	array	$_data		原数据
    -     * @param	bool	$update		是否更新原附件
    -     * @return	NULL
    -     */
    -    public function attachment_handle($uid, $related, $field, $_data = NULL, $update = TRUE) {
    -
    -        if (!$field) {
    -            return NULL;
    -        }
    -
    -        // 当前POST的数据
    -        $attach = array();
    -        $attach_id = array();
    -        $this->load->model('attachment_model');
    -        $this->load->library('Dfield', array(APP_DIR));
    -
    -        // 查询使用的附件
    -        foreach ($field as $f) {
    -            // 加载字段处理对象
    -            $obj = $this->dfield->get($f['fieldtype']);
    -            if (!$obj) {
    -                continue;
    -            }
    -            $files = $obj->get_attach_id($this->data[$f['ismain']][$f['fieldname']]);
    -            $files && $attach_id = $attach_id ? array_merge($attach_id, $files) : $files;
    -        }
    -
    -        // 筛选删除的附件
    -        foreach ($field as $f) {
    -            // 加载字段处理对象
    -            $obj = $this->dfield->get($f['fieldtype']);
    -            if (!$obj) {
    -                continue;
    -            }
    -            // 通过附件处理方法获得增加和删除的附件
    -            list($add_id, $del_id) = $obj->attach($this->data[$f['ismain']][$f['fieldname']], $_data[$f['fieldname']]);
    -            // 百度编辑器时暂时不同步删除附件,可能会出现误删除情况
    -            $f['fieldtype'] == 'Ueditor' && $del_id = array();
    -            // 删除附件
    -            if ($del_id) {
    -                foreach ($del_id as $id) {
    -                    if ($id && $update && !in_array($id, $attach_id)) {
    -                        $fj = get_attachment($id);
    -                        $log = dr_now_url().'  --->>>  删除附件('.$id.'#'.$related.'#'.$f['fieldname'].'):'.$fj['attachment'];
    -                        $this->system_log($log, 1); // 强制写入后台日志
    -                        $this->attachment_model->delete_for_handle($uid, $related, $id);
    -                    }
    -                }
    -            }
    -            // 无新增附件时跳过
    -            if (!$add_id) {
    -                continue;
    -            }
    -            $attach = $attach ? array_merge($attach, $add_id) : $add_id;
    -        }
    -
    -        $attach = $attach ? array_merge($attach, $attach_id) : $attach_id;
    -        if (count($attach) == 0) {
    -            return NULL;
    -        }
    -
    -        // 更新至已用附件表
    -        $this->attachment_model->replace_attach($uid, $related, array_unique($attach));
    -
    -        unset($this->data);
    -
    -        return NULL;
    -    }
    -
    -
    -    /**
    -     * 附件归属替换
    -     *
    -     * @param	intval	$uid		会员uid
    -     * @param	intval	$id			使用源id
    -     * @param	string	$related	使用源表名称
    -     * @return	NULL
    -     */
    -    protected function attachment_replace($uid, $id, $related) {
    -
    -        if (!$uid || !$id || !$related) {
    -            return NULL;
    -        }
    -
    -        $data = $this->db->where('related', $related.'_verify-'.$id)->select('id,tableid')->get('attachment')->result_array();
    -        if (!$data) {
    -            return NULL;
    -        }
    -
    -        foreach ($data as $t) {
    -            $this->db->where('id', $t['id'])->update('attachment', array('related' => $related.'-'.$id));
    -            $this->db->where('id', $t['id'])->update('attachment_'.(int)$t['tableid'], array('related' => $related.'-'.$id));
    -        }
    -
    -        return NULL;
    -    }
    -
    -    /**
    -     * 判断站点表是否重复
    -     *
    -     * @param	string	$tablename
    -     * @return	bool
    -     */
    -    public function site_table_exitis($tablename) {
    -
    -        $num = $this->db->where('dirname', $tablename)->count_all_results('module');
    -        if ($num) {
    -            return TRUE;
    -        }
    -
    -        // 库中筛选
    -        $table = $this->system_model->cache();
    -        if (isset($table[$this->db->dbprefix($tablename)])) {
    -            return TRUE;
    -        }
    -
    -        return FALSE;
    -    }
    -
    -    /**
    -     * 字段输出表单(新版本格式)
    -     *
    -     * @param	array	$field	字段数组
    -     * @param	array	$data	表单值
    -     * @param	bool	$cat	是否显示栏目附加字段
    -     * @param	string	$id		id字符串
    -     * @param	string	$html   html布局格式
    -     * @param	bool	$is_diy	是否仅输出自定义输出字段
    -     * @return	string
    -     */
    -    public function new_field_input($field, $data = NULL, $cat = FALSE, $id = 'id', $html = '', $is_diy = 0) {
    -
    -        if (!$field) {
    -            return '';
    -        }
    -
    -        $id = $id ? $id : 'id';
    -        $mymerge = $merge = $group = $diyfield = array();
    -        $myfield = $mygroup = $mark = '';
    -
    -
    -        // 分组字段筛选
    -        foreach ($field as $t) {
    -            if ($t['fieldtype'] == 'Group'
    -                && preg_match_all('/\{(.+)\}/U', $t['setting']['option']['value'], $value)) {
    -                foreach ($value[1] as $v) {
    -                    $group[$v] = $t['fieldname'];
    -                }
    -            }
    -        }
    -
    -        // 字段合并分组筛选
    -        foreach ($field as $t) {
    -            if ($t['fieldtype'] == 'Merge'
    -                && preg_match_all('/\{(.+)\}/U', $t['setting']['option']['value'], $value)) {
    -                foreach ($value[1] as $v) {
    -                    $merge[$v] = $t['fieldname'];
    -                }
    -            }
    -        }
    -
    -        // 字段类
    -        $this->load->library('dfield', array(APP_DIR));
    -        $pchtml = $this->get_cache('member', 'setting', 'field');
    -        $mbhtml = $this->get_cache('member', 'setting', 'mbfield');
    -        if (!IS_ADMIN) {
    -            if ($this->mobile && $mbhtml) {
    -                // 移动端格式
    -                A_Field::set_input_format($mbhtml);
    -                unset($mbhtml);
    -            } elseif ($pchtml) {
    -                // Pc端格式
    -                A_Field::set_input_format($pchtml);
    -                unset($pchtml);
    -            }
    -        }
    -
    -        // 主字段
    -        foreach ($field as $t) {
    -            if (!IS_ADMIN && !$t['ismember']) {
    -                continue;
    -            } elseif (IS_ADMIN && $this->member['adminid'] > 1
    -                && @in_array($this->member['adminid'], $t['setting']['show_admin'])) {
    -                continue;
    -            }
    -            $obj = $this->dfield->get($t['fieldtype']);
    -            $html && $obj->set_input_format($html);
    -            // 判断自定义输出字段
    -            if (!$is_diy && $t['setting']['is_right'] == 2) {
    -                $diyfield[$t['fieldname']] = $t;
    -                continue;
    -            }
    -            if (is_object($obj)) {
    -                // 百度地图特殊字段
    -                $obj->remove_div = 0;
    -                $value = $t['fieldtype'] == 'Baidumap' ? ($data[$t['fieldname'].'_lng'] && $data[$t['fieldname'].'_lat'] ? $data[$t['fieldname'].'_lng'].','.$data[$t['fieldname'].'_lat'] : $data[$t['fieldname']]) : $data[$t['fieldname']];
    -
    -                if (isset($group[$t['fieldname']])) {
    -                    // 属于分组字段,重新获取字段表单
    -                    $obj->remove_div = 1;
    -                    $mygroup[$t['fieldname']] = $obj->input($t['name'], $t['fieldname'], $t['setting'], $value, isset($data[$id]) ? $data[$id] : 0);
    -                } elseif (isset($merge[$t['fieldname']])) {
    -                    // 属于合并字段
    -                    $input = $obj->input($t['name'], $t['fieldname'], $t['setting'], $value, isset($data[$id]) ? $data[$id] : 0);
    -                    $mymerge[$t['fieldname']] = $input;
    -                } elseif ($t['fieldtype'] == 'Merge') {
    -                    $myfield.= '{merge_'.$t['fieldname'].'}';
    -                } else {
    -                    $input = $obj->input($t['name'], $t['fieldname'], $t['setting'], $value, isset($data[$id]) ? $data[$id] : 0);
    -                    $myfield.= $input;
    -                }
    -            }
    -        }
    -
    -        if ($merge) {
    -            $html = '
    -
    -					    
  • -
    -
    -
    -
    -
    {text}
    -
    -
    -
    -{value}'; - if (!IS_ADMIN) { - $pchtml = $this->get_cache('member', 'setting', 'mergefield'); - $mbhtml = $this->get_cache('member', 'setting', 'mbmergefield'); - if ($this->mobile && $mbhtml) { - $html = $mbhtml; - } elseif ($pchtml) { - // Pc端格式 - $html = $pchtml; - } - } - - $data = array(); - foreach ($merge as $fname => $mname) { - $data[$mname][] = $fname; - } - foreach ($data as $mname => $value) { - $code = ''; - if ($value) { - foreach ($value as $fname) { - $code.= $mymerge[$fname]; - } - $myfield = $code ? str_replace( - '{merge_'.$mname.'}', - str_replace( - array('{text}', '{name}', '{value}'), - array(fc_lang($field[$mname]['name']), $mname, $code), - $html - ), - $myfield - ) : str_replace( - '{merge_'.$mname.'}', - '', - $myfield - ); - } - - } - } - - if ($mygroup) { - foreach ($mygroup as $name => $t) { - $myfield = str_replace('{'.$name.'}', $t, $myfield); - } - } - - // 存在自定义输出地址 - $diyfield && $this->template->assign('diyfield', $this->new_field_input($diyfield, $data, $cat, $id, $html, 1)); - - return $myfield; - } - - /** - * 字段输出表单(兼容老版本) - * - * @param array $field 字段数组 - * @param array $data 表单值 - * @param bool $cat 是否显示栏目附加字段 - * @param string $id id字符串 - * @return string - */ - public function field_input($field, $data = NULL, $cat = FALSE, $id = 'id') { - - return $this->new_field_input($field, $data, $cat, $id); - } - - /** - * 字段输出格式化 - * - * @param array $fields 可用字段集 - * @param array $data 数据 - * @param intval $curpage 分页id - * @param string $dirname 模型目录 - * @return string - */ - public function field_format_value($fields, $data, $curpage = 1, $dirname = NULL) { - - if (!$fields - || !$data - || !is_array($data)) { - return $data; - } - - foreach ($data as $n => $value) { - if (isset($fields[$n]) && $fields[$n]) { - $format = dr_get_value($fields[$n]['fieldtype'], $value, $fields[$n]['setting']['option'], $dirname); - if ($format !== $value) { - $data['_'.$n] = $value; - $data[$n] = $format; - } elseif (SITE_MOBILE !== TRUE - && $n == 'content' && $fields[$n]['fieldtype'] == 'Ueditor' - && strpos($value, '
    ') !== FALSE - && preg_match_all('/
    (.*)<\/div>/Us', $value, $match) - && preg_match('/(.*)
    $t) { - $page ++; - $value = str_replace($content[$page - 1]['body'].$t, '', $value); - $body = preg_match('/(.*)
    ') !== FALSE - && preg_match_all('/

    (.*)<\/p>/Us', $value, $match) - && preg_match('/(.*)

    /Us', $value, $frist)) { - // 编辑器分页 新版 - $page = 1; - $content = $title = array(); - $data['_'.$n] = $value; - $content[$page]['title'] = fc_lang('第%s页', $page); - $content[$page]['body'] = $frist[1]; - foreach ($match[0] as $i => $t) { - $page ++; - $value = str_replace($content[$page - 1]['body'].$t, '', $value); - $body = preg_match('/(.*)

    0 || $data[$name.'_lat'] > 0) ? $data[$name.'_lng'].','.$data[$name.'_lat'] : ''; - } - } - - return $data; - } - - - - - - /** - * 邮件直接发送 - * - * @param string $tomail - * @param string $subject - * @param string $message - * @return bool - */ - public function sendmail($tomail, $subject, $message) { - return $this->member_model->sendmail($tomail, $subject, $message); - } - - - /** - * 检查目录可写 - * - * @param string $pathfile - * @return boolean - */ - protected function _check_write_able($pathfile) { - - if (!$pathfile) { - return FALSE; - } - - $isDir = in_array(substr($pathfile, -1), array('/', '\\')) ? TRUE : FALSE; - if ($isDir) { - if (is_dir($pathfile)) { - mt_srand((double) microtime() * 1000000); - $pathfile = $pathfile.'dr_'.uniqid(mt_rand()).'.tmp'; - } elseif (@mkdir($pathfile)) { - return self::_check_write_able($pathfile); - } else { - return FALSE; - } - } - - @chmod($pathfile, 0777); - $fp = @fopen($pathfile, 'ab'); - if ($fp === FALSE) { - return FALSE; - } - - fclose($fp); - $isDir && @unlink($pathfile); - - return TRUE; - } - - - - - // 执行sql - public function sql_query($sql, $db = NULL) { - - if (!$sql) { - return NULL; - } - - $sql_data = explode(';SQL_FINECMS_EOL', trim(str_replace(array(PHP_EOL, chr(13), chr(10)), 'SQL_FINECMS_EOL', $sql))); - - foreach ($sql_data as $query) { - if (!$query) { - continue; - } - $ret = ''; - $queries = explode('SQL_FINECMS_EOL', trim($query)); - foreach ($queries as $query) { - $ret.= $query[0] == '#' || $query[0].$query[1] == '--' ? '' : $query; - } - if (!$ret) { - continue; - } - $this->db->query($ret); - } - } - - //////////////////////////////////////////////////////////////// - - /** - * 站点间的同步退出 - */ - protected function api_synlogin() { - - $code = dr_authcode(str_replace(' ', '+', $this->input->get('code'))); - if (!$code) { - exit('code is null'); - } - - list($uid, $salt) = explode('-', $code); - - if (!$uid || !$salt) { - exit('data is null'); - } - - $member = $this->db->select('password,salt')->where('uid', $uid)->get('member')->row_array(); - if (!$member) { - exit('check error'); - } elseif ($member['salt'] != $salt) { - exit('error'); - } - - header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); - $expire = max((int)$this->input->get('expire'), 86400); - - ob_start(); - set_cookie('member_uid', $uid, $expire); - set_cookie('member_cookie', substr(md5(SYS_KEY.$member['password']), 5, 20), $expire); - ob_get_clean(); - exit('ok uid='.$uid); - } - - /** - * 站点间的同步登录 - */ - protected function api_synlogout() { - if ($this->session->userdata('member_auth_uid')) { - $this->session->unset_userdata('member_auth_uid'); - } else { - set_cookie('member_uid', 0, -1); - set_cookie('member_cookie', '', -1); - - } - } - - /** - * 自定义信息JS调用 - */ - protected function api_template() { - - ob_start(); - $this->template->cron = 0; - $_GET['page'] = max(1, (int)$this->input->get('page')); - $get = @json_decode(urldecode($this->input->get('get')), TRUE); - $params = @json_decode(urldecode($this->input->get('params')), TRUE); - $this->template->assign(array( - 'get' => $get, - 'params' => $params, - 'dirname' => $this->input->get('dirname') - )); - $this->template->assign($get); - $this->template->assign($params); - $name = str_replace(array('\\', '/', '..', '<', '>'), '', dr_safe_replace($this->input->get('name', TRUE))); - $this->template->display(strpos($name, '.html') ? $name : $name.'.html'); - $html = ob_get_contents(); - ob_clean(); - - // 格式输出 - if (isset($_GET['return']) && $_GET['return'] == 'js') { - $html = addslashes(str_replace(array("\r", "\n", "\t", chr(13)), array('', '', '', ''), $html)); - echo 'document.write("'.$html.'");'; - } else { - exit($html); - } - exit; - } - - /** - * 收藏文档 - */ - protected function api_favorite() { - - if (!$this->uid) { - // 未登录 - if (isset($_GET['jsonp']) && $_GET['jsonp']) { - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.json_encode(array('code' => '1')).')';exit; - } else { - exit('1'); - } - } - - $id = (int)$this->input->get('id'); - $cid = (int)$this->input->get('cid'); - $mid = $cid ? $cid : $id; // 内容表id - $eid = $cid ? $id : 0; // 扩展表id - $data = $this->db->where('id', $mid)->select('url,title')->get(SITE_ID.'_'.APP_DIR)->row_array(); - if (!$data) { - // 文档不存在 - if (isset($_GET['jsonp']) && $_GET['jsonp']) { - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.json_encode(array('code' => '2')).')';exit; - } else { - exit('2'); - } - } - - $table = SITE_ID.'_'.APP_DIR.'_favorite'; - $favorite = $this->db->where('cid', $mid)->where('uid', $this->uid)->where('eid', $eid)->select('id')->get($table)->row_array(); - if ($eid) { - // 收藏扩展表 - $data2 = $this->db->where('cid', $mid)->get(SITE_ID.'_'.APP_DIR.'_extend')->row_array(); - if ($favorite) { - $this->db->where('id', $favorite['id'])->update($table, array( - 'url' => $data2['url'], - 'title' => $data['title'].' - '.$data2['name'] - )); - // 更新成功 - if (isset($_GET['jsonp']) && $_GET['jsonp']) { - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.json_encode(array('code' => '3')).')';exit; - } else { - exit('3'); - } - } else { - // 添加成功 - $this->db->insert($table, array( - 'eid' => $eid, - 'cid' => $mid, - 'uid' => $this->uid, - 'url' => $data2['url'], - 'title' => $data['title'].' - '.$data2['name'], - 'inputtime' => SYS_TIME, - )); - // 更新数量 - $c = $this->db->where('eid', $eid)->count_all_results($table); - $this->db->where('id', $eid)->set('favorites', $c)->update(SITE_ID.'_'.APP_DIR.'_extend'); - if (isset($_GET['jsonp']) && $_GET['jsonp']) { - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.json_encode(array('code' => '4')).')';exit; - } else { - exit('4'); - } - } - } else { - // 收藏主表 - if ($favorite) { - $this->db->where('id', $favorite['id'])->update($table, array( - 'url' => $data['url'], - 'title' => $data['title'] - )); - // 更新成功 - if (isset($_GET['jsonp']) && $_GET['jsonp']) { - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.json_encode(array('code' => '3')).')';exit; - } else { - exit('3'); - } - } else { - // 添加成功 - $this->db->insert($table, array( - 'eid' => 0, - 'cid' => $mid, - 'uid' => $this->uid, - 'url' => $data['url'], - 'title' => $data['title'] ? $data['title'] : '', - 'inputtime' => SYS_TIME, - )); - // 更新数量 - $c = $this->db->where('cid', $mid)->count_all_results($table); - $this->db->where('id', $mid)->set('favorites', $c)->update(SITE_ID.'_'.APP_DIR); - if (isset($_GET['jsonp']) && $_GET['jsonp']) { - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.json_encode(array('code' => '4')).')';exit; - } else { - exit('4'); - } - } - } - } - - - /** - * 引用404页面 - */ - public function goto_404_page($msg) { - //header("status: 404 Not Found"); - $this->template->assign(array( - 'msg' => $msg, - 'meta_title' => $msg - )); - $this->template->display('404.html');exit; - } - - /** - * 伪静态404页面 - */ - public function s404() { - - // 这里是满足不同用户的需求而设定的参数 - // code=1时会提示路由信息错误, code=2时直接指向首页且不提示任何信息 - $code = 1; - - // 以下不改 - $code == 1 && $this->goto_404_page('无法找到对应的页面('.dr_safe_replace(DR_URI).'),可能您没有配置好路由规则'); - $code == 2 && $this->_indexc(); - } - - /** - * 后台日志 - */ - protected function system_log($action, $insert = 0) { - - if (!$insert) { - // 是否开启日志 - if (!SYS_LOG || !IS_ADMIN) { - return NULL; - } - } - - $data = array( - 'ip' => $this->input->ip_address(), - 'uid' => $this->member['uid'], - 'time' => SYS_TIME, - 'action' => addslashes($action), - 'username' => $this->member['username'], - ); - - $path = WEBPATH.'cache/optionlog/'.date('Ym', SYS_TIME).'/'; - $file = $path.date('d', SYS_TIME).'.log'; - !is_dir($path) && dr_mkdirs($path); - - file_put_contents($file, PHP_EOL.dr_array2string($data), FILE_APPEND); - } - - // 任意表字段信息 - public function field_table($table, $sid) { - - $name = 'table_'.$table.$sid; - $data = $this->dcache->get($name); - if (!$data) { - $field = $this->db - ->where('disabled', 0) - ->where('relatedname', 'table-'.$table) - ->where('relatedid', $sid) - ->order_by('displayorder ASC, id ASC') - ->get('field') - ->result_array(); - if ($field) { - foreach ($field as $f) { - $data[$f['fieldname']] = $f; - } - } - $this->dcache->set($name, $data); - } - - return $data; - } - - - - // jsonp 格式返回 - public function return_jsonp($data) { - - echo dr_safe_replace(dr_safe_replace($this->input->get('callback', TRUE))).'('.$data.')';exit; - } - - - // 获取任意表的自定义字段 - public function get_mytable_field($table, $siteid = 0) { - - $name = 'mytable-'.$table.'-'.$siteid; - $value = $this->get_cache($name); - if (!$value) { - $field = $this->db - ->where('disabled', 0) - ->where('relatedid', $siteid) - ->where('relatedname', 'table-'.$table) - ->order_by('displayorder ASC,id ASC') - ->get('field') - ->result_array(); - if ($field) { - foreach ($field as $t) { - $t['setting'] = dr_string2array($t['setting']); - $value[$t['fieldname']] = $t; - } - } - $this->dcache->set($name, $value); - } - - return $value; - } - - - - /** - * 栏目下级或者同级栏目 - */ - protected function _related_cat($category, $catid) { - - if (!$category) { - return array(NULL, NULL); - } - - $cat = $category[$catid]; - $related = $parent = array(); - - if ($cat['child']) { - $parent = $cat; - foreach ($category as $t) { - $t['pid'] == $cat['id'] && $related[] = $t; - } - } elseif ($cat['pid']) { - foreach ($category as $t) { - if ($t['pid'] == $cat['pid']) { - $related[] = $t; - $parent = $cat['child'] ? $cat : $category[$t['pid']]; - } - } - } else { - if (!$category) { - return array(NULL, NULL); - } - $parent = $cat; - foreach ($category as $t) { - $t['pid'] == 0 && $related[] = $t; - } - } - - return array($parent, $related); - } - - // 去除url中的域名 - protected function _remove_domain($url) { - - if (!$this->_temp['domain']) { - $domain = require WEBPATH.'config/domain.php'; - foreach ($domain as $u => $i) { - $this->_temp['domain'][] = 'http://'.$u.'/'; - $this->_temp['domain'][] = 'https://'.$u.'/'; - } - } - - return str_replace($this->_temp['domain'], '', $url); - } - - - /******************模型继承部分*******************/ - - // 初始化模型 - protected function _module_init($dir = '') { - - // 定义模型目录 - !$this->dir && $this->dir = $dir; - - // 检查模型 - if (!$this->module[$this->dir]) { - $this->admin_msg(fc_lang('当前模型【'.$this->dir.'】不存在')); - } - - // 模型常量 - define('MOD_DIR', $this->dir); - define('MODULE_TITLE', $this->module[$this->dir]['site']['module_title']); - - $this->load->model('content_model'); - $this->content_model->init($this->module[$this->dir]); - - $this->template->assign(array( - 'module' => $this->module, - )); - } - - // 获取返回时的URL - protected function _get_back_url($uri, $param = array()) { - - $name = md5($uri.$this->uid.SITE_ID.$this->input->ip_address().$this->input->user_agent()); - $value = $this->cache->file->get($name); - return $value ? $value : dr_url($uri, $param); - } - - // 设置返回时的URL, uri页面标识,param参数,nuri当前页优先 - protected function _set_back_url($uri, $param = array(), $nuri = '') { - - !is_array($param) && $param = array(); - $name = md5($uri.$this->uid.SITE_ID.$this->input->ip_address().$this->input->user_agent()); - $param['page'] = $_GET['page']; - $this->cache->file->save($name, dr_url($nuri ? $nuri : $uri, $param), 3600); - } - - // 替换语言 - public function replace_lang($string) { - - if ($this->replace_lang === 1) { - $lang = array(); - $this->replace_lang = array(); - is_file(FCPATH.'dayrui/languages/'.SITE_LANGUAGE.'/replace_lang.php') && require FCPATH.'dayrui/language/'.SITE_LANGUAGE.'/replace_lang.php'; - is_file(APPPATH.'language/'.SITE_LANGUAGE.'/replace_lang.php') && require_once APPPATH.'language/'.SITE_LANGUAGE.'/replace_lang.php'; - if ($lang) { - foreach ($lang as $name => $value) { - $this->replace_lang[1][] = $name; - $this->replace_lang[2][] = $value; - } - } - } - - return $this->replace_lang ? str_replace($this->replace_lang[1], $this->replace_lang[2], $string) : $string; - } - - - public function html_thumb($p) { - - // 参数解析 - list($id, $width, $height, $water, $size) = explode('-', $p); - - $info = get_attachment($id); // 图片信息 - if (!$info) { - return THEME_PATH.'admin/images/nopic.gif'; - } - - // 缓存文件 - $thumb_file = trim(SYS_THUMB_DIR, '/').'/'.md5("$id-$width-$height-$water-$size").'.jpg'; - - if ($info && in_array($info['fileext'], array('jpg', 'gif', 'png', 'jpeg'))) { - // 远程图片下载到本地缓存目录 - if (isset($info['remote']) && $info['remote']) { - $file = WEBPATH.'cache/attach/'.SYS_TIME.'_'.basename($info['attachment']); - if ($size) { - $info['attachment'] = str_replace( - basename($info['attachment']), - basename($info['attachment'], '.'.$info['fileext']).'_'.$size.'.'.$info['fileext'], - $info['attachment'] - ); - } - file_put_contents($file, dr_catcher_data($info['attachment'])); - } else { - if ($size) { - $file_size = str_replace( - basename($info['attachment']), - basename($info['attachment'], '.'.$info['fileext']).'_'.$size.'.'.$info['fileext'], - $info['attachment'] - ); - $file = is_file(SYS_UPLOAD_PATH.'/'.$file_size) ? SYS_UPLOAD_PATH.'/'.$file_size : SYS_UPLOAD_PATH.'/'.$info['attachment']; - } else { - $file = SYS_UPLOAD_PATH.'/'.$info['attachment']; - } - } - if (!is_file($file)) { - return THEME_PATH.'admin/images/nopic.gif'; - } - } else { - return THEME_PATH.'admin/images/nopic.gif'; - } - - // 处理宽高 - list($_width, $_height) = @getimagesize($file); - $width = $width ? $width : $_width; - $height = $height ? $height : $_height; - - // 站点配置信息 - $site = $this->get_cache('siteinfo', $info['siteid']); - - // 生成新图参数 - $config['width'] = $width; - $config['height'] = $height; - $config['create_thumb'] = TRUE; - $config['source_image'] = $file; - $config['new_image'] = WEBPATH.$thumb_file; - $config['thumb_marker'] = ''; - $config['image_library'] = 'gd2'; - $config['dynamic_output'] = false; // 覆盖图片 - $config['maintain_ratio'] = (bool)$site['SITE_IMAGE_RATIO']; // 使图像保持原始的纵横比例 - - // 水印判断 - if (isset($info['remote']) && $info['remote'] && !$site['SITE_IMAGE_REMOTE'] - ? FALSE : ((bool)$site['SITE_IMAGE_WATERMARK'] && $water ? TRUE : FALSE)) { - // 水印参数 - $config['wm_type'] = $site['SITE_IMAGE_TYPE'] ? 'overlay' : 'text'; - $config['wm_vrt_offset'] = $site['SITE_IMAGE_VRTOFFSET']; - $config['wm_hor_offset'] = $site['SITE_IMAGE_HOROFFSET']; - $config['wm_vrt_alignment'] = $site['SITE_IMAGE_VRTALIGN']; - $config['wm_hor_alignment'] = $site['SITE_IMAGE_HORALIGN']; - // 文字模式 - $config['wm_text'] = $site['SITE_IMAGE_TEXT']; - $config['wm_font_size'] = $site['SITE_IMAGE_SIZE']; - $config['wm_font_path'] = WEBPATH.'statics/watermark/'.($site['SITE_IMAGE_FONT'] ? $site['SITE_IMAGE_FONT'] : 'default.ttf'); - $config['wm_font_color'] = $site['SITE_IMAGE_COLOR'] ? str_replace('#', '', $site['SITE_IMAGE_COLOR']) : '#000000'; - // 图片模式 - $config['wm_opacity'] = $site['SITE_IMAGE_OPACITY'] ? $site['SITE_IMAGE_OPACITY'] : 80; - $config['wm_overlay_path'] = WEBPATH.'statics/watermark/'.($site['SITE_IMAGE_OVERLAY'] ? $site['SITE_IMAGE_OVERLAY'] : 'default.png'); - // 生成图片的临时文件 - $this->load->library('image_lib'); - $this->image_lib->initialize($config); - $this->image_lib->resize(); - // 打开临时文件再水印 - $this->image_lib->full_src_path = $config['new_image']; - $this->image_lib->watermark(); - } else { - // 默认模式 - $this->load->library('image_lib'); - $this->image_lib->initialize($config); - $this->image_lib->resize(); - } - - return SITE_URL.$thumb_file; - } - - /** - * 图片处理2 - */ - public function html_thumb2($p) { - - list($id, $width, $height, $autocut) = explode('-', $p); - - $this->load->library('dthumb'); - - // 是附件id时 - if (is_numeric($id)) { - $info = get_attachment($id); - if (!$info) { - return THEME_PATH.'admin/images/nopic.gif'; - } - // 输出图片的地址 - $display = trim(SYS_THUMB_DIR, '/').'/'.md5("index.php?c=image&m=thumb&p=$id-$width-$height-$autocut").'.jpg'; - // 远程图片下载到本地缓存目录 - if (isset($info['remote']) && $info['remote']) { - $file = WEBPATH.'cache/attach/'.time().'_'.basename($info['attachment']); - file_put_contents($file, dr_catcher_data($info['attachment'])); - } else { - $file = SYS_UPLOAD_PATH.'/'.$info['attachment']; - } - unset($info); - } else { - - return THEME_PATH.'admin/images/nopic.gif'; - } - - // 图片不存在时调用默认图片 - if (!is_file($file)) { - return THEME_PATH.'admin/images/nopic.gif'; - } - - // 生成缩略图 - $this->dthumb->thumb($file, $display, $width, $height, '', $autocut); - - // 输出缩略图 - $this->dthumb->html(WEBPATH.$display); - - return SITE_URL.$display; - } - - public function get_module($siteid = 0) { - return $this->get_cache('module'); - } - - public function select_category($data, $id = 0, $str = '', $default = ' -- ', $onlysub = 0, $is_push = 0, $is_first = 0) { - - - $tree = array(); - $first = 0; // 第一个可用栏目 - $string = ''; - - if ($is_first) { - $mark = "value='"; - $first2 = (int)substr($string, strpos($string, $mark) + strlen($mark)); - $first = $first2 ? $first2 : $first; - } - - $data = $is_first ? array($string, $first) : $string; - - - return $data; - } - - - protected function _cache_url() { - - $url = array( - array( - 'url' => dr_url('site/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('站点')), - ), - - array( - 'url' => dr_url('module/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('模型')), - ), - - - array( - 'url' => dr_url('form/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('表单')), - ), - - array( - 'url' => dr_url('category/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('栏目')), - ), - - - array( - 'url' => dr_url('mail/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('邮件')), - ), - - - array( - 'url' => dr_url('urlrule/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('URL规则')), - ), - - array( - 'url' => dr_url('linkage/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('联动菜单')), - ), - - array( - 'url' => dr_url('block/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('自定义内容')), - ), - - array( - 'url' => dr_url('member_setting/cache', array('admin' => 1)), - 'name' => fc_lang('%s缓存', fc_lang('会员')), - ), - ); - - - $local = $this->local_app(); - if ($local) { - foreach ($local as $t) { - if ($t['cache']) { - $url = array_merge($url, $t['cache']); - } - } - } - - return $url; - } - - function local_app() { - - $source_dir = FCPATH.'app/'; - if ($fp = @opendir($source_dir)) { - - $app = array(); - $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - - while (FALSE !== ($file = readdir($fp))) { - if ($file === '.' OR $file === '..' OR $file === 'test.php') { - continue; - } - if (strpos($file, '.php') !== false) { - $app[] = require $source_dir.$file; - } - } - closedir($fp); - return $app; - } - - return array(); - } - - /** - * 验证会员名称 - * - * @param string $username - * @return NULL - */ - protected function is_username($username) { - - if (!$username) { - return fc_lang('会员名称格式不正确'); - } - - $setting = $this->get_cache('member', 'setting'); - if ($setting['regnamerule'] - && !preg_match($setting['regnamerule'], $username)) { - return fc_lang('会员名称格式不正确'); - } - - if ($setting['regnotallow'] - && @in_array($username, explode(',', $setting['regnotallow']))) { - return fc_lang('该会员名称系统禁止注册'); - } - - return NULL; - } - - /** - * 验证Email - * - * @param string $email - * @return NULL - */ - protected function is_email($email) { - - if (!$email) { - return fc_lang('邮箱格式不正确'); - } - - if (!preg_match('/^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/', $email)) { - return fc_lang('邮箱格式不正确'); - } - - return NULL; - } - -} diff --git a/finecms/finecms/dayrui/core/M_File.php b/finecms/finecms/dayrui/core/M_File.php deleted file mode 100644 index 230fb94..0000000 --- a/finecms/finecms/dayrui/core/M_File.php +++ /dev/null @@ -1,509 +0,0 @@ -_dir = array('ckplayer', 'comment', 'watermark', 'avatar', 'js', 'oauth', 'admin', 'space'); - - } - - // 初始化 - protected function _init() { - if (APP_DIR && APP_DIR != 'member' && APP_DIR != 'space') { - - $this->path = $this->router->method == 'mobile' || $this->input->get('ismb') ? (is_dir(FCPATH.'module/'.APP_DIR.'/mobiles/') ? FCPATH.'module/'.APP_DIR.'/mobiles/' : TPLPATH.'mobile/web/') : (is_dir(FCPATH.'module/'.APP_DIR.'/templates/') ? FCPATH.'module/'.APP_DIR.'/templates/' : TPLPATH.'pc/web/'); - - $this->router->class == 'theme' && $this->path = WEBPATH.'statics/'; - $this->template->assign(array( - 'path' => $this->path, - 'furi' => APP_DIR.'/tpl/', - 'auth' => APP_DIR.'/admin/tpl/', - 'menu' => $this->get_menu(array( - fc_lang('模板管理') => APP_DIR.'/admin/tpl/index', - fc_lang('移动端模板') => APP_DIR.'/admin/tpl/mobile', - fc_lang('标签向导') => APP_DIR.'/admin/tpl/tag', - )), - 'ismb' => $this->router->method == 'mobile' ? 1 : 0, - )); - } - } - - /** - * 文件管理 - */ - public function index() { - - $this->_init(); - - $this->load->helper('directory'); - $dir = trim(str_replace('.', '', $this->input->get('dir',true)), '/'); - $path = $dir ? $this->path.$dir.'/' : $this->path; - $data = directory_map($path, 1); - $list = array(); - - if ($data) { - foreach ($data as $t) { - $ext = strrchr($t, '.'); - if ($ext && in_array(strtolower($ext), array('.php'))) { - continue; - } - if (!$dir && in_array(basename($t), $this->_dir)) { - continue; - } - $icon = $eurl = ''; - if ($ext) { - $ext = strtolower(trim($ext, '.')); - $icon = is_file(WEBPATH.'statics/admin/images/ext/'.$ext.'.gif') ? 'ext/'.$ext.'.gif' : 'file.gif'; - if (in_array($ext, array('html', 'html', 'js', 'css'))) { - $eurl = dr_url($this->template->get_value('furi').'edit', array('file' => $dir.'/'.$t)); - } elseif (in_array($ext, array('jpg', 'gif', 'png'))) { - $eurl = ''.str_replace(WEBPATH, SITE_URL, $this->path).trim($dir.'/'.$t, '/').'" target="_blank"'; - } else { - $eurl = 'javascript:;'; - } - } - $list[] = array( - 'ext' => $ext, - 'file' => $t, - 'icon' => $icon, - 'eurl' => $eurl, - ); - } - } - - $this->template->assign(array( - 'dir' => $dir, - 'path' => $path, - 'list' => $list, - 'parent' => dirname($dir), - )); - $this->template->display('file_index.html'); - } - - /** - * 移动端模板管理 - */ - public function mobile() { - - $this->_init(); - - $this->load->helper('directory'); - $dir = trim(str_replace('.', '', $this->input->get('dir',true)), '/'); - $path = $dir ? $this->path.$dir.'/' : $this->path; - $data = directory_map($path, 1); - $list = array(); - - if ($data) { - foreach ($data as $t) { - $ext = strrchr($t, '.'); - if ($ext && in_array(strtolower($ext), array('.php'))) { - continue; - } elseif (!$dir && in_array(basename($t), $this->_dir)) { - continue; - } - $icon = $eurl = ''; - if ($ext) { - $ext = strtolower(trim($ext, '.')); - $icon = is_file(WEBPATH.'statics/admin/images/ext/'.$ext.'.gif') ? 'ext/'.$ext.'.gif' : 'file.gif'; - if (in_array($ext, array('html', 'html', 'js', 'css'))) { - $eurl = dr_url($this->template->get_value('furi').'edit', array('file' => $dir.'/'.$t, 'ismb'=>1)); - } elseif (in_array($ext, array('jpg', 'gif', 'png'))) { - $eurl = ''.str_replace(WEBPATH, SITE_URL, $this->path).trim($dir.'/'.$t, '/').'" target="_blank"'; - } else { - $eurl = 'javascript:;'; - } - } - $list[] = array( - 'ext' => $ext, - 'file' => $t, - 'icon' => $icon, - 'eurl' => $eurl, - ); - } - } - - $this->template->assign(array( - 'dir' => $dir, - 'path' => $path, - 'list' => $list, - 'parent' => dirname($dir), - 'upload' => 'dr_upload_files2(\''.dr_url('api/upload', array('path' => $path)).'\')', - )); - $this->template->display('file_index.html'); - } - - /** - * 创建文件或者目录 - */ - public function add() { - - $this->_init(); - - $dir = trim(str_replace('.', '', $this->input->get('dir',true)), '/'); - $path = $dir ? $this->path.$dir.'/' : $this->path; - $error = $file = ''; - !is_dir($path) && exit('

    '.fc_lang('文件目录不存在').'

    '); - - if (IS_POST) { - if (IS_EDIT_TPL == 0) { - exit(dr_json(0, fc_lang('系统禁止编辑模板(index.php中IS_EDIT_TPL设置为1表示开启编辑模板)'), 'file')); - } - $file = trim(str_replace(array('/', '\\', ';'), '', $this->input->post('file')), '/'); - !$file && exit(dr_json(0, fc_lang('文件或者目录不存在'), 'file')); - substr_count($file, '.') > 1 && exit(dr_json(0, fc_lang('请确认否是有效的文件'), 'file')); - is_file($path.$file) && exit(dr_json(0, fc_lang('文件或者目录已经存在了'), 'file')); - $ext = strrchr($file, '.'); - if ($ext) { - // 创建文件 - if (in_array($ext, array('.html', '.js', '.css'))) { - if (file_put_contents($path.$file, '') === FALSE) { - exit(dr_json(0, fc_lang('文件添加失败,请检查写入权限'), 'file')); - } else { - $this->system_log('创建文件:'.$path.$file); // 记录日志 - exit(dr_json(1, fc_lang('文件添加成功'), 'file')); - } - } else { - exit(dr_json(0, fc_lang('文件扩展名不正确'), 'file')); - } - } else { - // 创建目录 - if (mkdir($path.$file)) { - $this->system_log('创建目录:'.$path.$file); // 记录日志 - exit(dr_json(1, fc_lang('目录添加成功'), 'file')); - } else { - exit(dr_json(0, fc_lang('目录添加失败,请检查写入权限'), 'file')); - } - } - - } - - $this->template->display('file_add.html'); - } - - /** - * 修改文件内容 - */ - public function edit() { - - $this->_init(); - - $file = trim(str_replace(array('../', '\\', '..'), array('', '/', ''), $this->input->get('file',true)), '/'); - !is_file($this->path.$file) && $this->admin_msg(fc_lang('文件不存在')); - if (!in_array(strtolower(strrchr($file, '.')), array('.html', '.js', '.css'))) { - $this->admin_msg(fc_lang('文件扩展名不规范')); - } - - if (IS_POST) { - - if (IS_EDIT_TPL == 0) { - $this->admin_msg(fc_lang('系统禁止编辑模板(index.php中IS_EDIT_TPL设置为1表示开启编辑模板)')); - } - - $code = $this->input->post('code'); - file_put_contents($this->path.$file, $code); - $this->system_log('修改文件:'.$this->path.$file); // 记录日志 - } - - $furi = $this->template->get_value('furi'); - $this->template->assign(array( - 'path' => $this->path.$file, - 'back' => dr_url($furi.($this->input->get('ismb') ? 'mobile' : 'index'), array('dir'=> dirname($file), 'ismb' => $this->input->get('ismb'))), - 'body' => in_array(strtolower(strrchr($file, '.')), array('.js')) ? file_get_contents($this->path.$file) : htmlentities(file_get_contents($this->path.$file), ENT_COMPAT,'UTF-8'), - - )); - $this->template->display('file_edit.html'); - - } - - /** - * 解压 - */ - public function jie() { - - $this->_init(); - - - if (IS_EDIT_TPL == 0) { - $this->admin_msg(fc_lang('系统禁止编辑模板(index.php中IS_EDIT_TPL设置为1表示开启编辑模板)')); - } - - $file = trim(str_replace(array('../', '\\', '..'), array('', '/'), $this->input->get('file',true)), '/'); - !is_file($this->path.$file) && $this->admin_msg(fc_lang('文件不存在')); - - $path = dirname($this->path.$file); - !is_dir($path) && $this->admin_msg(fc_lang('文件目录不存在')); - - // 解压缩文件 - $this->load->library('Pclzip'); - $this->pclzip->PclFile($this->path.$file); - // 覆盖至网站根目录 - $this->pclzip->extract(PCLZIP_OPT_PATH, $path, PCLZIP_OPT_REPLACE_NEWER); - - $this->system_log('解压文件:'.$this->path.$file); // 记录日志 - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url($this->template->get_value('furi'). ($this->input->get('ismb') ? 'mobile' : 'index'), array('dir'=> dirname($file), 'ismb' => $this->input->get('ismb'))), 1, 2); - - } - - /** - * 删除 - */ - public function del() { - - $this->_init(); - - if (IS_EDIT_TPL == 0) { - exit(dr_json(0, fc_lang('系统禁止编辑模板(index.php中IS_EDIT_TPL设置为1表示开启编辑模板)'), 'file')); - } - - $file = trim(str_replace(array('../', '\\', '..'), array('', '/'), $this->input->get('file',true)), '/'); - !$file && exit(dr_json(0, fc_lang('文件或者目录格式不正确'))); - - if (is_dir($this->path.$file)) { - $this->load->helper('file'); - delete_files($this->path.$file, TRUE); - @rmdir($this->path.$file); - $this->system_log('删除目录:'.$this->path.$file); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } else { - @unlink($this->path.$file); - $this->system_log('删除文件:'.$this->path.$file); // 记录日志 - exit(dr_json(1, fc_lang('操作成功,正在刷新...'))); - } - } - - /** - * 标签向导 - */ - public function tag() { - - $this->_init(); - - SYS_DEBUG && $this->output->enable_profiler(FALSE); - - if (IS_AJAX) { - $this->load->model('system_model'); - $data = $this->input->post('data'); - $cache = $this->system_model->cache(); // 表结构缓存 - echo '
    '; - switch ($this->input->post('action')) { - case 'navigator': - echo '
  • {list action=navigator type='.$data['type'].((int)$data['num'] ? ' num='.(int)$data['num'] : '').' return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix('1_navigator')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - case 'page_list': - echo '
  • {list action=page module='.$data['module'].((int)$data['num'] ? ' num='.(int)$data['num'] : '').' pid='.(int)$data['pid'].' return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix(SITE_ID.'_page')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - case 'page_show': - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix(SITE_ID.'_page')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    调用方式
    说明
    {$ci->get_cache(\'page-'.SITE_ID.'\', \'data\', \''.$data['module'].'\', '.(int)$data['id'].', \''.$t['name'].'\')}
    '.$t['note'].'
    '; - echo '
    '; - break; - case 'linkage_list': - echo '
  • {list action=linkage code='.$data['code'].((int)$data['num'] ? ' num='.(int)$data['num'] : '').' return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
  • 知道id显示菜单名字:{dr_linkagepos(\''.$data['code'].'\', ID, \'\')}
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix('linkage_data_1')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - case 'form_list': - echo '
  • {list action=form form='.$data['form'].((int)$data['num'] ? ' num='.(int)$data['num'] : '').' return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}
  • '; - echo '
  • 字段名称在“系统->系统维护->数据备份”中单击以站点id_form_表单表名称的表就知道了
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
  • {$sql}返回这段查询的SQL代码,调试开发期间很有用处
  • '; - echo '
    '; - break; - case 'module_list': - echo '
  • {list action=module module='.APP_DIR.((int)$data['num'] ? ' num='.(int)$data['num'] : '').' return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
  • {$sql}返回这段查询的SQL代码,调试开发期间很有用处
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix(SITE_ID.'_'.APP_DIR)]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - case 'category_list': - echo '
  • {list action=category module='.APP_DIR.((int)$data['num'] ? ' num='.(int)$data['num'] : '').' pid='.(int)$data['pid'].' return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix(SITE_ID.'_'.APP_DIR.'_category')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - case 'category_show': - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix(SITE_ID.'_'.APP_DIR.'_category')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    调用方式
    说明
    {$ci->get_cache(\'module-'.SITE_ID.'-'.APP_DIR.'\', \'category\', '.(int)$data['id'].', \''.$t['name'].'\')}
    '.$t['note'].'
    '; - echo '
    '; - break; - case 'member_group': - echo '
  • {list action=cache name=member.group return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix('member_group')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - case 'member_level': - echo '
  • {list action=cache name=member.group.'.(int)$data['gid'].'.level return='.$data['return'].'}
  • '; - echo '
  • 当前循环序号:{$key}(从0开始)
  • '; - echo '
  • 等级星星调用:{dr_show_stars($'.$data['return'].'.stars)}
  • '; - echo '
  • 字段调用方式:{$'.$data['return'].'.字段名称}(字段名称下面介绍)
  • '; - echo '
  • {/list}
  • '; - echo '
  • {$error}返回错误提示代码
  • '; - echo '
    '; - echo '
    '; - echo ''; - echo ''; - $table = $cache[$this->db->dbprefix('member_level')]['field']; - if ($table) { - foreach ($table as $t) { - echo ''; - } - } - echo '
    字段
    说明
    {$'.$data['return'].'.'.$t['name'].'}
    '.$t['note'].'
    '; - break; - default: - echo '未知操作'; - break; - } - echo '
    '; - - } else { - - switch (APP_DIR) { - case '': - $nav = explode(',', SITE_NAVIGATOR); - $navigator = array(); - foreach ($nav as $i => $name) { - if ($name) { - $navigator[$i] = $name; - } - } - $this->template->assign(array( - 'form' => $this->db - ->get(SITE_ID.'_form') - ->result_array(), - 'linkage' => $this->db - ->order_by('id ASC') - ->get('linkage') - ->result_array(), - 'navigator' => $navigator, - )); - $tpl = ''; - break; - case 'member': - $tpl = '_member'; - break; - default: - $tpl = '_module'; - break; - } - - $this->template->assign(array( - 'return_var' => 't', - 'navigator' => $navigator, - )); - $this->template->display('file_tag'.$tpl.'.html'); - } - } - - public function store() { - exit('接口关闭'); - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/core/M_Lang.php b/finecms/finecms/dayrui/core/M_Lang.php deleted file mode 100644 index 6aa33f6..0000000 --- a/finecms/finecms/dayrui/core/M_Lang.php +++ /dev/null @@ -1,19 +0,0 @@ -language[$line]) ? $this->language[$line] : FALSE; - // Because killer robots like unicorns! - if ($value === FALSE && $log_errors === TRUE) - { - return $line; - } - - return $value; - } - -} diff --git a/finecms/finecms/dayrui/core/M_Model.php b/finecms/finecms/dayrui/core/M_Model.php deleted file mode 100644 index 1f71785..0000000 --- a/finecms/finecms/dayrui/core/M_Model.php +++ /dev/null @@ -1,34 +0,0 @@ -ci = & get_instance(); - $this->db = & $this->ci->db; // 后期删除 - $this->link = & $this->ci->db; // 后期删除 - } - - /** - * __get magic - * - * Allows models to access CI's loaded classes using the same - * syntax as controllers. - * - * @param string $key - */ - public function __get($key) - { - // Debugging note: - // If you're here because you're getting an error message - // saying 'Undefined Property: system/core/Model.php', it's - // most likely a typo in your model code. - return $this->ci->$key; - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/core/M_Router.php b/finecms/finecms/dayrui/core/M_Router.php deleted file mode 100644 index d90793c..0000000 --- a/finecms/finecms/dayrui/core/M_Router.php +++ /dev/null @@ -1,102 +0,0 @@ -default_controller = 'Home'; - parent::__construct(); - } - - protected function _set_routing() { - - - $_d = 's'; - $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; - if ($_d !== '') - { - $this->uri->filter_uri($_d); - $this->set_directory($_d); - } - - $_c = trim($this->config->item('controller_trigger')); - if ( ! empty($_GET[$_c])) - { - $this->uri->filter_uri($_GET[$_c]); - $this->set_class($_GET[$_c]); - - $_f = trim($this->config->item('function_trigger')); - if ( ! empty($_GET[$_f])) - { - $this->uri->filter_uri($_GET[$_f]); - $this->set_method($_GET[$_f]); - } - - $this->uri->rsegments = array( - 1 => $this->class, - 2 => $this->method - ); - } else { - - /* FineCMS路由模式 ======= 开始 */ - $routes = array(); - // 加载路由配置文件 - include_once(APPPATH.'config/routes.php'); - - /* FineCMS路由模式 */ - if (DR_URI) { - $value = $mark = $uri = NULL; - // 正则匹配路由规则 - foreach ($routes as $key => $val) { - if (@preg_match('/^'.$key.'$/U', DR_URI, $match)) { - unset($match[0]); - $uri = $val; - $value = $match; - break; - } - } - // 没有找到返回404 - if (!$uri) { - if (!is_file(WEBPATH.'cache/install.lock') && is_dir($_SERVER['DOCUMENT_ROOT'].'/'.DR_URI)) { - header('Content-Type: text/html; charset=utf8'); - show_error('FineCMS禁止子目录安装,请放置在网站根目录安装', 404); - } else { - $this->set_class('api'); - $this->set_method('s404'); - } - } else { - $i = 0; - // 设置默认控制器 - $this->set_class(array_shift($array)); - $this->set_method(array_shift($array)); - // 组装GET参数 - if ($array) { - foreach ($array as $k => $t) { - if ($i%2 == 0) { - $_GET[str_replace('$', '_', $t)] = isset($array[$k+1]) ? $array[$k+1] : ''; - } - $i ++; - } - if ($value) { - foreach ($_GET as $k => $v) { - if (strpos($v, '$') !== FALSE) { - $id = (int)substr($v, 1); - $_GET[$k] = isset($value[$id]) ? $value[$id] : $v; - } - } - } - } - } - return; - } - /* FineCMS路由模式 ======= 结束 */ - - $this->_set_default_controller(); - } - - return; - - } -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/core/M_Table.php b/finecms/finecms/dayrui/core/M_Table.php deleted file mode 100644 index 69d9978..0000000 --- a/finecms/finecms/dayrui/core/M_Table.php +++ /dev/null @@ -1,239 +0,0 @@ -myid = 'id'; - $this->load->library('Dfield'); - $this->cache_file = md5($this->duri->uri(1).$this->uid.$this->sid.$this->input->ip_address().$this->input->user_agent()); // 缓存文件名称 - } - - /** - * 条件查询 - * - * @param object $select 查询对象 - * @param intval $where 是否搜索 - * @return intval - */ - protected function _where(&$select, $param) { - - // 存在POST提交时 - if (IS_POST) { - $search = $this->input->post('data'); - $param['keyword'] = $search['keyword']; - $param['start'] = $search['start']; - $param['end'] = $search['end']; - $param['field'] = $search['field']; - } - - // 条件查询 - $this->mywhere && $select->where($this->mywhere); - $this->mygroup && $select->group_by($this->mygroup); - - // 存在search参数时,读取缓存文件 - if ($param) { - $field = $this->myfield; - !isset($field[$this->myid]) && $field[$this->myid] = 'id'; - if (isset($param['keyword']) && $param['keyword'] != '' && isset($field[$param['field']])) { - $param['field'] = $param['field'] ? $param['field'] : 'subject'; - if ($param['field'] == 'id') { - // 按id查询 - $id = array(); - $ids = explode(',', $param['keyword']); - foreach ($ids as $i) { - $id[] = (int)$i; - } - $select->where_in('id', $id); - } elseif ($field[$param['field']]['fieldtype'] == 'Linkage' - && $field[$param['field']]['setting']['option']['linkage']) { - // 联动菜单搜索 - if (is_numeric($param['keyword'])) { - // 联动菜单id查询 - $link = dr_linkage($field[$param['field']]['setting']['option']['linkage'], (int)$param['keyword'], 0, 'childids'); - $link && $select->where($param['field'].' IN ('.$link.')'); - } else { - // 联动菜单名称查询 - $id = (int)$this->ci->get_cache('linkid-'.SITE_ID, $field[$param['field']]['setting']['option']['linkage']); - $id && $select->where($param['field'].' IN (select id from `'.$select->dbprefix('linkage_data_'.$id).'` where `name` like "%'.$param['keyword'].'%")'); - } - } else { - $select->like($param['field'], urldecode($param['keyword'])); - } - } - // 时间搜索 - if (isset($param['start']) && $param['start']) { - $param['end'] = strtotime(date('Y-m-d 23:59:59', $param['end'] ? $param['end'] : SYS_TIME)); - $param['start'] = strtotime(date('Y-m-d 00:00:00', $param['start'])); - $select->where($this->tfield.' BETWEEN ' . $param['start'] . ' AND ' . $param['end']); - } elseif (isset($param['end']) && $param['end']) { - $param['end'] = strtotime(date('Y-m-d 23:59:59', $param['end'])); - $param['start'] = 1; - $select->where($this->tfield.' BETWEEN ' . $param['start'] . ' AND ' . $param['end']); - } - } - - return $param; - } - - /** - * 数据分页显示 - * - * @return array - */ - protected function limit_page() { - - if (IS_POST) { - $page = $_GET['page'] = 1; - $total = 0; - } else { - $page = max(1, (int)$this->input->get('page')); - $total = (int)$this->input->get('total'); - } - - $param = $this->input->get(NULL); - unset($param['s'],$param['c'],$param['m'],$param['d'],$param['page']); - - if (!$total) { - $select = $this->mydb->select('count(*) as total'); - $param = $this->_where($select, $param); - if ($this->mygroup) { - $total = count($select->get($this->mytable)->result_array()); - } else { - $data = $select->get($this->mytable)->row_array(); - $total = (int)$data['total']; - } - unset($select); - if (!$total) { - return array(array(), $total, $param); - } - } - - $select = $this->mydb->limit(SITE_ADMIN_PAGESIZE, SITE_ADMIN_PAGESIZE * ($page - 1)); - $this->mygroup && $select->select('*,count('.$this->myid.') as count'); - $param = $this->_where($select, $param); - $_order = isset($_GET['order']) && strpos($_GET['order'], 'undefined') !== 0 ? $this->input->get('order') : $this->tfield.' DESC'; - $data = $select->order_by($_order)->get($this->mytable)->result_array(); - - return array($data, $total, $param); - } - - /** - * 管理 - */ - protected function _index($uri = '') { - // 数据库中分页查询 - list($data, $total, $param) = $this->limit_page(); - $param['total'] = $total; - $this->template->assign(array( - 'list' => $data, - 'total' => $total, - 'pages' => $this->get_pagination(dr_url(APP_DIR.'/'.$this->router->class.'/'.$this->router->method, $param), $total), - 'param' => $param, - )); - // 存储当前页URL - $uri && $this->_set_back_url($uri, $param); - return $data; - } - - /** - * 修改 - */ - protected function _edit() { - - $id = (int)$this->input->get($this->myid); - $data = $this->_get_data($id); - !$data && $this->admin_msg(fc_lang('当前数据不存在')); - - if (IS_POST) { - $post = $this->validate_filter($this->myfield, $data); - if (isset($post['error'])) { - $error = $post; - $data = $this->input->post('data', TRUE); - } else { - $this->_update_data($id, $post[1], $data); - // 操作成功处理附件 - $this->attachment_handle($this->uid, $this->db->dbprefix($this->mytable).'-'.$id, $this->myfield, $data); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url(APP_DIR.'/'.$this->router->class.'/index', $this->post_param), 1); - } - } - - $this->template->assign(array( - 'data' => $data, - 'error' => $error, - 'myfield' => $this->field_input($this->myfield, $data, TRUE) - )); - - return $data; - } - - /** - * 添加 - */ - protected function _add() { - - $data = array(); - - if (IS_POST) { - $post = $this->validate_filter($this->myfield); - if (isset($post['error'])) { - $error = $post; - $data = $this->input->post('data', TRUE); - } else { - $id = $this->_insert_data($post[1]); - if (!$id) { - $this->admin_msg('入库失败'); - } - // 操作成功处理附件 - $this->attachment_handle($this->uid, $this->db->dbprefix($this->mytable).'-'.$id, $this->myfield, $post); - $this->admin_msg(fc_lang('操作成功,正在刷新...'), dr_url(APP_DIR.'/'.$this->router->class.'/index', $this->post_param), 1); - } - } - - $this->template->assign(array( - 'data' => $data, - 'error' => $error, - 'myfield' => $this->field_input($this->myfield, $data, TRUE) - )); - - return $data; - } - - // 重写:获取数据 - public function _get_data($id) { - return $this->mydb->where($this->myid, intval($id))->get($this->mytable)->row_array(); - } - - // 重写:更新数据 - public function _update_data($id, $data, $_data) { - $this->mydb->where($this->myid, $id)->update($this->mytable, $data); - } - - // 重写:插入数据 - public function _insert_data($data) { - $this->mydb->insert($this->mytable, $data); - return $this->mydb->insert_id(); - } - -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/cli/error_404.php b/finecms/finecms/dayrui/errors/cli/error_404.php deleted file mode 100644 index 68ffdb3..0000000 --- a/finecms/finecms/dayrui/errors/cli/error_404.php +++ /dev/null @@ -1,33 +0,0 @@ - - -An uncaught Exception was encountered - -Type: -Message: -Filename: getFile(), "\n"; ?> -Line Number: getLine(); ?> - - - - Backtrace: - getTrace() as $error): ?> - - File: - Line: - Function: - - - - diff --git a/finecms/finecms/dayrui/errors/cli/error_general.php b/finecms/finecms/dayrui/errors/cli/error_general.php deleted file mode 100644 index 1e5ffe5..0000000 --- a/finecms/finecms/dayrui/errors/cli/error_general.php +++ /dev/null @@ -1,33 +0,0 @@ - - -A PHP Error was encountered - -Severity: -Message: -Filename: -Line Number: - - - -Backtrace: - - - - File: - Line: - Function: - - - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/cli/index.html b/finecms/finecms/dayrui/errors/cli/index.html deleted file mode 100644 index c942a79..0000000 --- a/finecms/finecms/dayrui/errors/cli/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/html/error_404.php b/finecms/finecms/dayrui/errors/html/error_404.php deleted file mode 100644 index f5a3956..0000000 --- a/finecms/finecms/dayrui/errors/html/error_404.php +++ /dev/null @@ -1,66 +0,0 @@ - - - - -页面未找到 - - - - -
    -

    - -
    - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/html/error_db.php b/finecms/finecms/dayrui/errors/html/error_db.php deleted file mode 100644 index e788070..0000000 --- a/finecms/finecms/dayrui/errors/html/error_db.php +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -数据库错误 - - - - -
    -

    - -
    - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/html/error_exception.php b/finecms/finecms/dayrui/errors/html/error_exception.php deleted file mode 100644 index 1deb1da..0000000 --- a/finecms/finecms/dayrui/errors/html/error_exception.php +++ /dev/null @@ -1,40 +0,0 @@ - - -
    - -

    An uncaught Exception was encountered

    - -

    Type:

    -

    Message:

    -

    Filename: getFile(); ?>

    -

    Line Number: getLine(); ?>

    - - - -

    Backtrace:

    - getTrace() as $error): ?> - - - -

    - File:
    - Line:
    - Function: -

    - - - - - - -
    - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/html/error_general.php b/finecms/finecms/dayrui/errors/html/error_general.php deleted file mode 100644 index ce38c54..0000000 --- a/finecms/finecms/dayrui/errors/html/error_general.php +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -错误提示 - - - - -
    -

    - -
    - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/html/error_php.php b/finecms/finecms/dayrui/errors/html/error_php.php deleted file mode 100644 index 6b53c42..0000000 --- a/finecms/finecms/dayrui/errors/html/error_php.php +++ /dev/null @@ -1,37 +0,0 @@ - - -
    - -

    A PHP Error was encountered

    - -

    Severity:

    -

    Message:

    -

    Filename:

    -

    Line Number:

    - - - -

    Backtrace:

    - - - - -

    - File:
    - Line:
    - Function: -

    - - - -

    - - - -
    - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/errors/html/index.html b/finecms/finecms/dayrui/errors/html/index.html deleted file mode 100644 index c942a79..0000000 --- a/finecms/finecms/dayrui/errors/html/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/helpers/durl_helper.php b/finecms/finecms/dayrui/helpers/durl_helper.php deleted file mode 100644 index ffada47..0000000 --- a/finecms/finecms/dayrui/helpers/durl_helper.php +++ /dev/null @@ -1,829 +0,0 @@ - 1 && $ci->site_info[$siteid]['SITE_PC'] ? (IS_PC ? $ci->site_info[$siteid]['SITE_PC'] : $ci->site_info[$siteid]['SITE_MURL']) : (IS_PC ? SITE_PC : SITE_M_URL); - - return strpos($url, 'http') === 0 ? $url : $domain.ltrim($url, '/'); -} - -// 地址前缀部分 -function dr_uri_prefix($type, $mod, $cat = array(), $fid = 0, $site = SITE_ID) { - - // 默认主网站的地址 - $site_url = '/'; - if ($type == 'php') { - return $site_url.'index.php?'; - } elseif ($type == 'cat_show_ext_php') { - return $site_url.'index.php?'; - } elseif ($type == 'rewrite') { - return $site_url; - } -} - -/** - * 格式化复选框\单选框\选项值 字符串转换为数组 - */ -function dr_format_option_array($value) { - - $data = array(); - - if (!$value) { - return $data; - } - - $options = explode(PHP_EOL, str_replace(array(chr(13), chr(10)), PHP_EOL, $value)); - - foreach ($options as $t) { - if (strlen($t)) { - $n = $v = ''; - if (strpos($t, '|') !== FALSE) { - list($n, $v) = explode('|', $t); - $v = is_null($v) || !strlen($v) ? '' : trim($v); - } else { - $v = $n = trim($t); - } - $data[$v] = $n; - } - } - - return $data; -} - -/** - * 伪静态代码处理 - * - * @param array $params 参数数组 - * @return string - */ -function dr_rewrite_encode($params, $join = '-', $field = array()) { - - if (!$params) { - return ''; - } - - !$join && $join = '-'; - $field = array_flip(dr_format_option_array($field)); - $url = ''; - foreach ($params as $i => $t) { - $i = isset($field[$i]) && $field[$i] ? $field[$i] : $i; - $url.= $join.$i.$join.$t; - } - - return trim($url, $join); -} - -/** - * 伪静态代码转换为数组 - * - * @param string $params 参数字符串 - * @return array - */ -function dr_rewrite_decode($params, $join = '-', $field = array()) { - - if (!$params) { - return NULL; - } - - $field = dr_format_option_array($field); - !$join && $join = '-'; - - $i = 0; - $array = explode($join, $params); - - $return = array(); - foreach ($array as $k => $t) { - $name = str_replace('$', '_', $t); - $name = isset($field[$name]) && $field[$name] ? $field[$name] : $name; - $i%2 == 0 && $return[$name] = isset($array[$k+1]) ? $array[$k+1] : ''; - $i ++; - } - - return $return; -} - - - - -/** - * 搜索url组合 - * - * @param array $params 搜索参数数组 - * @param string $name 当前参数名称 - * @param string $value 当前参数值 - * @param string $urlrule 搜索url规则 - * @return string - */ -function dr_search_url($params = NULL, $name = NULL, $value = NULL, $urlrule = NULL) { - - $params = is_array($params) ? $params : array(); - - if ($name) { - if (strlen($value)) { - $params[$name] = $value; - } else { - unset($params[$name]); - } - } - if (is_array($params)) { - foreach ($params as $i => $t) { - if (strlen($t) == 0) { - unset($params[$i]); - } - } - } - - // PC端 - $ci = &get_instance(); - $rule = $ci->get_cache('urlrule', (int)SITE_REWRITE, 'value'); - if ($rule && $rule['share_search_page']) { - //$data['param'] = dr_rewrite_encode($params); - $data['param'] = dr_rewrite_encode($params); - $url = ltrim($rule['share_search_page'], '/'); - // 兼容php5.5 - if (version_compare(PHP_VERSION, '5.5.0') >= 0) { - $rep = new php5replace($data); - $url = preg_replace_callback("#{([a-z_0-9]+)}#Ui", array($rep, 'php55_replace_data'), $url); - $url = preg_replace_callback('#{([a-z_0-9]+)\((.*)\)}#Ui', array($rep, 'php55_replace_function'), $url); - unset($rep); - } else { - $url = preg_replace('#{([a-z_0-9]+)}#Uei', "\$data[\\1]", $url); - $url = preg_replace('#{([a-z_0-9]+)\((.*)\)}#Uie', "\\1(dr_safe_replace('\\2'))", $url); - } - - return dr_uri_prefix('rewrite', array(), array(), 0).$url; - } else { - - return dr_uri_prefix('php', array(), array(), 0).trim('c=search&'.@http_build_query($params), '&'); - } - -} - -/** - * tags的url - * - * @param string 关键字 - * @return string 地址 - */ -function dr_tags_url($name, $page = 0) { - - if (!$name) { - return ''; - } - - // PC端 - $ci = &get_instance(); - $rule = $ci->get_cache('urlrule', (int)SITE_REWRITE, 'value'); - if ($rule && $rule['tags']) { - $data['tag'] = $name; - $url = ltrim($rule['tags'], '/'); - $rep = new \php5replace($data); - $url = preg_replace_callback("#{([a-z_0-9]+)}#Ui", array($rep, 'php55_replace_data'), $url); - $url = preg_replace_callback('#{([a-z_0-9]+)\((.*)\)}#Ui', array($rep, 'php55_replace_function'), $url); - unset($rep); - return dr_uri_prefix('rewrite', array(), array(), 0).$url; - } else { - return dr_uri_prefix('php', array(), array(), 0).'c=tag&name='.$name.($page ? '&page='.$page : ''); - } -} - - - -/** - * 模型内容分页链接 - * - * @param string $urlrule - * @param intval $page - * @return string 地址 - */ -function dr_content_page_url($urlrule, $page) { - return str_replace('{page}', $page, $urlrule); -} - -/** - * 联动菜单包屑导航 - * - * @param string $code 联动菜单代码 - * @param intval $id id - * @param string $symbol 间隔符号 - * @param string $url url地址格式,必须存在{linkage},否则返回不带url的字符串 - * @return string - */ -function dr_linkagepos($code, $id, $symbol = ' > ', $url = NULL) { - - if (!$code || !$id) { - return NULL; - } - - $ci = &get_instance(); - $url = $url ? urldecode($url) : NULL; - $link = $ci->get_cache('linkage-'.SITE_ID.'-'.$code); - $cids = $ci->get_cache('linkage-'.SITE_ID.'-'.$code.'-id'); - if (is_numeric($id)) { - // id 查询 - $id = $cids[$id]; - $data = $link[$id]; - } else { - // 别名查询 - $data = $link[$id]; - } - - $name = array(); - $pids = @explode(',', $data['pids']); - - - foreach ($pids as $pid) { - $pid && $name[] = $url ? "{$link[$cids[$pid]]['name']}" : $link[$cids[$pid]]['name']; - } - $name[] = $url ? "{$data['name']}" : $data['name']; - - - return implode($symbol, $name); -} - -/** - * 模型栏目面包屑导航 - * - * @param intval $catid 栏目id - * @param string $symbol 面包屑间隔符号 - * @param string $url 是否显示URL - * @param string $html 格式替换 - * @return string - */ -function dr_catpos($catid, $symbol = ' > ', $url = TRUE, $html= '') { - - if (!$catid) { - return ''; - } - - $html = str_replace(array('[url]', '[name]'), array('{url}', '{name}'), $html); - - $ci = &get_instance(); - $cat = $ci->get_cache('category-'.SITE_ID); - if (!isset($cat[$catid])) { - return ''; - } - - $name = array(); - $array = explode(',', $cat[$catid]['pids']); - foreach ($array as $id) { - if ($id && $cat[$id]) { - $murl = $cat[$id]['url']; - $name[] = $url ? ($html ? str_replace(array('{url}', '{name}'), array($murl, $cat[$id]['name']), $html): "{$cat[$id]['name']}") : $cat[$id]['name']; - } - } - - $murl = $cat[$catid]['url']; - $name[] = $url ? ($html ? str_replace(array('{url}', '{name}'), array($murl, $cat[$catid]['name']), $html): "{$cat[$catid]['name']}") : $cat[$catid]['name']; - - return implode($symbol, $name); -} - -/** - * 模型栏目层次关系 - * - * @param array $mod - * @param array $cat - * @param string $symbol - * @return string - */ -function dr_get_cat_pname($mod, $cat, $symbol = '_') { - - if (!$cat['pids']) { - return $cat['name']; - } - - $ci = &get_instance(); - $name = array(); - $array = explode(',', $cat['pids']); - $category = $ci->get_cache('category-'.SITE_ID); - - foreach ($array as $id) { - $id && $category[$id] && $name[] = $category[$id]['name']; - } - - $name[] = $cat['name']; - krsort($name); - - return implode($symbol, $name); -} - - - - - - -/** - * 模型内容SEO信息 - * - * @param array $mod - * @param array $cat - * @param intval $page - * @return array - */ -function dr_show_seo($data, $page = 1) { - - $seo = array(); - $ci = &get_instance(); - $category = $ci->get_cache('category-'.SITE_ID); - $cat = $category[$data['catid']]; - $data['page'] = $page; - $data['join'] = SITE_SEOJOIN ? SITE_SEOJOIN : '_'; - $data['name'] = $data['catname'] = dr_get_cat_pname(null, $cat, $data['join']); - - $meta_title = $cat['setting']['seo']['show_title'] ? $cat['setting']['seo']['show_title'] : '['.fc_lang('第%s页', '{page}').'{join}]{title}{join}{name}{join}{modulename}{join}{SITE_NAME}'; - - $meta_title = $page > 1 ? str_replace(array('[', ']'), '', $meta_title) : preg_replace('/\[.+\]/U', '', $meta_title); - - // 兼容php5.5 - if (version_compare(PHP_VERSION, '5.5.0') >= 0) { - $rep = new php5replace($data); - $seo['meta_title'] = preg_replace_callback('#{([a-z_0-9]+)}#U', array($rep, 'php55_replace_data'), $meta_title); - $seo['meta_title'] = preg_replace_callback('#{([A-Z_]+)}#U', array($rep, 'php55_replace_var'), $seo['meta_title']); - unset($rep); - } else { - extract($data); - $seo['meta_title'] = preg_replace('#{([a-z_0-9]+)}#Ue', "\$\\1", $meta_title); - $seo['meta_title'] = preg_replace('#{([A-Z_]+)}#Ue', "\\1", $seo['meta_title']); - } - - if (is_array($data['keywords'])) { - foreach ($data['keywords'] as $key => $t) { - $seo['meta_keywords'].= $key.','; - } - $seo['meta_keywords'] = trim($seo['meta_keywords'], ','); - } else { - $seo['meta_keywords'] = $data['keywords']; - } - - $seo['meta_description'] = htmlspecialchars(dr_clearhtml($data['description'])); - - return $seo; -} - -/** - * 模型栏目SEO信息 - * - * @param array $mod - * @param array $cat - * @param intval $page - * @return array - */ -function dr_category_seo($cat, $page = 1) { - - $seo = array(); - $cat['page'] = $page; - $cat['join'] = SITE_SEOJOIN ? SITE_SEOJOIN : '_'; - $cat['name'] = $cat['catname'] = dr_get_cat_pname(null, $cat, $cat['join']); - - $meta_title = $cat['setting']['seo']['list_title'] ? $cat['setting']['seo']['list_title'] : '['.fc_lang('第%s页', '{page}').'{join}]{modulename}{join}{SITE_NAME}'; - - $meta_title = $page > 1 ? str_replace(array('[', ']'), '', $meta_title) : preg_replace('/\[.+\]/U', '', $meta_title); - - - // 兼容php5.5 - if (version_compare(PHP_VERSION, '5.5.0') >= 0) { - $rep = new php5replace($cat); - $seo['meta_title'] = preg_replace_callback('#{([a-z_0-9]+)}#U', array($rep, 'php55_replace_data'), $meta_title); - $seo['meta_title'] = preg_replace_callback('#{([A-Z_]+)}#U', array($rep, 'php55_replace_var'), $seo['meta_title']); - $seo['meta_keywords'] = preg_replace_callback('#{([a-z_0-9]+)}#U', array($rep, 'php55_replace_data'), $cat['setting']['seo']['list_keywords']); - $seo['meta_keywords'] = preg_replace_callback('#{([A-Z_]+)}#U', array($rep, 'php55_replace_var'), $seo['meta_keywords']); - $seo['meta_description'] = preg_replace_callback('#{([a-z_0-9]+)}#U', array($rep, 'php55_replace_data'), $cat['setting']['seo']['list_description']); - $seo['meta_description'] = preg_replace_callback('#{([A-Z_]+)}#U', array($rep, 'php55_replace_var'), $seo['meta_description']); - unset($rep); - } else { - $seo['meta_title'] = preg_replace('#{([a-z_0-9]+)}#Ue', "\$cat[\\1]", $meta_title); - $seo['meta_title'] = preg_replace('#{([A-Z_]+)}#Ue', "\\1", $seo['meta_title']); - $seo['meta_keywords'] = preg_replace('#{([a-z_0-9]+)}#Ue', "\$cat[\\1]", $cat['setting']['seo']['list_keywords']); - $seo['meta_keywords'] = preg_replace('#{([A-Z_]+)}#Ue', "\\1", $seo['meta_keywords']); - $seo['meta_description'] = preg_replace('#{([a-z_0-9]+)}#Ue', "\$cat[\\1]", $cat['setting']['seo']['list_description']); - $seo['meta_description'] = preg_replace('#{([A-Z_]+)}#Ue', "\\1", $seo['meta_description']); - } - - $seo['meta_description'] = htmlspecialchars(dr_clearhtml($seo['meta_description'])); - - return $seo; -} - - -/** - * 模型搜索SEO信息 - * - * @param array $mod - * @param array $param - * @param intval $page - * @return array - */ -function dr_search_seo($mod, $param, $page = 1) { - - $seo = array(); - $seo['meta_keywords'] = ''; - $data['page'] = $page > 1 ? $page : ''; - $data['join'] = SITE_SEOJOIN ? SITE_SEOJOIN : '_'; - $ci = &get_instance(); - $category = $ci->get_cache('category-'.SITE_ID); - $data['catname'] = $param['catid'] ? dr_get_cat_pname(null, $category[$param['catid']], $data['join']) : ''; - $param['mid'] = $mod['name']; - - $data['param'] = ''; - $data['keyword'] = ''; - if ($param['keyword']) { - $data['keyword'] = $param['keyword']; - $seo['meta_keywords'].= $data['keyword'].','; - unset($param['keyword']); - } - $param_value = array(); - if ($param['catid']) { - $param_value = explode(PHP_EOL, dr_get_cat_pname(null, $category[$param['catid']], PHP_EOL)); - unset($param['catid']); - } - if ($param) { - foreach ($param as $name => $value) { - $field = $mod['field'][$name]; - switch ($field['fieldtype']) { - - case 'Radio': - case 'Select': - $opt = dr_format_option_array($field['setting']['option']['options']); - isset($opt[$value]) && $opt[$value] && $param_value[] = $opt[$value]; - break; - - case 'Linkage': - $param_value[] = dr_linkagepos($field['setting']['option']['linkage'], $value, ''); - break; - - default: - $value && $param_value[] = $value; - break; - - } - } - } - if ($param_value) { - $data['param'] = implode($data['join'], $param_value); - $seo['meta_keywords'].= implode(',', $param_value).','; - } - - $meta_title = $mod['site'][SITE_ID]['search_title'] ? $mod['site'][SITE_ID]['search_title'] : '['.fc_lang('第%s页', '{page}').'{join}][{keyword}{join}][{param}{join}]{modulename}{join}{SITE_NAME}'; - - if (preg_match_all('/\[.*\{(.+)\}.*\]/U', $meta_title, $m)) { - $new = ''; - $replace = ''; - foreach ($m[1] as $i => $field) { - $replace.= $m[0][$i]; - if (isset($data[$field]) && strlen($data[$field])) { - $new.= str_replace(array('[', ']'), '', $m[0][$i]); - } - } - $meta_title = str_replace($replace, $new, $meta_title); - } - - // 兼容php5.5 - if (version_compare(PHP_VERSION, '5.5.0') >= 0) { - $rep = new php5replace($data); - $seo['meta_title'] = preg_replace_callback('#{([a-z_0-9]+)}#U', array($rep, 'php55_replace_data'), $meta_title); - $seo['meta_title'] = preg_replace_callback('#{([A-Z_]+)}#U', array($rep, 'php55_replace_var'), $seo['meta_title']); - unset($rep); - } else { - $seo['meta_title'] = preg_replace('#{([a-z_0-9]+)}#Ue', "\$data[\\1]", $meta_title); - $seo['meta_title'] = preg_replace('#{([A-Z_]+)}#Ue', "\\1", $seo['meta_title']); - } - - $seo['meta_title'] = str_replace($data['join'].$data['join'], $data['join'], $seo['meta_title']); - - $seo['meta_keywords'].= $mod['site'][SITE_ID]['meta_keywords']; - $seo['meta_keywords'] = trim($seo['meta_keywords'], ','); - $seo['meta_description'] = $mod['site'][SITE_ID]['search_description']; - - return $seo; -} - -/** - * 模型内容URL地址 - * - * @param array $mod - * @param array $data - * @param mod $page - * @return string - */ -function dr_show_url($data, $page = NULL) { - - - - - - $page && $data['page'] = $page = is_numeric($page) ? max((int)$page, 1) : $page; - - $ci = &get_instance(); - $cat = $ci->get_cache('category-'.SITE_ID, $data['catid']); - $rule = $ci->get_cache('urlrule', (int)$cat['setting']['urlrule'], 'value'); - if ($rule && $rule['show']) { - // URL模式为自定义,且已经设置规则 - $cat['pdirname'].= $cat['dirname']; - $data['dirname'] = $cat['dirname']; - $inputtime = isset($data['_inputtime']) ? $data['_inputtime'] : $data['inputtime']; - $data['y'] = date('Y', $inputtime); - $data['m'] = date('m', $inputtime); - $data['d'] = date('d', $inputtime); - $data['pdirname'] = str_replace('/', $rule['catjoin'], $cat['pdirname']); - $url = ltrim($page ? $rule['show_page'] : $rule['show'], '/'); - // 兼容php5.5 - if (version_compare(PHP_VERSION, '5.5.0') >= 0) { - $rep = new php5replace($data); - $url = preg_replace_callback("#{([a-z_0-9]+)}#Ui", array($rep, 'php55_replace_data'), $url); - $url = preg_replace_callback('#{([a-z_0-9]+)\((.*)\)}#Ui', array($rep, 'php55_replace_function'), $url); - unset($rep); - } else { - $url = preg_replace('#{([a-z_0-9]+)}#Uei', "\$data[\\1]", $url); - $url = preg_replace('#{([a-z_0-9]+)\((.*)\)}#Uie', "\\1(dr_safe_replace('\\2'))", $url); - } - return dr_uri_prefix('rewrite', null, $cat, 0).$url; - } - - return dr_uri_prefix('cat_show_ext_php', null, $cat, 0).'c=show&id='.$data['id'].($page ? '&page='.$page : ''); -} - - - -/** - * 模型栏目URL地址 - * - * @return string - */ -function dr_category_url($data, $siteid, $page = 0) { - - if (!$data) { - return '/'; - } - - $page && $data['page'] = $page = is_numeric($page) ? max((int)$page, 1) : $page; - - $ci = &get_instance(); - $rule = isset($data['setting']['urlrule']) ? $ci->get_cache('urlrule', (int)$data['setting']['urlrule'], 'value') : 0; - - if ($rule && $rule['list']) { - // URL模式为自定义,且已经设置规则 - $data['pdirname'].= $data['dirname']; - $data['pdirname'] = str_replace('/', $rule['catjoin'], $data['pdirname']); - $url = ltrim($page ? $rule['list_page'] : $rule['list'], '/'); - // 兼容php5.5 - if (version_compare(PHP_VERSION, '5.5.0') >= 0) { - $rep = new php5replace($data); - $url = preg_replace_callback("#{([a-z_0-9]+)}#Ui", array($rep, 'php55_replace_data'), $url); - $url = preg_replace_callback('#{([a-z_0-9]+)\((.*)\)}#Ui', array($rep, 'php55_replace_function'), $url); - unset($rep); - } else { - $url = preg_replace('#{([a-z_0-9]+)}#Uei', "\$data[\\1]", $url); - $url = preg_replace('#{([a-z_0-9]+)\((.*)\)}#Uie', "\\1(dr_safe_replace('\\2'))", $url); - } - - return dr_uri_prefix('rewrite', null, $data, 0, $siteid) . $url; - } - - - return dr_uri_prefix('cat_show_ext_php', null, $data, 0, $siteid) . 'c=category&id='.(isset($data['id']) ? $data['id'] : 0).($page ? '&page='.$page : ''); -} - - -// 模型URL -function dr_module_url($mod, $sid) { - - // 绑定域名的情况下 - if ($mod['site'][$sid]['domain']) { - return dr_http_prefix($mod['site'][$sid]['domain'].'/'); - } - - $ci = &get_instance(); - - // 自定义规则的情况下 - $rule = $ci->get_cache('urlrule', (int)$mod['site'][$sid]['urlrule'], 'value'); - $domain = isset($ci->site_info[$sid]['SITE_PC']) && $ci->site_info[$sid]['SITE_PC'] ? $ci->site_info[$sid]['SITE_PC'] : SITE_URL; - - if ($rule['module']) { - return $domain.str_replace('{modname}', $mod['dirname'], $rule['module']); - } - - return $domain.'index.php?s='.$mod['dirname']; -} - - -/** - * url函数 - * - * @param string $url URL规则,如home/index - * @param array $query 相关参数 - * @return string 项目入口文件.php?参数 - */ -function dr_url($url, $query = array(), $self = SELF) { - - if (!$url) { - return $self; - } - - - $url = strpos($url, 'admin') === 0 ? substr($url, 5) : $url; - $url = trim($url, '/'); - - // 判断是否后台首页 - if ($self != 'index.php' && ($url == 'home/index' || $url == 'home/home')) { - return SELF; - } - - $url = explode('/', $url); - $uri = array(); - - switch (count($url)) { - case 1: - $uri['c'] = 'home'; - $uri['m'] = $url[0]; - break; - case 2: - $uri['c'] = $url[0]; - $uri['m'] = $url[1]; - break; - case 3: - $uri['s'] = $url[0]; - // 非后台且非会员中心的模型地址 - - $uri['c'] = $url[1]; - $uri['m'] = $url[2]; - break; - } - - $query && $uri = @array_merge($uri, $query); - - return $self.'?'.@http_build_query($uri); -} - -/** - * url函数 - * - * @param string $url URL规则,如home/index - * @param array $query 相关参数 - * @return string 项目入口文件.php?参数 - */ -function dr_qxurl($url, $query = array(), $self = SELF) { - - if (!$url) { - return $self; - } - - - $url = strpos($url, 'admin') === 0 ? substr($url, 5) : $url; - $url = trim($url, '/'); - - // 判断是否后台首页 - if ($self != 'index.php' && ($url == 'home/index' || $url == 'home/home')) { - return SELF; - } - - $url = explode('/', $url); - $uri = array(); - - switch (count($url)) { - case 1: - $uri['c'] = 'home'; - $uri['m'] = $url[0]; - break; - case 2: - $uri['c'] = $url[0]; - $uri['m'] = $url[1]; - break; - default: - $uri['c'] = $url[0]; - // 非后台且非会员中心的模型地址 - - $uri['m'] = $url[1]; - $uri[$url[2]] = $url[3]; - break; - } - - $query && $uri = @array_merge($uri, $query); - - return $self.'?'.@http_build_query($uri); -} - - -/** - * 会员url函数 - * - * @param string $url URL规则,如home/index - * @param array $query 相关参数 - * @return string 地址 - */ -function dr_member_url($url = '', $query = array(), $self = 'index.php') { - - if (!$url || $url == 'home/index' || $url == '/') { - return MEMBER_URL; - } - - - $url = strpos($url, 'admin') === 0 ? substr($url, 5) : $url; - $url = trim($url, '/'); - $url = explode('/', $url); - $uri = array('s' => 'member'); - - switch (count($url)) { - case 1: - $uri['c'] = 'home'; - $uri['m'] = $url[0]; - break; - case 2: - $uri['c'] = $url[0]; - $uri['m'] = $url[1]; - break; - case 3: - $uri['s'] = $url[0]; - - $uri['c'] = $url[1]; - $uri['m'] = $url[2]; - break; - } - - $query && $uri = @array_merge($uri, $query); - - return SITE_URL.$self.'?'.@http_build_query($uri); -} - -/** - * 当前URL - */ -function dr_now_url() { - - $pageURL = 'http'; - isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' && $pageURL.= 's'; - - $pageURL.= '://'; - if (strpos($_SERVER['HTTP_HOST'], ':') !== FALSE) { - $url = explode(':', $_SERVER['HTTP_HOST']); - $url[0] ? $pageURL.= $_SERVER['HTTP_HOST'] : $pageURL.= $url[0]; - } else { - $pageURL.= $_SERVER['HTTP_HOST']; - } - - $pageURL.= $_SERVER['REQUEST_URI'] ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']; - - $ci = &get_instance(); - return $ci->security->xss_clean($pageURL); -} - -/** - * dialog弹出框窗口的URL - * - * @param string $url 地址 - * @param string $func 指向函数,如add,edit等 - * @param string $cache 更新缓存地址 - * @return string - */ -function dr_dialog_url($url, $func) { - return "javascript:dr_dialog('{$url}', '{$func}');"; -} - -// php 5.5 以上版本的正则替换方法 -class php5replace { - - private $data; - - public function __construct($data) { - $this->data = $data; - } - - // 替换常量值 for php5.5 - public function php55_replace_var($value) { - $v = ''; - @eval('$v = '.$value[1].';'); - return $v; - } - - // 替换数组变量值 for php5.5 - public function php55_replace_data($value) { - return $this->data[$value[1]]; - } - - // 替换函数值 for php5.5 - public function php55_replace_function($value) { - - if (function_exists($value[1])) { - if ($value[2] == '$data') { - $param = $this->data; - } else { - $param = $value[2]; - } - return call_user_func_array($value[1], is_array($param) ? $param : @explode(',', $param)); - } - - return $value[0]; - } - -} diff --git a/finecms/finecms/dayrui/helpers/function_helper.php b/finecms/finecms/dayrui/helpers/function_helper.php deleted file mode 100644 index c108f7e..0000000 --- a/finecms/finecms/dayrui/helpers/function_helper.php +++ /dev/null @@ -1,1972 +0,0 @@ -lang->line($string); - $string = $lang ? $lang : $string; - - // 替换 - $string = get_instance()->replace_lang($string); - - $string = $param ? vsprintf($string, $param) : $string; - - - return $string; -} - - -/** - * 多语言输出 - * - * @param 多个参数 - * @return string|NULL - */ -function dr_lang() { - - $param = func_get_args(); - if (empty($param)) { - return NULL; - } - - if (count($param) == 1) { - $string = lang($param[0]); - return $string; - } - - // 取第一个作为语言名称 - $string = $param[0]; - unset($param[0]); - - - return $string; -} - -/** - * 网站风格目录 - * - * @return string|NULL - */ -function dr_get_theme() { - - if (!function_exists('dr_dir_map')) { - return array('default'); - } - - return array_diff(dr_dir_map(WEBPATH.'statics/', 1), array('avatar', 'admin', 'comment', 'emotions', 'js', 'oauth', 'watermark', 'space')); - -} - - -/** - * 获取6位数字随机验证码 - */ -function dr_randcode() { - return rand(100000, 999999); -} - - -/** - * 删除目录及目录下面的所有文件 - * - * @param string $dir 路径 - * @return bool 如果成功则返回 TRUE,失败则返回 FALSE - */ -function dr_dir_delete($dir) { - - $dir = str_replace('\\', '/', $dir); - if (substr($dir, -1) != '/') { - $dir = $dir . '/'; - } - if (!is_dir($dir)) { - return FALSE; - } - - $list = glob($dir . '*'); - foreach ($list as $v) { - is_dir($v) ? dr_dir_delete($v) : @unlink($v); - } - - return @rmdir($dir); -} - -/** - * discuz加密/解密 - */ -function dr_authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { - - if (!$string) { - return ''; - } - - $ckey_length = 4; - - $key = md5($key ? $key : SYS_KEY); - $keya = md5(substr($key, 0, 16)); - $keyb = md5(substr($key, 16, 16)); - $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : ''; - - $cryptkey = $keya . md5($keya . $keyc); - $key_length = strlen($cryptkey); - - $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string; - $string_length = strlen($string); - - $result = ''; - $box = range(0, 255); - - $rndkey = array(); - for ($i = 0; $i <= 255; $i++) { - $rndkey[$i] = ord($cryptkey[$i % $key_length]); - } - - for ($j = $i = 0; $i < 256; $i++) { - $j = ($j + $box[$i] + $rndkey[$i]) % 256; - $tmp = $box[$i]; - $box[$i] = $box[$j]; - $box[$j] = $tmp; - } - - for ($a = $j = $i = 0; $i < $string_length; $i++) { - $a = ($a + 1) % 256; - $j = ($j + $box[$a]) % 256; - $tmp = $box[$a]; - $box[$a] = $box[$j]; - $box[$j] = $tmp; - $result.= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); - } - - if ($operation == 'DECODE') { - if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) { - return substr($result, 26); - } else { - return ''; - } - } else { - return $keyc . str_replace('=', '', base64_encode($result)); - } -} - -function dr_array2array($a1, $a2) { - - if (!$a1 || !$a2) { - return array(); - } elseif ($a1 && !$a2) { - return $a1; - } elseif (!$a1 && $a2) { - return $a2; - } - - return array_merge($a1, $a2); - -} - - -/** - * 两数组覆盖合并 - */ -function dr_array22array($a1, $a2) { - - $a = array(); - $a = $a1 ? $a1 : $a; - if ($a2) { - foreach ($a2 as $i => $t) { - $a[$i] = $t; - } - } - - return $a; -} - - - -/** - * 调用会员详细信息(自定义字段需要手动格式化) - * - * @param intval $uid 会员uid - * @param intval $cache 缓存时间 - * @return string - */ -function dr_member_info($uid, $cache = -1) { - - $ci = &get_instance(); - $data = $ci->get_cache_data('member-info-'.$uid); - if (!$data) { - $data = $ci->member_model->get_member($uid); - $ci->set_cache_data('member-info-'.$uid, $data, $cache > 0 ? $cache : SYS_CACHE_MEMBER); - } - - return $data; -} - - - -/** - * 验证码图片获取 - */ -function dr_code($width, $height, $url = '') { - $url = '/index.php?c=api&m=captcha&width='.$width.'&height='.$height; - return ''; -} - -/** - * 排序操作 - */ -function ns_sorting($name) { - - $value = $_GET['order'] ? $_GET['order'] : ''; - if (!$value) { - return 'sorting'; - } - - if (strpos($value, $name) === 0 && strpos($value, 'asc') !== FALSE) { - return 'sorting_asc'; - } elseif (strpos($value, $name) === 0 && strpos($value, 'desc') !== FALSE) { - return 'sorting_desc'; - } - - return 'sorting'; -} - -/** - * 移除order字符串 - */ -function dr_member_order($url) { - - $data = @explode('&', $url); - if ($data) { - foreach ($data as $t) { - if (strpos($t, 'order=') === 0) { - $url = str_replace('&' . $t, '', $url); - } elseif (strpos($t, 'action=') === 0) { - $url = str_replace('&' . $t, '', $url); - } - } - } - - return $url; -} - -/** - * 统计图表调用 - */ -function dr_chart($file, $width, $height) { - - -} - -/** - * 百度地图调用 - */ -function dr_baidu_map($value, $zoom = 5, $width = 600, $height = 400) { - - if (!$value) { - return NULL; - } - - $id = 'dr_map_'.rand(0, 99); - $width = $width ? $width : '100%'; - list($lngX, $latY) = explode(',', $value); - - return ' -
    - '; -} - -/** - * 任意字段的选项值(用于options参数的字段,如复选框、下拉选择框、单选按钮) - * - * @param intval $id - * @return array - */ -function dr_field_options_id($id, $name = '') { - - $id = (int)$id; - if (!$id) { - return NULL; - } - - $ci = &get_instance(); - $data = $ci->get_cache_data('field-info-'.$id); - if (!$data) { - $data = $ci->db->where('id', $id)->get('field')->row_array(); - if (!$data) { - return NULL; - } - $data['setting'] = dr_string2array($data['setting']); - $option = $data['setting']['option']['options']; - if (!$option) { - return NULL; - } - $data = explode( - PHP_EOL, - str_replace( - array(chr(13), chr(10)), - PHP_EOL, - $option - ) - ); - $return = array(); - foreach ($data as $t) { - if ($t) { - if (strpos($t, '|') !== FALSE) { - list($n, $v) = explode('|', $t); - $v = is_null($v) || !strlen($v) ? '' : trim($v); - } else { - $v = $n = trim($t); - } - $return[$v] = trim($n); - } - } - $ci->set_cache_data('field-info-'.$id, $return, 10000); - return $return; - } - - return $name && isset($data[$name]) ? $data[$name] : $data; -} - -/** - * 模型字段的选项值(用于options参数的字段,如复选框、下拉选择框、单选按钮) - * - * @param string $name - * @param intval $catid - * @param string $dirname - * @return array - */ -function dr_field_options($name, $catid = 0, $dirname = MOD_DIR) { - - if (!$name) { - return NULL; - } - - $module = get_module($dirname, SITE_ID); - if (!$module) { - return NULL; - } - - $field = $catid && isset($module['category'][$catid]['field'][$name]) ? $module['category'][$catid]['field'][$name] : $module['field'][$name]; - if (!$field) { - return NULL; - } - - $option = $field['setting']['option']['options']; - if (!$option) { - return NULL; - } - - $data = explode( - PHP_EOL, - str_replace( - array(chr(13), chr(10)), - PHP_EOL, - $option - ) - ); - $return = array(); - - foreach ($data as $t) { - if ($t) { - if (strpos($t, '|') !== FALSE) { - list($n, $v) = explode('|', $t); - $v = is_null($v) || !strlen($v) ? '' : trim($v); - } else { - $v = $n = trim($t); - } - $return[$v] = trim($n); - } - } - - return $return; -} - -/** - * 资料块内容 - * - * @param intval $id - * @return array - */ -function dr_block($id, $type = 0, $site = 0) { - $ci = &get_instance(); - $site = $site ? $site : SITE_ID; - return $ci->get_cache('block-'.$site, $id, $type); -} - -/** - * 联动菜单调用 - * - * @param string $code 菜单代码 - * @param intval $id 菜单id - * @param intval $level 调用级别,1表示顶级,2表示第二级,等等 - * @param string $name 菜单名称,如果有显示它的值,否则返回数组 - * @return array - */ -function dr_linkage($code, $id, $level = 0, $name = '') { - - if (!$id) { - return false; - } - - $ci = &get_instance(); - $link = $ci->get_cache('linkage-'.SITE_ID.'-'.$code); - $cids = $ci->get_cache('linkage-'.SITE_ID.'-'.$code.'-id'); - if (is_numeric($id)) { - // id 查询 - $id = $cids[$id]; - $data = $link[$id]; - } else { - // 别名查询 - $data = $link[$id]; - } - $pids = @explode(',', $data['pids']); - if ($level == 0) { - return $name ? $data[$name] : $data; - } - - if (!$pids) { - return $name ? $data[$name] : $data; - } - - $i = 1; - foreach ($pids as $pid) { - if ($pid) { - $pid = $cids[$pid]; // 把id转化成cname - if ($i == $level) { - return $name ? $link[$pid][$name] : $link[$pid]; - } - $i++; - } - } - - return $name ? $data[$name] : $data; -} - -/** - * 会员头像 - * - * @param intval $uid - * @param string $size - * @return string - */ -function dr_avatar($uid, $size = '45') { - - if ($uid) { - if (defined('UCSSO_API')) { - return ucsso_get_avatar($uid); - } - // 判断Ucenter公共头像 - $size = $size > 100 ? 180 : $size; - foreach (array('png', 'jpg', 'gif', 'jpeg') as $ext) { - if (is_file(SYS_UPLOAD_PATH.'/member/'.$uid.'/'.$size.'x'.$size.'.'.$ext)) { - return SYS_ATTACHMENT_URL.'member/'.$uid.'/'.$size.'x'.$size.'.'.$ext; - } - } - } - - return $size == 45 ? THEME_PATH.'admin/images/avatar_45.png' : THEME_PATH.'admin/images/avatar_90.png'; -} - - -/** - * 模型内容阅读量显示js - * - * @param intval $id - * @return string - */ -function dr_show_hits($id) { - return "0"; -} - - -/** - * 调用远程数据 - * - * @param string $url - * @return string - */ -function dr_catcher_data($url) { - - // fopen模式 - if (ini_get('allow_url_fopen')) { - $data = @file_get_contents($url); - if ($data !== FALSE) { - return $data; - } - } - - // curl模式 - if (function_exists('curl_init') && function_exists('curl_exec')) { - $ch = curl_init($url); - $data = ''; - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $data = curl_exec($ch); - curl_close($ch); - return $data; - } - - return NULL; -} - -/** - * 附件信息 - * - * @param intval $id - * @return array - */ -function get_attachment($id) { - - if (!$id) { - return NULL; - } - - $ci = &get_instance(); - $info = $ci->get_cache_data("attachment-{$id}"); - if ($info) { - // 附件缓存 - return $info; - } - - $data = $ci->db->where('id', (int)$id)->get('attachment')->row_array(); - if (!$data) { - return NULL; - } - - $info = $ci->db->where('id', (int)$id)->get('attachment_'.(int)$data['tableid'])->row_array(); - if (!$info) { - return NULL; - } - - // 合并变量 - $info = $data + $info; - $info['_attachment'] = trim($info['attachment'], '/'); - - // 远程图片 - $url = $info['remote'] ? $ci->get_cache('attachment', $data['siteid'], 'data', $info['remote'], 'url') : ''; - $info['attachment'] = $url ? $url.'/'.$info['_attachment'] : dr_ck_attach($info['_attachment']); - - - // 附件属性信息 - $attachinfo = dr_string2array($info['attachinfo']); - - // 验证图片是否具有高宽属性 - if (in_array($info['fileext'], array('jpg', 'gif', 'png')) - && (!isset($attachinfo['width']) || !$attachinfo['width'])) { - list($attachinfo['width'], $attachinfo['height']) = @getimagesize(dr_file($info['attachment'])); - // 更新到数据表 - } - unset($info['attachinfo']); - - $info = $attachinfo ? $info + $attachinfo : $info; - - $ci->set_cache_data("attachment-{$id}", $info, SYS_CACHE_ATTACH); // 保存附件缓存 - - return $info; -} - -function dr_ck_attach($file) { - - if (!SYS_UPLOAD_DIR) { - return $file; - } elseif (strpos($file, SYS_UPLOAD_DIR) === 0) { - return trim(str_replace(SYS_UPLOAD_DIR, '', $file), '/'); - } elseif (strpos($file, 'member/uploadfile/') === 0) { - return trim(str_replace('member/uploadfile/', '', $file), '/'); - } else { - return $file; - } -} - - -/** - * 调用缩略图函数 - */ -function dr_image($id, $size = 0) { - - if (!$id) { - return THEME_PATH.'admin/images/nopic.gif'; - } - - $info = get_attachment($id); - if (!$info) { - return THEME_PATH.'admin/images/nopic.gif'; - } - - // 远程图片 - if (isset($info['remote']) && $info['remote']) { - $file = $info['attachment']; - } else { - $file = SYS_ATTACHMENT_URL.$info['attachment']; - } - - if ($size) { - return str_replace( - basename($info['attachment']), - basename($info['attachment'], '.'.$info['fileext']).'_'.$size.'.'.$info['fileext'], - $file - ); - } else { - return $file; - } -} - - -/** - * 生成缩略图函数 - * @param $img 图片路径 - * @param $width 缩略图宽度 - * @param $height 缩略图高度 - * @param $autocut 是否自动裁剪 默认裁剪,当高度或宽度有一个数值为0是,自动关闭 - */ -function dr_thumb2($img, $width = 100, $height = 100, $autocut = 1) { - - if (!$img) { - return THEME_PATH.'admin/images/nopic.gif'; - } - - // 当图片是附件id - if (is_numeric($img)) { - $thumb_file = trim(SYS_THUMB_DIR, '/').'/'.md5("index.php?c=image&m=thumb&p=$img-$width-$height-$autocut").'.jpg'; - if (is_file(WEBPATH.$thumb_file)) { - return SITE_URL.$thumb_file; - } - $ci = &get_instance(); - return $ci->html_thumb2("$img-$width-$height-$autocut"); - } else { - return dr_file($img); - } -} - -/** - * 图片显示 - * - * @param string $img 图片id或者路径 - * @param intval $width 输出宽度 - * @param intval $height 输出高度 - * @param intval $water 是否水印 - * @param intval $size 缩略图尺寸 - * @return url - */ -function dr_thumb($img, $width = NULL, $height = NULL, $water = 0, $size = 0) { - - - if (!$img) { - return THEME_PATH.'admin/images/nopic.gif'; - } - - if (is_numeric($img)) { // 表示附件id - - $thumb_file = trim(SYS_THUMB_DIR, '/').'/'.md5("$img-$width-$height-$water-$size").'.jpg'; - if (is_file(WEBPATH.$thumb_file)) { - return SITE_URL.$thumb_file; - } - - $ci = &get_instance(); - return $ci->html_thumb("$img-$width-$height-$water-$size"); - } - - $img = dr_file($img); - - return $img ? $img : THEME_PATH.'admin/images/nopic.gif'; -} - -/** - * 下载文件 - * - * @param string $id - * @return array - */ -function dr_down_file($id) { - - if (!$id) { - return ''; - } - - if (is_numeric($id)) { // 表示附件id - $info = get_attachment($id); - if ($info) { - return SITE_URL."index.php?s=member&c=api&m=file&id=$id"; - } - } - - $file = dr_file($id); - - return $file ? $file : ''; -} - -/** - * 文件真实地址 - * - * @param string $id - * @return array - */ -function dr_get_file($id) { - - if (!$id) { - return ''; - } - - if (is_numeric($id)) { // 表示附件id - $info = get_attachment($id); - $id = $info['attachment'] ? $info['attachment'] : ''; - } - - $file = dr_file($id); - - return $file ? $file : ''; -} - -/** - * 完整的文件路径 - * - * @param string $url - * @return string - */ -function dr_file($url) { - - if (!$url || strlen($url) == 1) { - return NULL; - } elseif (substr($url, 0, 7) == 'http://' || substr($url, 0, 8) == 'https://') { - return $url; - } elseif (strpos($url, SITE_PATH) !== FALSE && SITE_PATH != '/') { - return $url; - } elseif (substr($url, 0, 1) == '/') { - return SITE_URL.substr($url, 1); - } - - return SYS_ATTACHMENT_URL . $url; -} - -/** - * 全局变量调用 - * - * @param string $name 别名 - * @return - */ -function dr_var($name) { - return get_instance()->get_cache('sysvar', $name); -} - -/** - * 格式化自定义字段内容 - * - * @param string $field 字段类型 - * @param string $value 字段值 - * @param array $cfg 字段配置信息 - * @param string $dirname模型目录 - * @return - */ -function dr_get_value($field, $value, $cfg = NULL, $dirname = NULL) { - - $ci = &get_instance(); - $ci->load->library('dfield', array($dirname ? $dirname : MOD_DIR)); - - $obj = $ci->dfield->get($field); - if (!$obj) { - return $value; - } - - return $obj->output($value, $cfg); -} - -/** - * 安全过滤函数 - * - * @param $string - * @return string - */ -function dr_safe_replace($string) { - $string = str_replace('%20', '', $string); - $string = str_replace('%27', '', $string); - $string = str_replace('%2527', '', $string); - $string = str_replace('*', '', $string); - $string = str_replace('"', '"', $string); - $string = str_replace("'", '', $string); - $string = str_replace('"', '', $string); - $string = str_replace(';', '', $string); - $string = str_replace('<', '<', $string); - $string = str_replace('>', '>', $string); - $string = str_replace("{", '', $string); - $string = str_replace('}', '', $string); - return $string; -} - -/** - * 字符截取 - * - * @param string $str - * @param intval $length - * @param string $dot - * @return string - */ -function dr_strcut($string, $length, $dot = '...') { - - $charset = 'utf-8'; - if (strlen($string) <= $length) { - return $string; - } - - $string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string); - $strcut = ''; - - if (strtolower($charset) == 'utf-8') { - $n = $tn = $noc = 0; - while ($n < strlen($string)) { - $t = ord($string[$n]); - if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { - $tn = 1; - $n++; - $noc++; - } elseif (194 <= $t && $t <= 223) { - $tn = 2; - $n += 2; - $noc += 2; - } elseif (224 <= $t && $t <= 239) { - $tn = 3; - $n += 3; - $noc += 2; - } elseif (240 <= $t && $t <= 247) { - $tn = 4; - $n += 4; - $noc += 2; - } elseif (248 <= $t && $t <= 251) { - $tn = 5; - $n += 5; - $noc += 2; - } elseif ($t == 252 || $t == 253) { - $tn = 6; - $n += 6; - $noc += 2; - } else { - $n++; - } - if ($noc >= $length) - break; - } - if ($noc > $length) - $n -= $tn; - $strcut = substr($string, 0, $n); - } else { - for ($i = 0; $i < $length; $i++) { - $strcut.= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i]; - } - } - - $strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut); - - return $strcut . $dot; -} - -/** - * 清除HTML标记 - * - * @param string $str - * @return string - */ -function dr_clearhtml($str) { - - $str = str_replace( - array(' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'), array(' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $str - ); - - $str = preg_replace("/\<[a-z]+(.*)\>/iU", "", $str); - $str = preg_replace("/\<\/[a-z]+\>/iU", "", $str); - $str = preg_replace("/{.+}/U", "", $str); - $str = str_replace(array(chr(13), chr(10), ' '), '', $str); - $str = strip_tags($str); - - return trim($str); -} - -/** - * 模型缓存数据 - * - * @param string $dirname 名称 - * @param intval $siteid 站点id - * @return array - */ -function get_module($dirname, $siteid = SITE_ID) { - - $ci = &get_instance(); - $ci->load->library('dcache'); - $data = $ci->get_cache('module'); // 全部模型 - if (!$data[$dirname]) { - return array(); - } - - $data[$dirname]['category'] = $ci->get_cache('category-'.$siteid); - - return $data[$dirname]; -} - -/** - * 随机颜色 - * - * @return string - */ -function dr_random_color() { - - $str = '#'; - - for ($i = 0; $i < 6; $i++) { - $randNum = rand(0, 15); - switch ($randNum) { - case 10: $randNum = 'A'; - break; - case 11: $randNum = 'B'; - break; - case 12: $randNum = 'C'; - break; - case 13: $randNum = 'D'; - break; - case 14: $randNum = 'E'; - break; - case 15: $randNum = 'F'; - break; - } - $str.= $randNum; - } - - return $str; -} - -/** - * 友好时间显示函数 - * - * @param int $time 时间戳 - * @return string - */ -function dr_fdate($sTime, $formt = 'Y-m-d') { - - if (!$sTime) { - return ''; - } - - //sTime=源时间,cTime=当前时间,dTime=时间差 - $cTime = time(); - $dTime = $cTime - $sTime; - $dDay = intval(date('z',$cTime)) - intval(date('z',$sTime)); - $dYear = intval(date('Y',$cTime)) - intval(date('Y',$sTime)); - - //n秒前,n分钟前,n小时前,日期 - if ($dTime < 60 ) { - if ($dTime < 10) { - return '刚刚'; - } else { - return intval(floor($dTime / 10) * 10).'秒前'; - } - } elseif ($dTime < 3600 ) { - return intval($dTime/60).'分钟前'; - } elseif( $dTime >= 3600 && $dDay == 0 ){ - return intval($dTime/3600).'小时前'; - } elseif( $dDay > 0 && $dDay<=7 ){ - return intval($dDay).'天前'; - } elseif( $dDay > 7 && $dDay <= 30 ){ - return intval($dDay/7).'周前'; - } elseif( $dDay > 30 ){ - return intval($dDay/30).'个月前'; - } elseif ($dYear==0) { - return date('m月d日', $sTime); - } else { - return date($formt, $sTime); - } -} - -/** - * 时间显示函数 - * - * @param int $time 时间戳 - * @param string $format 格式与date函数一致 - * @param string $color 当天显示颜色 - * @return string - */ -function dr_date($time = NULL, $format = SITE_TIME_FORMAT, $color = NULL) { - - $time = (int) $time; - if (!$time) { - return ''; - } - - $format = $format ? $format : SITE_TIME_FORMAT; - $string = date($format, $time); - if (strpos($string, '1970') !== FALSE) { - return ''; - } - - return $color && $time >= strtotime(date('Y-m-d 00:00:00')) && $time <= strtotime(date('Y-m-d 23:59:59')) ? '' . $string . '' : $string; -} - -/** - * JSON数据输出 - * - * @param int $status 状态 - * @param string|array $code 返回数据 - * @param string|int $id 表单名称|返回Id - * @return string - */ -function dr_json($status, $code = '', $id = 0, $rid = 0) { - - if (defined('IS_API_AUTH') && IS_API_AUTH) { - $data = array( - 'msg' => $code, - 'field' => strpos($id, 'http') === 0 ? '' : $id, - 'code' => $status ? 1 : 0, - 'id' => (int)$rid, - ); - $return = $_GET['return']; - if ($return) { - $temp = $data; - $data = array(); - foreach ($temp as $i => $t) { - $data[$i.'_'.$return] = $t; - } - } - return json_encode($data); - } - - return json_encode(array('status' => $status, 'code' => $code, 'id' => $id)); -} - - -/** - * 将对象转换为数组 - * - * @param object $obj 数组对象 - * @return array - */ -function dr_object2array($obj) { - $_arr = is_object($obj) ? get_object_vars($obj) : $obj; - if ($_arr && is_array($_arr)) { - foreach ($_arr as $key => $val) { - $val = (is_array($val) || is_object($val)) ? dr_object2array($val) : $val; - $arr[$key] = $val; - } - } - return $arr; -} - -/** - * 将字符串转换为数组 - * - * @param string $data 字符串 - * @return array - */ -function dr_string2array($data) { - if (is_array($data)) { - return $data; - } elseif (!$data) { - return array(); - } elseif (strpos($data, 'a:') === 0) { - return unserialize(stripslashes($data)); - } else { - return @json_decode($data, true); - } -} - -/** - * 将数组转换为字符串 - * - * @param array $data 数组 - * @return string - */ -function dr_array2string($data) { - return $data ? json_encode($data) : ''; -} - -/** - * 递归创建目录 - * - * @param string $dir 目录名称 - * @return bool|void - */ -function dr_mkdirs($dir) { - if (!$dir) { - return FALSE; - } - if (!is_dir($dir)) { - dr_mkdirs(dirname($dir)); - if (!is_dir($dir)) { - mkdir($dir, 0777); - } - } -} - -/** - * 设置表单 input 或者 textarea 字段的值 - * - * @param string $name 表单名称data[$name] - * @param string $value 修改时的值$data[$name] - * @return string - */ -function dr_set_value($name, $value = NULL) { - return isset($_POST['data'][$name]) ? $_POST['data'][$name] : $value; -} - -/** - * 设置表单 select 字段的值 - * - * @param string $name 表单名称data[$name] - * @param string $value 修改时的值$data[$name] - * @return string - */ -function dr_set_select($name, $value = NULL, $field = NULL, $default = FALSE) { - $value = dr_set_value($name, $value); - if ($value === NULL && $default == TRUE) { - return ' selected'; - } - if ($value == $field) { - return ' selected'; - } -} - -/** - * 设置表单 radio 字段的值 - * - * @param string $name 表单名称data[$name] - * @param string $value 修改时的值$data[$name] - * @param string $field 当前选项的value值 - * @param string $default 默认选中状态 - * @return string|void - */ -function dr_set_radio($name, $value = NULL, $field = NULL, $default = FALSE) { - $value = dr_set_value($name, $value); - if ($value === NULL && $default == TRUE) { - return ' checked'; - } - if ($value == $field) { - return ' checked'; - } -} - -/** - * 设置表单 checkbox 字段的值 - * - * @param string $name 表单名称data[$name] - * @param array $value 修改时的值$data[$name] 复选框为数组格式值 - * @param string $field 当前选项的value值 - * @param string $default 默认选中状态 - * @return string|void - */ -function dr_set_checkbox($name, $value = NULL, $field = NULL, $default = FALSE) { - $value = dr_set_value($name, $value); - if ($value === NULL && $default == TRUE) { - return ' checked'; - } - if (@is_array($value) && in_array($field, $value)) { - return ' checked'; - } -} - -/** - * 汉字转为拼音 - * - * @param string $word - * @return string - */ -function dr_word2pinyin($word) { - if (!$word) { - return ''; - } - $ci = &get_instance(); - $ci->load->library('pinyin'); - return $ci->pinyin->result($word); -} - -/** - * 格式化输出文件大小 - * - * @param int $fileSize 大小 - * @param int $round 保留小数位 - * @return string - */ -function dr_format_file_size($fileSize, $round = 2) { - - if (!$fileSize) { - return 0; - } - - $i = 0; - $inv = 1 / 1024; - $unit = array(' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'); - - while ($fileSize >= 1024 && $i < 8) { - $fileSize *= $inv; - ++$i; - } - - $temp = sprintf("%.2f", $fileSize); - $value = $temp - (int) $temp ? $temp : $fileSize; - - return round($value, $round) . $unit[$i]; -} - -/** - * 关键字高亮显示 - * - * @param string $string 字符串 - * @param string $keyword 关键字 - * @return string - */ -function dr_keyword_highlight($string, $keyword) { - return $keyword != '' ? str_ireplace($keyword, '' . $keyword . '', $string) : $string; -} - -function dollar($value, $include_cents = TRUE) { - if (!$include_cents) { - return "$" . number_format($value); - } else { - return "$" . number_format($value, 2, '.', ','); - } -} - -/** - * Base64加密 - * - * @param string $string - * @return string - */ -function dr_base64_encode($string) { - $data = base64_encode($string); - $data = str_replace(array('+', '/', '='), array('-', '_', ''), $data); - return $data; -} - -/** - * Base64解密 - * - * @param string $string - * @return string - */ -function dr_base64_decode($string) { - $data = str_replace(array('-', '_'), array('+', '/'), $string); - $mod4 = strlen($data) % 4; - if ($mod4) { - $data.= substr('====', $mod4); - } - return base64_decode($data); -} - -// 兼容老版本 - -/** - * 将语言转为实际内容 - * - * @param array $_name 语言名称 - * @param string $lang 语言名称 - * @return string - */ -function dr_lang2name($_name, $lang = SITE_LANGUAGE) { - - if (!$_name) { - return NULL; - } - - $name = dr_string2array($_name); - if (!$name) { - return lang($_name); - } - - return isset($name[$lang]) ? $name[$lang] : $name['zh-cn']; -} - -/** - * 将实际内容转为语言 - * - * @param string $value 实际内容 - * @param array $data 原语言数据 - * @return string - */ -function dr_name2lang($value, $data = array()) { - - if (!is_array($data)) { - $data = dr_string2array($data); - } - - if (!isset($data['zh-cn'])) { - $data['zh-cn'] = $value; - } - $data[SITE_LANGUAGE] = $value; - - return dr_array2string($data); -} - -/** - * 将数组转化为xml格式 - * - * @param array $arr 数组 - * @param bool $htmlon 是否开启html模式 - * @param bool $isnormal 是否不全空格 - * @param intval $level 当前级别 - * @return string - */ -function dr_array2xml($arr, $htmlon = TRUE, $isnormal = FALSE, $level = 1) { - $space = str_repeat("\t", $level); - $string = $level == 1 ? "\r\n\r\n" : ''; - foreach ($arr as $k => $v) { - if (!is_array($v)) { - $string.= $space."<$k>".($htmlon ? '' : '')."\r\n"; - } else { - $name = is_numeric($k) ? 'item' . $k : $k; - $string.= $space."<$name>\r\n".dr_array2xml($v, $htmlon, $isnormal, $level + 1).$space."\r\n"; - } - } - $string = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $string); - return $level == 1 ? $string.'' : $string; -} - -if (!function_exists('gethostbyname')) { - function gethostbyname($domain) { - return $domain; - } -} - -/** - * - * 正则替换和过滤内容 - * - * @param $html - */ -function dr_preg_html($html){ - $p = array("/<[a|A][^>]+(topic=\"true\")+[^>]*+>#([^<]+)#<\/[a|A]>/", - "/<[a|A][^>]+(data=\")+([^\"]+)\"[^>]*+>[^<]*+<\/[a|A]>/", - "/<[img|IMG][^>]+(src=\")+([^\"]+)\"[^>]*+>/"); - $t = array('topic{data=$2}','$2','img{data=$2}'); - $html = preg_replace($p, $t, $html); - $html = strip_tags($html, "
    "); - return $html; -} - -// 过滤非法字段 -function dr_get_order_string($str, $order) { - - if (substr_count($str, ' ') >= 2 - || strpos($str, '(') !== FALSE - || strpos($str, 'undefined') === 0 - || strpos($str, ')') !== FALSE ) { - return $order; - } - - return $str ? $str : ($order ? $order : 'id desc'); - -} - -// 文件上传临时目录 -function dr_upload_temp_path() { - - if (function_exists('ini_get')) { - $path = ini_get('upload_tmp_dir'); - if ($path) { - return rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - } - - return WEBPATH.'cache/file/'; -} - -// 兼容性判断 -if (!function_exists('ctype_digit')) { - function ctype_digit($num) { - if (strpos($num, '.') !== FALSE) { - return false; - } - return is_numeric($num); - } -} - -// 兼容性判断 -if (!function_exists('ctype_alpha')) { - function ctype_alpha($num) { - if (strpos($num, '.') !== FALSE) { - return false; - } - return is_numeric($num); - } -} - - -// 提取tag -function dr_tag_list($keyword, $is_code = 0) { - - if (!$keyword) { - return array(); - } - - $data = array(); - $array = explode(',', $keyword); - foreach ($array as $t) { - $t = trim($t); - $t && $data[$t] = dr_tags_url($is_code ? dr_word2pinyin($t) : $t); - } - - return $data; -} - -// 获取栏目数据及自定义字段 -function dr_cat_value($id, $name) { - - if (empty($id)) { - return 'id为空'; - } elseif (empty($name)) { - return '字段为空'; - } - - $ci = &get_instance(); - $category = $ci->get_cache('category-'.SITE_ID, $id); - return $category[$name]; -} - -// ajax调用动态内容 -function dr_ajax_html($id, $tpl, $params = array()) { - - $params = dr_array2string($params); - if (strlen($params) > 100) { - return '【'.$id.'】参数太多'; - } - - $url = SITE_URL."index.php?c=api&m=html&name=".$tpl."¶ms=".$params; - return ""; -} - - - -// 获取当前模板目录 -function dr_tpl_path($file) { - - $path = TPLPATH.(IS_MOBILE ? 'mobile/' : 'pc/'). (IS_MEMBER ? SITE_TEMPLATE.'/member/' : SITE_TEMPLATE.'/common/'); - if (is_file($path.$file)) { - return $path.$file; - } - - return false; -} - -// 判断满足定向跳转的条件 1单页,2模型首页,3栏目页,4内容,5扩展 -function dr_is_redirect($type, $url) { - - if (!defined('SITE_URL_301') || !SITE_URL_301) { - return; - } - - // 不调整的条件 - if (!$url || strpos($url, 'http') === FALSE) { - return; // 为空时排除 - } elseif (IS_MOBILE || SITE_MOBILE === TRUE) { - return; // 排除移动端 - } elseif ($type > 1 && defined('CT_HTML_FILE')) { - return; // 排除生成 - } elseif (intval($_GET['page']) > 1) { - return; // 排除分页 - } elseif (intval($_GET['cache']) > 1) { - return; // 排除cache - } elseif (SITE_FID && in_array($type, array(2, 3))) { - return; // 排除分站 - } - - // 跳转 - $url != dr_now_url() && redirect($url, 'location', '301'); - -} - -// 字段表单控件输出 -function dr_field_form($id, $value = '', $html = '{value}') { - - $id = (int)$id; - if (!$id) { - return NULL; - } - - $ci = &get_instance(); - $data = $ci->get_cache_data('field-value-'.$id); - if (!$data) { - $data = $ci->db->where('id', $id)->get('field')->row_array(); - if (!$data) { - return NULL; - } - $data['setting'] = dr_string2array($data['setting']); - $ci->set_cache_data('field-value-'.$id, $data, 10000); - } - - $ci->load->library('Dfield', array(APP_DIR)); - $field = $ci->dfield->get($data['fieldtype']); - if (!is_object($field)) { - return NULL; - } - - if ($html) { - $field->set_input_format($html); - } - - return preg_replace('/(
    get_cache('weixin-'.SITE_ID,'config'); - return $cfg['account']; -} - -function dr_weixin_show_url($id) { - - return SITE_URL.'index.php?c=weixin&m=show&id='.$id; -} - -// 微信端的错误码转中文解释 -function dr_error_msg($return, $more_tips = '') { - $msg = array ( - '-1' => '系统繁忙,此时请开发者稍候再试', - '0' => '请求成功', - '40001' => '获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口', - '40002' => '不合法的凭证类型', - '40003' => '不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID', - '40004' => '不合法的媒体文件类型', - '40005' => '不合法的文件类型', - '40006' => '不合法的文件大小', - '40007' => '不合法的媒体文件id', - '40008' => '不合法的消息类型', - '40009' => '不合法的图片文件大小', - '40010' => '不合法的语音文件大小', - '40011' => '不合法的视频文件大小', - '40012' => '不合法的缩略图文件大小', - '40013' => '不合法的AppID,请开发者检查AppID的正确性,避免异常字符,注意大小写', - '40014' => '不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口', - '40015' => '不合法的菜单类型', - '40016' => '不合法的按钮个数', - '40017' => '不合法的按钮个数', - '40018' => '不合法的按钮名字长度', - '40019' => '不合法的按钮KEY长度', - '40020' => '不合法的按钮URL长度', - '40021' => '不合法的菜单版本号', - '40022' => '不合法的子菜单级数', - '40023' => '不合法的子菜单按钮个数', - '40024' => '不合法的子菜单按钮类型', - '40025' => '不合法的子菜单按钮名字长度', - '40026' => '不合法的子菜单按钮KEY长度', - '40027' => '不合法的子菜单按钮URL长度', - '40028' => '不合法的自定义菜单使用用户', - '40029' => '不合法的oauth_code', - '40030' => '不合法的refresh_token', - '40031' => '不合法的openid列表', - '40032' => '不合法的openid列表长度', - '40033' => '不合法的请求字符,不能包含\uxxxx格式的字符', - '40035' => '不合法的参数', - '40038' => '不合法的请求格式', - '40039' => '不合法的URL长度', - '40050' => '不合法的分组id', - '40051' => '分组名字不合法', - '40117' => '分组名字不合法', - '40118' => 'media_id大小不合法', - '40119' => 'button类型错误', - '40120' => 'button类型错误', - '40121' => '不合法的media_id类型', - '40132' => '微信号不合法', - '40137' => '不支持的图片格式', - '41001' => '缺少access_token参数', - '41002' => '缺少appid参数', - '41003' => '缺少refresh_token参数', - '41004' => '缺少secret参数', - '41005' => '缺少多媒体文件数据', - '41006' => '缺少media_id参数', - '41007' => '缺少子菜单数据', - '41008' => '缺少oauth code', - '41009' => '缺少openid', - '42001' => 'access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明', - '42002' => 'refresh_token超时', - '42003' => 'oauth_code超时', - '43001' => '需要GET请求', - '43002' => '需要POST请求', - '43003' => '需要HTTPS请求', - '43004' => '需要接收者关注', - '43005' => '需要好友关系', - '44001' => '多媒体文件为空', - '44002' => 'POST的数据包为空', - '44003' => '图文消息内容为空', - '44004' => '文本消息内容为空', - '45001' => '多媒体文件大小超过限制', - '45002' => '消息内容超过限制', - '45003' => '标题字段超过限制', - '45004' => '描述字段超过限制', - '45005' => '链接字段超过限制', - '45006' => '图片链接字段超过限制', - '45007' => '语音播放时间超过限制', - '45008' => '图文消息超过限制', - '45009' => '接口调用超过限制', - '45010' => '创建菜单个数超过限制', - '45015' => '回复时间超过限制', - '45016' => '系统分组,不允许修改', - '45017' => '分组名字过长', - '45018' => '分组数量超过上限', - '46001' => '不存在媒体数据', - '46002' => '不存在的菜单版本', - '46003' => '不存在的菜单数据', - '46004' => '不存在的用户', - '47001' => '解析JSON/XML内容错误', - '48001' => 'api功能未授权,请确认公众号已获得该接口,可以在公众平台官网-开发者中心页中查看接口权限', - '50001' => '用户未授权该api', - '50002' => '用户受限,可能是违规后接口被封禁', - '61451' => '参数错误(invalid parameter)', - '61452' => '无效客服账号(invalid kf_account)', - '61453' => '客服帐号已存在(kf_account exsited)', - '61454' => '客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)', - '61455' => '客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)', - '61456' => '客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)', - '61457' => '无效头像文件类型(invalid file type)', - '61450' => '系统错误(system error)', - '61500' => '日期格式错误', - '61501' => '日期范围错误', - '9001001' => 'POST数据参数不合法', - '9001002' => '远端服务不可用', - '9001003' => 'Ticket不合法', - '9001004' => '获取摇周边用户信息失败', - '9001005' => '获取商户信息失败', - '9001006' => '获取OpenID失败', - '9001007' => '上传文件缺失', - '9001008' => '上传素材的文件类型不合法', - '9001009' => '上传素材的文件尺寸不合法', - '9001010' => '上传失败', - '9001020' => '帐号不合法', - '9001021' => '已有设备激活率低于50%,不能新增设备', - '9001022' => '设备申请数不合法,必须为大于0的数字', - '9001023' => '已存在审核中的设备ID申请', - '9001024' => '一次查询设备ID数量不能超过50', - '9001025' => '设备ID不合法', - '9001026' => '页面ID不合法', - '9001027' => '页面参数不合法', - '9001028' => '一次删除页面ID数量不能超过10', - '9001029' => '页面已应用在设备中,请先解除应用关系再删除', - '9001030' => '一次查询页面ID数量不能超过50', - '9001031' => '时间区间不合法', - '9001032' => '保存设备与页面的绑定关系参数错误', - '9001033' => '门店ID不合法', - '9001034' => '设备备注信息过长', - '9001035' => '设备申请参数不合法', - '9001036' => '查询起始值begin不合法' - ); - - if ($more_tips) { - $res = $more_tips . ': '; - } else { - $res = ''; - } - if (isset ( $msg [$return ['errcode']] )) { - $res .= $msg [$return ['errcode']]; - } else { - $res .= $return ['errmsg']; - } - - $res .= ', 返回码:' . $return ['errcode']; - - return $res; -} - -function dr_post_data($url, $param, $is_file = false, $return_array = true) { - if (! $is_file && is_array ( $param )) { - $param = JSON ( $param ); - } - if ($is_file) { - $header [] = "content-type: multipart/form-data; charset=UTF-8"; - } else { - $header [] = "content-type: application/json; charset=UTF-8"; - } - - $ch = curl_init (); - curl_setopt ( $ch, CURLOPT_URL, $url ); - curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); - curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); - curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE ); - curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header ); - curl_setopt ( $ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' ); - curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); - curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 ); - curl_setopt ( $ch, CURLOPT_POSTFIELDS, $param ); - curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); - $res = curl_exec ( $ch ); - - $flat = curl_errno ( $ch ); - if ($flat) { - $data = curl_error ( $ch ); - } - - curl_close ( $ch ); - - $return_array && $res = json_decode ( $res, true ); - - return $res; -} - -function dr_get_access_token() { - - $name = WEBPATH.'cache/data/access_token.'.SITE_ID; - $data = @json_decode(@dr_catcher_data($name), true); - if (isset($data['time']) && $data['time'] > SYS_TIME && isset($data['access_token']) && $data['access_token']) { - return $data['access_token']; - } - - $ci = &get_instance(); - $cfg = $ci->get_cache('weixin-'.SITE_ID, 'config'); - !$cfg['key'] && $ci->admin_msg('没有配置账号参数'); - $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$cfg['key'].'&secret='.$cfg['secret']; - $data = json_decode(wx_get_https_json_data($url), true); - if (!$data) { - @unlink($name); - $ci->admin_msg('获取access_token失败,请检查服务器是否支持远程链接'); - } - if (isset($data['errmsg']) && $data['errmsg']) { - @unlink($name); - $ci->admin_msg('错误代码('.$data['errcode'].'):'.$data['errmsg']); - } - $data['time'] = SYS_TIME + $data['expires_in']; - @file_put_contents($name, json_encode($data)); - - return $data['access_token']; -} - -function dr_weixin_jssdk() { - - $ci = &get_instance(); - $ci->load->library('jssdk'); - $signPackage = $ci->jssdk->GetSignPackage(); - return $signPackage; -} - -// 处理带Emoji的数据,type=0表示写入数据库前的emoji转为HTML,为1时表示HTML转为emoji码 -function dr_deal_emoji($msg, $type = 1){ - if ($type == 0) { - $msg = json_encode($msg); - } else { - $txt = json_decode($msg); - if ($txt !== null) { - $msg = $txt; - } - } - return $msg; -} - - - /** - * 将数组转换为JSON字符串(兼容中文) - */ -function JSON($array) { - arrayRecursive ( $array, 'urlencode', true ); - $json = json_encode ( $array ); - return urldecode ( $json ); -} - -/** - * 使用特定function对数组中所有元素做处理 - */ -function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { - static $recursive_counter = 0; - if (++ $recursive_counter > 1000) { - die ( 'possible deep recursion attack' ); - } - foreach ( $array as $key => $value ) { - if (is_array ( $value )) { - arrayRecursive ( $array [$key], $function, $apply_to_keys_also ); - } else { - $array [$key] = $function ( $value ); - } - - if ($apply_to_keys_also && is_string ( $key )) { - $new_key = $function ( $key ); - if ($new_key != $key) { - $array [$new_key] = $array [$key]; - unset ( $array [$key] ); - } - } - } - $recursive_counter --; -} - -// 转化为json -function dr_weixin_en_json($data) { - if (version_compare(PHP_VERSION, '5.4.0', '<')) { - return urldecode(json_encode(dr_url_encode($data))); - } else { - return json_encode($data, JSON_UNESCAPED_UNICODE); - } -} - -/** - * POST请求 - */ -function dr_weixin_post($url, $params) { - - if (function_exists('curl_init')) { // curl方式 - $oCurl = curl_init(); - if (stripos($url, 'https://') !== FALSE) { - curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); - curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); - } - $string = $params; - if (is_array($params)) { - $aPOST = array(); - foreach ($params as $key => $val){ - $aPOST[] = $key.'='.urlencode($val); - } - $string = join('&', $aPOST); - } - curl_setopt($oCurl, CURLOPT_URL, $url); - curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($oCurl, CURLOPT_POST, TRUE); - curl_setopt($oCurl, CURLOPT_POSTFIELDS, $string); - $response = curl_exec($oCurl); - curl_close($oCurl); - return json_decode($response, true); - } elseif (function_exists('stream_context_create')) { // php5.3以上 - $opts = array( - 'http' => array( - 'method' => 'POST', - 'header' => 'Content-type: application/x-www-form-urlencoded', - 'content' => http_build_query($params), - ) - ); - $_opts = stream_context_get_params(stream_context_get_default()); - $context = stream_context_create(array_merge_recursive($_opts['options'], $opts)); - return json_decode(file_get_contents($url, false, $context), true); - } else { - return FALSE; - } -} - -// 从url获取json数据 -function wx_get_https_json_data($url) { - - $response = @file_get_contents($url); - if (!$response) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在 - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 30); - $response = curl_exec($ch); - if ($error=curl_error($ch)){ - return dr_return_data(0, $error); - } - curl_close($ch); - } - - return $response; -} - - - - -/** - * url 编码 - */ -function dr_url_encode($str) { - if (is_array($str)) { - foreach($str as $key=>$value) { - $str[urlencode($key)] = dr_url_encode($value); - } - } else { - $str = urlencode($str); - } - - return $str; -} \ No newline at end of file diff --git a/finecms/finecms/dayrui/helpers/my_helper.php b/finecms/finecms/dayrui/helpers/my_helper.php deleted file mode 100644 index 630af4a..0000000 --- a/finecms/finecms/dayrui/helpers/my_helper.php +++ /dev/null @@ -1,14 +0,0 @@ -db - ->select('uid') - ->where('username', $username) - ->limit(1) - ->get('member') - ->row_array(); - - return (int)$data['uid']; -} - -/** - * 通过会员ui取会员OAuth昵称 - * - * @param intval $uid - * @return string - */ -function get_member_nickname($uid) { - - if (!$uid) { - return ''; - } - - $ci = &get_instance(); - $data = $ci->db->select('nickname')->where('uid', (int)$uid)->get('member_oauth')->row_array(); - return $data['nickname']; -} - -/** - * 通过会员ui取会员字段 - * - * @param intval $uid - * @return string - */ -function get_member_value($uid, $value = 'username') { - - if (!$uid) { - return ''; - } - - $ci = &get_instance(); - $data = $ci->db->select($value)->where('uid', (int)$uid)->get('member')->row_array(); - return $data[$value]; -} - -/** - * 附件信息 - * - * @param string $key - * @return array - */ -function dr_file_info($key) { - - if (!$key) { - return NULL; - } - - if (is_numeric($key)) { - $info = get_attachment($key); - if (!$info) { - return NULL; - } - $info['icon'] = is_file(WEBPATH.'statics/admin/images/ext/'.$info['fileext'].'.gif') ? THEME_PATH.'admin/images/ext/'.$info['fileext'].'.gif' : THEME_PATH.'admin/images/ext/blank.gif'; - $info['size'] = dr_format_file_size($info['filesize']); - $info['name'] = dr_strcut($info['filename'], 20).'.'.$info['fileext']; - return $info; - } else { - return array( - 'icon' => THEME_PATH.'admin/images/ext/url.gif', - 'size' => '', - 'fileext' => strtolower(trim(substr(strrchr($key, '.'), 1, 10))), - 'id' => $key, - 'filename' => $key - ); - } -} - -/** - * 字段输出表单 - * - * @param string $username - * @return intval - */ -function dr_field_input($name, $type, $option, $value = NULL, $id = 0) { - - $ci = &get_instance(); - $ci->load->library('Dfield', array(APP_DIR)); - - $field = $ci->dfield->get($type); - if (!is_object($field)) { - return NULL; - } - - A_Field::set_input_format('{value}'); - - return preg_replace('/( -
    - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/nheader.html b/finecms/finecms/dayrui/templates/nheader.html deleted file mode 100644 index ad61918..0000000 --- a/finecms/finecms/dayrui/templates/nheader.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - admin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    diff --git a/finecms/finecms/dayrui/templates/online.html b/finecms/finecms/dayrui/templates/online.html deleted file mode 100644 index d11fbd2..0000000 --- a/finecms/finecms/dayrui/templates/online.html +++ /dev/null @@ -1,15 +0,0 @@ -{template header.html} - - -{template footer.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/php7cms.html b/finecms/finecms/dayrui/templates/php7cms.html deleted file mode 100644 index dcb513d..0000000 --- a/finecms/finecms/dayrui/templates/php7cms.html +++ /dev/null @@ -1,72 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    - -

    - FineCMS升级为PHP7CMS免费版,享受PHP7最快的运行环境! -

    - -
    -
    -
    -
    -

    {if version_compare(PHP_VERSION, '7.1.0') >= 0} - 当前PHP版本满足PHP7CMS免费版的运行环境 - {else} - 当前PHP版本无法满足PHP7CMS免费版的运行环境,要求PHP版本在7.1以上 - {/if} -

    - -
    -
    -
    -
    - -
    - -
    -
    - 升级方法 -
    -
    -
    - -
    -

    1、下载PHP7CMS免费版源码(http://www.php7cms.com/free/)。

    -

    2、安装PHP7CMS免费版程序,并卸载默认的全部模块

    -

    3、将FineCMS目录下的/config/database.php复制到PHP7CMS免费版的cache/config/database.php中(注意路径)

    -

    4、运行数据转换脚本:http://PHP7CMS网站/admin.php?c=finecms

    -

    5、按照脚本提示步骤进行下一步操作

    - - -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/related.html b/finecms/finecms/dayrui/templates/related.html deleted file mode 100644 index 7451a5b..0000000 --- a/finecms/finecms/dayrui/templates/related.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - -admin - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/route_index.html b/finecms/finecms/dayrui/templates/route_index.html deleted file mode 100644 index 35cdaaa..0000000 --- a/finecms/finecms/dayrui/templates/route_index.html +++ /dev/null @@ -1,94 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    - -

    - {fc_lang('
  • 当前服务器是:%s
  • %s
  • ', $name, '')}
    -

    -
    -
    -
    - {$name} -
    -
    -
    -

    {$note}

    - {if $code} -

    - {/if} -

    伪静态规则配置文件:/config/rewrite.php

    -

    以下是通过当前系统的URL规则生成的对应伪静态解析规则, 可供开发者参考, 把以下规则放到配置文件中时需要注意规则是否冲突和规则是否重复问题

    -

    - {fc_lang('生成伪静态')} - {fc_lang('环境检测')} -

    -
    - -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/saler_add.html b/finecms/finecms/dayrui/templates/saler_add.html deleted file mode 100644 index 20cf580..0000000 --- a/finecms/finecms/dayrui/templates/saler_add.html +++ /dev/null @@ -1,63 +0,0 @@ - -
    - -
    - - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - -
    -
    - -
    -
    \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/saler_debtlist.html b/finecms/finecms/dayrui/templates/saler_debtlist.html deleted file mode 100644 index fadebf3..0000000 --- a/finecms/finecms/dayrui/templates/saler_debtlist.html +++ /dev/null @@ -1,63 +0,0 @@ -{template nheader.html} -{php $_pages=$pages;} -
    - - - -
    - - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - {loop $list $t} - - - - - - - - - {/loop} - - - - - - - - - - -
    {fc_lang('姓名')}{fc_lang('电话')}{fc_lang('欠款')}
    {dr_keyword_highlight($t.cname, $param.keyword)}{dr_keyword_highlight($t.phone, $param.keyword)}{dr_keyword_highlight($t.debtMoney, $param.keyword)}
    - -
    -
    -
    -
    - - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/saler_edit.html b/finecms/finecms/dayrui/templates/saler_edit.html deleted file mode 100644 index 5b4589e..0000000 --- a/finecms/finecms/dayrui/templates/saler_edit.html +++ /dev/null @@ -1,101 +0,0 @@ -{template nheader.html} - - -
    - -
    - - - -
    -

    - -

    - -
    - -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - -
    - -
    - - -
    -
    - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/saler_index.html b/finecms/finecms/dayrui/templates/saler_index.html deleted file mode 100644 index 9a7e7cf..0000000 --- a/finecms/finecms/dayrui/templates/saler_index.html +++ /dev/null @@ -1,91 +0,0 @@ -{template nheader.html} -{php $_pages=$pages;} -
    - - -
    - -
    -
    - - - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - {loop $list $t} - - - - - - - - - - - - - {/loop} - - - - - - - - - - - - - -
    {fc_lang('姓名')}{fc_lang('车牌号')}{fc_lang('电话')}{fc_lang('公司')}{fc_lang('结款')}{fc_lang('桶装水')}{fc_lang('饮料')}{fc_lang('瓶装水')}{fc_lang('操作')}
    {dr_keyword_highlight($t.name, $param.keyword)}{dr_keyword_highlight($t.carNo, $param.keyword)}{dr_keyword_highlight($t.phone, $param.keyword)}{dr_keyword_highlight($t.typename, $param.keyword)}{dr_keyword_highlight($t.allknot, $param.keyword)}{dr_keyword_highlight($t.allbucket, $param.keyword)}{dr_keyword_highlight($t.allbottleNum, $param.keyword)}{dr_keyword_highlight($t.alldrinkNum, $param.keyword)} - {fc_lang('详情')} - {fc_lang('加油信息')} - {fc_lang('修改')} - {fc_lang('客户')} - {fc_lang('欠款')} - {fc_lang('陈列')} -
    当日合计{$sum['allknot']}{$sum['allbucket']}{$sum['allbottleNum']}{$sum['alldrinkNum']}
    -
    -
    -
    -
    - - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/salerbill_add.html b/finecms/finecms/dayrui/templates/salerbill_add.html deleted file mode 100644 index c967e24..0000000 --- a/finecms/finecms/dayrui/templates/salerbill_add.html +++ /dev/null @@ -1,132 +0,0 @@ -{template nheader.html} - - -
    - -
    - - - -
    -

    - -

    - -
    - -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - - -
    - -
    -
    - -
    -
    -
    - -
    - -
    - - -
    -
    - - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/salerbill_index.html b/finecms/finecms/dayrui/templates/salerbill_index.html deleted file mode 100644 index 3c27c35..0000000 --- a/finecms/finecms/dayrui/templates/salerbill_index.html +++ /dev/null @@ -1,104 +0,0 @@ -{template nheader.html} -{php $_pages=$pages;} -
    - - -
    - -
    -
    - -
    -
    - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - {loop $list $t} - - - - - - - - - - - - - - - - - {/loop} - - - - - - - - - - - - - - - -
    {fc_lang('销售人员')}{fc_lang('桶装水')}{fc_lang('回桶')}{fc_lang('瓶装水')}{fc_lang('饮料')}{fc_lang('检核人')}{fc_lang('剩余桶装水')}{fc_lang('剩余瓶装水')}{fc_lang('剩余饮料')}{fc_lang('回款')}{fc_lang('时间')}{fc_lang('备注')}{fc_lang('操作')}
    {dr_keyword_highlight($t.salerName, $param.keyword)}{dr_keyword_highlight($t.bucketNum, $param.keyword)}{dr_keyword_highlight($t.backNumTotal, $param.keyword)}{dr_keyword_highlight($t.bottleNum, $param.keyword)}{dr_keyword_highlight($t.drinkNum, $param.keyword)}{dr_keyword_highlight($t.checker, $param.keyword)}{dr_keyword_highlight($t.bucketNum - $t.bucketTotal, $param.keyword)}{dr_keyword_highlight($t.bottleNum - $t.bottleTotal, $param.keyword)}{dr_keyword_highlight($t.drinkNum - $t.drinkTotal, $param.keyword)}{dr_keyword_highlight($t.knotTotal, $param.keyword)}{dr_keyword_highlight($t.saleTime, $param.keyword)}{dr_keyword_highlight($t.remark, $param.keyword)} - {if $this->ci->is_auth('member/admin/home/edit')} {fc_lang('详情')}{/if} - {if $this->ci->is_auth('member/admin/home/edit')} {fc_lang('修改')}{/if} -
    合计{$sum['bucketNum']}{$sum['backNumTotal']}{$sum['bottleNum']}{$sum['drinkNum']}{$sum['bucketleft']}{$sum['bottleleft']}{$sum['drinkleft']}{$sum['knotTotal']}
    -
    -
    -
    -
    - - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/salerfuel_add.html b/finecms/finecms/dayrui/templates/salerfuel_add.html deleted file mode 100644 index fb73c00..0000000 --- a/finecms/finecms/dayrui/templates/salerfuel_add.html +++ /dev/null @@ -1,117 +0,0 @@ -{template nheader.html} - - -
    - -
    - - - -
    -

    - -

    - -
    - -
    -
    - - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - -
    - - -
    -
    - - -
    -
    - - - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/salerfuel_index.html b/finecms/finecms/dayrui/templates/salerfuel_index.html deleted file mode 100644 index a38fd76..0000000 --- a/finecms/finecms/dayrui/templates/salerfuel_index.html +++ /dev/null @@ -1,78 +0,0 @@ -{template nheader.html} -{php $_pages=$pages;} -
    - - -
    - -
    -
    - -
    -
    - - - - - -
    -
    - -
    - -
    -
    -
    - - - - - - - - - - - - - - - - - {loop $list $t} - - - - - - - - - - - {/loop} - - -
    {fc_lang('销售人员')}{fc_lang('车牌号')}{fc_lang('加油量')}{fc_lang('金额')}{fc_lang('时间')}{fc_lang('备注')}{fc_lang('操作')}
    {dr_keyword_highlight($salerInfo.name, $param.keyword)}{dr_keyword_highlight($salerInfo.carNo, $param.keyword)}{dr_keyword_highlight($t.rise, $param.keyword)}{dr_keyword_highlight($t.money, $param.keyword)}{dr_keyword_highlight($t.date, $param.keyword)}{dr_keyword_highlight($t.remark, $param.keyword)} - {if $this->ci->is_auth('member/admin/home/edit')} {fc_lang('修改')}{/if} -
    -
    -
    -
    -
    - - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/setting_index.html b/finecms/finecms/dayrui/templates/setting_index.html deleted file mode 100644 index 24ed453..0000000 --- a/finecms/finecms/dayrui/templates/setting_index.html +++ /dev/null @@ -1,165 +0,0 @@ -{template nheader.html} - - -
    - -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -
    - -
    -
    - -
    -
    - -
    - -
    -
    - - -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - - 多站点或者绑定域名时,将这些URL复制到UCSSO中的“网站其他地址”中 - -
    -
    -
    - -
    - - 通信配置代码复制到这里 - -
    -
    - -
    -
    - - - -
    -
    - - -
    - -
    - - -
    -
    - -
    - -
    - - -
    -
    -
    - -
    - - {fc_lang('多个会员名以分号“,”分隔')} -
    -
    - -
    -
    - - - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -{template footer.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/setting_oauth.html b/finecms/finecms/dayrui/templates/setting_oauth.html deleted file mode 100644 index a9770d5..0000000 --- a/finecms/finecms/dayrui/templates/setting_oauth.html +++ /dev/null @@ -1,85 +0,0 @@ -{template nheader.html} - -
    - - -
    -
    - - -
    -
    -
    -

    - {fc_lang('修改配置时要保存之后才会生效;鼠标移至图标处可实现排序')} -

    -
    -
    -
    -
    - - - - - - - - - - - {loop $oauth $id $name} - {php $t=$data[$id];$i=$id;} - - - - - - - {/loop} - -
    OAuthApp IdApp Key{fc_lang('可用')}
    {$name}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/site_add.html b/finecms/finecms/dayrui/templates/site_add.html deleted file mode 100644 index 774cc33..0000000 --- a/finecms/finecms/dayrui/templates/site_add.html +++ /dev/null @@ -1,50 +0,0 @@ - -
    -
    - - - - - - - - - - - - - - -
    * {fc_lang('网站名称')}: - -
    {fc_lang('例如:FineCMS官方站')}
    -
    * {fc_lang('网站域名')}: - -
    {fc_lang('格式:test.dayrui.com')}
    -
    {fc_lang('将域名绑定至根目录')}: - {WEBPATH} -
    -
    -
    \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/site_config.html b/finecms/finecms/dayrui/templates/site_config.html deleted file mode 100644 index 66d9ed2..0000000 --- a/finecms/finecms/dayrui/templates/site_config.html +++ /dev/null @@ -1,476 +0,0 @@ -{template nheader.html} - - - - -
    -
    - - -
    -
    - - -
    -
    -
    -

    - {fc_lang('站点是系统的核心部分,各个站点数据独立,可以设置站点分库管理')} -

    - -
    - -
    -
    - -
    -
    - - -
    - -
    -
    - - -
    - {fc_lang('当关闭网站时,除管理员之外的用户将无法访问(静态页面除外)')} -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - {fc_lang('例如:FineCMS官方站')} -
    -
    -
    - -
    - - {fc_lang('网站时间显示格式与date函数一致,默认Y-m-d H:i:s')} -
    -
    -
    - -
    - - {fc_lang('网站核心目录及各个模型或应用目录:/language/语言名称/')} -
    -
    -
    - -
    -
    - - -
    - {fc_lang('可以将js,css,图片存储在远程地址或者本地statics目录之中')} -
    -
    -
    - -
    -
    - -
    - - {fc_lang('位于网站主站根目录下:/templates/pc或mobile/目录名称/')} -
    -
    -
    - -
    - - {fc_lang('例如中国地区选择“GMT +08:00”表示东八区')} -
    -
    - -
    -
    -
    -
    -
    - -
    - - {fc_lang('例如:www.finecms.net')} -
    -
    -
    - -
    - - {fc_lang('当前站点支持绑定多个域名,它们将会301到主域名,域名之间以回车符分隔(请勿与其他站点的域名重复)')} -
    -
    - -
    - -
    - - {fc_lang('启用将会使全站URL保持唯一,非当前URL自动301定向')} -
    -
    -
    - -
    - - -
    -
    - -
    -
    -
    -
    -
    - -
    - - {fc_lang('开启后将自动识别移动端并强制定向到此域名')} -
    -
    -
    - -
    - - {if $data['SITE_MOBILE'] == $data['SITE_DOMAIN']} - 此域名不能与站点域名相同 - {else} - {fc_lang('格式:test.finecms.net')} - {/if} -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - {fc_lang('默认为"_",如:文章标题[连接符]栏目名称[连接符]模型名称')} -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    -
    - -
    - -
    - - {fc_lang('指定是否在缩放或使用硬值的时候使图像保持原始的纵横比例')} -
    -
    -
    - -
    -
    - - -
    -
    -
    - -
    - -
    - - {fc_lang('打开远程附件水印会降低服务器性能,建议远程附件不加水印')} -
    -
    -
    - -
    - - {fc_lang('开启后文章编辑器内容中上传的图片将会采用动态水印模式')} -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - - {fc_lang('这里可以设置水印图片/文字的偏移量来校正图片水印位置')} -
    -
    -
    - -
    -
    - - -
    -
    -
    - - - - - - - -
    -
    - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/site_index.html b/finecms/finecms/dayrui/templates/site_index.html deleted file mode 100644 index bb7741f..0000000 --- a/finecms/finecms/dayrui/templates/site_index.html +++ /dev/null @@ -1,80 +0,0 @@ -{template nheader.html} -
    - - -
    -
    - - -
    -
    -
    -

    - {fc_lang('站点是系统的核心部分,各个站点数据独立,可以设置站点分库管理')} -

    -
    -
    -
    -
    - - - - - - - - - - - - - - - {loop $list $sid $t} - {if $admin.adminid == 1 || ($admin.adminid > 1 && @in_array($sid, $admin.role.site))} - - - - - - - - - {/if} - {/loop} - - - - - -
    {fc_lang('状态')}Site{fc_lang('网站名称')}{fc_lang('网站域名')}{fc_lang('操作')}
    {$sid} - {fc_lang('访问')}{if $this->ci->is_auth('site/config')} {fc_lang('配置')}{/if} - {if $this->ci->is_auth('site/del') && $sid > 1} {fc_lang('删除')}{/if} - -
    - {if $this->ci->is_auth('site/edit')} {fc_lang('修改')}{/if} -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/system_debug.html b/finecms/finecms/dayrui/templates/system_debug.html deleted file mode 100644 index 54ee1bf..0000000 --- a/finecms/finecms/dayrui/templates/system_debug.html +++ /dev/null @@ -1,65 +0,0 @@ -{template nheader.html} -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - - - -
    -
    - -
    -
    -
    -
    - - - - - - - - - {loop $list $id $t} - - - - - {/loop} - -
    {fc_lang('发生时间')}
    {$t['time']}{$t['error']}
    - -
    -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/system_index.html b/finecms/finecms/dayrui/templates/system_index.html deleted file mode 100644 index f66d945..0000000 --- a/finecms/finecms/dayrui/templates/system_index.html +++ /dev/null @@ -1,160 +0,0 @@ -{template nheader.html} - -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -
    - -
    -
    -
    - -
    -
    - -
    - -
    - - {fc_lang('用于后台查看程序和SQL执行详情')} -
    -
    - -
    - -
    - - {fc_lang('开启前需要保证服务器已经支持https协议,并且能够正常访问本网站')} -
    -
    - -
    - -
    - - {fc_lang('关闭缓存将会大大降低系统运行效率')} -
    -
    - -
    - -
    - - {fc_lang('开启之后,创建栏目选择的模型必须和上下级栏目保持一致')} -
    -
    -
    - -
    - - {fc_lang('多用户操作后台建议打开日志功能')} -
    -
    -
    - -
    - - -
    -
    -
    - -
    - - {fc_lang('例如文章每页显示的数量控制')} -
    -
    -
    - -
    - - {fc_lang('用于接收系统发送的通知信息的可用邮箱')} -
    -
    - - - -
    - -
    - - - {fc_lang('密钥建议定期更换')} -
    -
    - - - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/system_oplog.html b/finecms/finecms/dayrui/templates/system_oplog.html deleted file mode 100644 index 51af90a..0000000 --- a/finecms/finecms/dayrui/templates/system_oplog.html +++ /dev/null @@ -1,75 +0,0 @@ -{template nheader.html} -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - - - -
    -
    - -
    -
    -
    -
    - - - - - - - - - - - {loop $list $id $t} - {php $t=dr_string2array($t);} - - - - - - - {/loop} - - - - -
    {fc_lang('操作时间')}Ip{fc_lang('操作人')}
    {dr_date($t['time'], null, 'red')}{$ci->dip->address($t.ip)}{$t['username']}{$t['action']}
    -
    - -
    -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/tag_all.html b/finecms/finecms/dayrui/templates/tag_all.html deleted file mode 100644 index 8f7951b..0000000 --- a/finecms/finecms/dayrui/templates/tag_all.html +++ /dev/null @@ -1,79 +0,0 @@ -{template nheader.html} - -
    -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -
    -
    -
    - {if $pid}{fc_lang('子词')}{else}{fc_lang('父词')}{/if} -
    - - -
    -
    -
    - -
    - -
    - - - {fc_lang('换行分隔多条数据')} -
    -
    - -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - -{template "nfooter.html"} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/tag_list.html b/finecms/finecms/dayrui/templates/tag_list.html deleted file mode 100644 index 6327593..0000000 --- a/finecms/finecms/dayrui/templates/tag_list.html +++ /dev/null @@ -1,116 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    - - -
    -
    - - {if $pid} - - {else} -
    - - - - -
    - {/if} -
    -
    - - - -
    -
    -
    -
    - - - - - - - - - - - - - {loop $list $t} - - - - - - - - {/loop} - - - - - -
    - - {fc_lang('名称')}{fc_lang('别名')}{fc_lang('点击量')}{fc_lang('操作')}
    {$t.name}{$t.code}{$t.hits} - {if !$pid} - - {/if} - - - - -
      - - -
    - -
    - -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/tag_post.html b/finecms/finecms/dayrui/templates/tag_post.html deleted file mode 100644 index a3dc66a..0000000 --- a/finecms/finecms/dayrui/templates/tag_post.html +++ /dev/null @@ -1,92 +0,0 @@ -{template nheader.html} - -
    -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -
    -
    -
    - {if $pid}{fc_lang('子词')}{else}{fc_lang('父词')}{/if} -
    - - -
    -
    -
    - -
    - -
    - - {fc_lang('它的描述名称')} -
    -
    -
    - -
    - - {fc_lang('别名只能由字母或者字母+数字组成')} -
    -
    -
    - -
    - -
    -
    - - {$myfield} -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - -{template "nfooter.html"} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/upgrande.html b/finecms/finecms/dayrui/templates/upgrande.html deleted file mode 100644 index f747932..0000000 --- a/finecms/finecms/dayrui/templates/upgrande.html +++ /dev/null @@ -1,75 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    - -

    - {$note} -

    - -
    - -
    - -
    - -
    -
    - 升级方法 -
    -
    -
    - -
    -

    下载最新版源码,覆盖config/version.php和finecms目录下的全部文件即可完成升级。

    -

    解压覆盖到网站目录中,更新后台缓存,查看版本号和更新时间,如果是最新版本号和最新的更新时间,表示升级成功!

    - - -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/upload.html b/finecms/finecms/dayrui/templates/upload.html deleted file mode 100644 index cdf965f..0000000 --- a/finecms/finecms/dayrui/templates/upload.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - admin - - - - - - - - - - - - - - - - {if $is_admin} - - {/if} - - -
    -
    -
      -
    • {fc_lang('上传文件')}
    • - {if !$is_admin} -
    • {fc_lang('手动输入')}
    • - {/if} -
    -
    -
    -
    -
    - -
    - -
    {fc_lang('最多上传 %s 个文件,单文件最大 %s MB', $fcount, $size/1024)}
    -
    -
    {fc_lang('文件格式:%s', str_replace('|', '、', $ext))}
    -
    -
    -
    - {fc_lang('文件列表')} -
      -
    -
    -
    - - {if $member.adminid} - - {/if} - {if $notused} - - {/if} -
    - - - -
    -
    - - - diff --git a/finecms/finecms/dayrui/templates/upload_input.html b/finecms/finecms/dayrui/templates/upload_input.html deleted file mode 100644 index 0b359d5..0000000 --- a/finecms/finecms/dayrui/templates/upload_input.html +++ /dev/null @@ -1,17 +0,0 @@ -
    - - - - - - - - - - -
    * {fc_lang('标题')}: - -
    * {fc_lang('地址')}: - -
    -
    diff --git a/finecms/finecms/dayrui/templates/urlrule_add.html b/finecms/finecms/dayrui/templates/urlrule_add.html deleted file mode 100644 index 90a028d..0000000 --- a/finecms/finecms/dayrui/templates/urlrule_add.html +++ /dev/null @@ -1,157 +0,0 @@ -{template nheader.html} - -
    -
    - - -
    -
    - - -
    -
    -
    -

    - {fc_lang('通过URL规则可以对URL地址进行个性化设置!')} -

    -
    -
    -
    - {fc_lang('URL规则')} -
    -
    -
    -
    -
    - -
    -
    - {loop $type $i $n} - - {/loop} -
    -
    -
    -
    - -
    - - {fc_lang('给它一个描述名称')} -
    -
    - - - -
    - -
    - {dr_field_input('share_list', 'Text', array('option' => array('width' => '100%')), $data['value']['share_list'])} - - {fc_lang('栏目封面地址: index.php?c=category&id=ID')} -
    -
    -
    - -
    - {dr_field_input('share_list_page', 'Text', array('option' => array('width' => '100%')), $data['value']['share_list_page'])} - - {fc_lang('栏目列表地址: index.php?c=category&id=ID&page=分页号')} -
    -
    -
    - -
    - {dr_field_input('share_show', 'Text', array('option' => array('width' => '100%')), $data['value']['share_show'])} - - {fc_lang('模型内容地址: index.php?c=show&id=ID')} -
    -
    -
    - -
    - {dr_field_input('share_show_page', 'Text', array('option' => array('width' => '100%')), $data['value']['share_show_page'])} - - {fc_lang('模型内容分页地址: index.php?c=show&id=ID&page=分页号')} -
    -
    - - -
    - -
    - {dr_field_input('share_search_page', 'Text', array('option' => array('width' => '100%')), $data['value']['share_search_page'])} - - {fc_lang('内容模型搜索分页地址: index.php?c=search&各种参数字符串')} -
    -
    - - -
    - -
    - {dr_field_input('tags', 'Text', array('option' => array('width' => '100%')), $data['value']['tags'])} - - {fc_lang('关键词库地址: index.php?c=tag&name=tag名称 ({tag}表示tag名称,不可缺少)')} -
    -
    - -
    - -
    - - {fc_lang('针对{pdirname}的连接符号,默认为"/",如:china[连接符号]news')} -
    -
    - - -
    -
    -
    - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/urlrule_index.html b/finecms/finecms/dayrui/templates/urlrule_index.html deleted file mode 100644 index b20cba6..0000000 --- a/finecms/finecms/dayrui/templates/urlrule_index.html +++ /dev/null @@ -1,98 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    -

    - {fc_lang('通过URL规则可以对URL地址进行个性化设置!')} -

    - -
    -
    -
    -
    - - - - - - - - - - - - - {loop $list $t} - - - - - - - {/loop} - - - - - -
    {fc_lang('名称')}{fc_lang('类型')}{fc_lang('操作')}
    {if $this->ci->is_auth('admin/urlrule/edit')}{$t.name}{else}{$t.name}{/if} {$type[$t['type']]} - {if $this->ci->is_auth('admin/urlrule/edit')} {fc_lang('修改')}{/if} - {if $this->ci->is_auth('admin/urlrule/edit')} 复制{/if} -
    - {if $this->ci->is_auth('admin/urlrule/del')} - - {/if} -
    -
    -
    -
    - -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/weixin_index.html b/finecms/finecms/dayrui/templates/weixin_index.html deleted file mode 100644 index 0cac7c8..0000000 --- a/finecms/finecms/dayrui/templates/weixin_index.html +++ /dev/null @@ -1,130 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    -

    - -

    - -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    - -
    -
    {SITE_URL}index.php?c=weixin
    -
    -
    - -
    - -
    - - 请填写微信公众平台后台的AppId -
    -
    -
    - -
    - - 请填写微信公众平台后台的AppSecret, 只有填写这两项才能管理自定义菜单 -
    -
    -
    - -
    - - -
    -
    -
    - -
    -
    - - -
    - 自动注册模式是用户关注时自动创建一个会员号 -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/wmenu_add.html b/finecms/finecms/dayrui/templates/wmenu_add.html deleted file mode 100644 index df65ed5..0000000 --- a/finecms/finecms/dayrui/templates/wmenu_add.html +++ /dev/null @@ -1,137 +0,0 @@ -{template nheader.html} - - - -
    -
    - - -
    -
    - - -
    -
    -
    -

    - -

    -
    - -
    -
    - 自定义菜单 -
    -
    -
    - -
    -
    - -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    -
    - {loop $type $i $name} - - {/loop} -
    -
    -
    - - -
    - -
    - - -
    填写以http开头的完整的网站地址
    -
    -
    -
    - -
    - - -
    输入一个登录授权后的跳转URL,例如会员中心:{MEMBER_URL}
    -
    -
    - - - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/wmenu_index.html b/finecms/finecms/dayrui/templates/wmenu_index.html deleted file mode 100644 index a01cf41..0000000 --- a/finecms/finecms/dayrui/templates/wmenu_index.html +++ /dev/null @@ -1,105 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    - - -

    - -

    - - 自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单,菜单最多4个汉字,多出来的部分将会以“...”代替。 - -

    -
    -

    - - - -
    -
    -
    -
    - - - - - - - - - - - - - {loop $list $c} - - - - - - - - {loop $c.data $t} - - - - - - - - {/loop} - {/loop} - - - - - -
    {fc_lang('排序')}菜单名称{if $this->ci->is_auth('admin/wmenu/add')}{/if}
    - {$c.name}{if !$c.data}{$type[$c.type]}{/if} - 修改菜单 - 添加下级 -
    -   ├─  {$t.name}{$type[$t.type]} - 修改菜单 -
    - {if $this->ci->is_auth('admin/wmenu/del')}{/if} - {if $this->ci->is_auth('admin/wmenu/edit')}
    {fc_lang('排序按从小到大排列,最大支持99')}
    {/if} -
    -
    - -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/dayrui/templates/wuser_index.html b/finecms/finecms/dayrui/templates/wuser_index.html deleted file mode 100644 index 1b6c829..0000000 --- a/finecms/finecms/dayrui/templates/wuser_index.html +++ /dev/null @@ -1,104 +0,0 @@ -{template nheader.html} - - -
    - - -
    -
    - - -
    -
    -
    - -
    -
    - -
    - - - - - - - - - -
    -
    -
    - - - -
    -
    -
    -
    - - - - - - - - - - - - - {loop $list $t} - - - - - - - - {/loop} - - - - - -
    头像昵称绑定会员关注/取消时间
    {dr_deal_emoji($t.nickname)}{if $t.uid} {$t.username} {else} 未绑定 {/if}{dr_date($t.subscribe_time)}
      - - -
    -
    - -
    -
    -
    -{template nfooter.html} \ No newline at end of file diff --git a/finecms/finecms/system/.htaccess b/finecms/finecms/system/.htaccess deleted file mode 100644 index 97c65d2..0000000 --- a/finecms/finecms/system/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - Require all denied - - - Deny from all - \ No newline at end of file diff --git a/finecms/finecms/system/core/Benchmark.php b/finecms/finecms/system/core/Benchmark.php deleted file mode 100644 index b3ac79c..0000000 --- a/finecms/finecms/system/core/Benchmark.php +++ /dev/null @@ -1,133 +0,0 @@ -marker[$name] = microtime(TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Elapsed time - * - * Calculates the time difference between two marked points. - * - * If the first parameter is empty this function instead returns the - * {elapsed_time} pseudo-variable. This permits the full system - * execution time to be shown in a template. The output class will - * swap the real value for this variable. - * - * @param string $point1 A particular marked point - * @param string $point2 A particular marked point - * @param int $decimals Number of decimal places - * - * @return string Calculated elapsed time on success, - * an '{elapsed_string}' if $point1 is empty - * or an empty string if $point1 is not found. - */ - public function elapsed_time($point1 = '', $point2 = '', $decimals = 4) - { - if ($point1 === '') - { - return '{elapsed_time}'; - } - - if ( ! isset($this->marker[$point1])) - { - return ''; - } - - if ( ! isset($this->marker[$point2])) - { - $this->marker[$point2] = microtime(TRUE); - } - - return number_format($this->marker[$point2] - $this->marker[$point1], $decimals); - } - - // -------------------------------------------------------------------- - - /** - * Memory Usage - * - * Simply returns the {memory_usage} marker. - * - * This permits it to be put it anywhere in a template - * without the memory being calculated until the end. - * The output class will swap the real value for this variable. - * - * @return string '{memory_usage}' - */ - public function memory_usage() - { - return '{memory_usage}'; - } - -} diff --git a/finecms/finecms/system/core/CodeIgniter.php b/finecms/finecms/system/core/CodeIgniter.php deleted file mode 100644 index 823e034..0000000 --- a/finecms/finecms/system/core/CodeIgniter.php +++ /dev/null @@ -1,559 +0,0 @@ - '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal) - { - if (strpos($_registered, $key) === FALSE) - { - continue; - } - - foreach (array_keys($$superglobal) as $var) - { - if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE)) - { - $GLOBALS[$var] = NULL; - } - } - } - } -} - - -/* - * ------------------------------------------------------ - * Define a custom error handler so we can log PHP errors - * ------------------------------------------------------ - */ - set_error_handler('_error_handler'); - set_exception_handler('_exception_handler'); - register_shutdown_function('_shutdown_handler'); - -/* - * ------------------------------------------------------ - * Set the subclass_prefix - * ------------------------------------------------------ - * - * Normally the "subclass_prefix" is set in the config file. - * The subclass prefix allows CI to know if a core class is - * being extended via a library in the local application - * "libraries" folder. Since CI allows config items to be - * overridden via data set in the main index.php file, - * before proceeding we need to know if a subclass_prefix - * override exists. If so, we will set this value now, - * before any classes are loaded - * Note: Since the config file data is cached it doesn't - * hurt to load it here. - */ - if ( ! empty($assign_to_config['subclass_prefix'])) - { - get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); - } - -/* - * ------------------------------------------------------ - * Should we use a Composer autoloader? - * ------------------------------------------------------ - */ - if ($composer_autoload = config_item('composer_autoload')) - { - if ($composer_autoload === TRUE) - { - file_exists(APPPATH.'vendor/autoload.php') - ? require_once(APPPATH.'vendor/autoload.php') - : log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.'); - } - elseif (file_exists($composer_autoload)) - { - require_once($composer_autoload); - } - else - { - log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload); - } - } - -/* - * ------------------------------------------------------ - * Start the timer... tick tock tick tock... - * ------------------------------------------------------ - */ - $BM =& load_class('Benchmark', 'core'); - $BM->mark('total_execution_time_start'); - $BM->mark('loading_time:_base_classes_start'); - -/* - * ------------------------------------------------------ - * Instantiate the hooks class - * ------------------------------------------------------ - */ - $EXT =& load_class('Hooks', 'core'); - -/* - * ------------------------------------------------------ - * Is there a "pre_system" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('pre_system'); - -/* - * ------------------------------------------------------ - * Instantiate the config class - * ------------------------------------------------------ - * - * Note: It is important that Config is loaded first as - * most other classes depend on it either directly or by - * depending on another class that uses it. - * - */ - $CFG =& load_class('Config', 'core'); - - // Do we have any manually set config items in the index.php file? - if (isset($assign_to_config) && is_array($assign_to_config)) - { - foreach ($assign_to_config as $key => $value) - { - $CFG->set_item($key, $value); - } - } - -/* - * ------------------------------------------------------ - * Important charset-related stuff - * ------------------------------------------------------ - * - * Configure mbstring and/or iconv if they are enabled - * and set MB_ENABLED and ICONV_ENABLED constants, so - * that we don't repeatedly do extension_loaded() or - * function_exists() calls. - * - * Note: UTF-8 class depends on this. It used to be done - * in it's constructor, but it's _not_ class-specific. - * - */ - $charset = strtoupper(config_item('charset')); - ini_set('default_charset', $charset); - - if (extension_loaded('mbstring')) - { - define('MB_ENABLED', TRUE); - // mbstring.internal_encoding is deprecated starting with PHP 5.6 - // and it's usage triggers E_DEPRECATED messages. - @ini_set('mbstring.internal_encoding', $charset); - // This is required for mb_convert_encoding() to strip invalid characters. - // That's utilized by CI_Utf8, but it's also done for consistency with iconv. - mb_substitute_character('none'); - } - else - { - define('MB_ENABLED', FALSE); - } - - // There's an ICONV_IMPL constant, but the PHP manual says that using - // iconv's predefined constants is "strongly discouraged". - if (extension_loaded('iconv')) - { - define('ICONV_ENABLED', TRUE); - // iconv.internal_encoding is deprecated starting with PHP 5.6 - // and it's usage triggers E_DEPRECATED messages. - @ini_set('iconv.internal_encoding', $charset); - } - else - { - define('ICONV_ENABLED', FALSE); - } - - if (is_php('5.6')) - { - ini_set('php.internal_encoding', $charset); - } - -/* - * ------------------------------------------------------ - * Load compatibility features - * ------------------------------------------------------ - */ - - require_once(BASEPATH.'core/compat/mbstring.php'); - require_once(BASEPATH.'core/compat/hash.php'); - require_once(BASEPATH.'core/compat/password.php'); - require_once(BASEPATH.'core/compat/standard.php'); - -/* - * ------------------------------------------------------ - * Instantiate the UTF-8 class - * ------------------------------------------------------ - */ - $UNI =& load_class('Utf8', 'core'); - -/* - * ------------------------------------------------------ - * Instantiate the URI class - * ------------------------------------------------------ - */ - $URI =& load_class('URI', 'core'); - -/* - * ------------------------------------------------------ - * Instantiate the routing class and set the routing - * ------------------------------------------------------ - */ - $RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL); - -/* - * ------------------------------------------------------ - * Instantiate the output class - * ------------------------------------------------------ - */ - $OUT =& load_class('Output', 'core'); - -/* - * ------------------------------------------------------ - * Is there a valid cache file? If so, we're done... - * ------------------------------------------------------ - */ - if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) - { - exit; - } - -/* - * ----------------------------------------------------- - * Load the security class for xss and csrf support - * ----------------------------------------------------- - */ - $SEC =& load_class('Security', 'core'); - -/* - * ------------------------------------------------------ - * Load the Input class and sanitize globals - * ------------------------------------------------------ - */ - $IN =& load_class('Input', 'core'); - -/* - * ------------------------------------------------------ - * Load the Language class - * ------------------------------------------------------ - */ - $LANG =& load_class('Lang', 'core'); - -/* - * ------------------------------------------------------ - * Load the app controller and local controller - * ------------------------------------------------------ - * - */ - // Load the base controller class - require_once BASEPATH.'core/Controller.php'; - - /** - * Reference to the CI_Controller method. - * - * Returns current CI instance object - * - * @return CI_Controller - */ - function &get_instance() - { - return CI_Controller::get_instance(); - } - - if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) - { - require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; - } - - // Set a mark point for benchmarking - $BM->mark('loading_time:_base_classes_end'); - -/* - * ------------------------------------------------------ - * Sanity checks - * ------------------------------------------------------ - * - * The Router class has already validated the request, - * leaving us with 3 options here: - * - * 1) an empty class name, if we reached the default - * controller, but it didn't exist; - * 2) a query string which doesn't go through a - * file_exists() check - * 3) a regular request for a non-existing page - * - * We handle all of these as a 404 error. - * - * Furthermore, none of the methods in the app controller - * or the loader class can be called via the URI, nor can - * controller methods that begin with an underscore. - */ - - $e404 = FALSE; - $class = ucfirst($RTR->class); - $method = $RTR->method; - - if (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php')) - { - $e404 = TRUE; - } - else - { - require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php'); - - if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) - { - $e404 = TRUE; - } - elseif (method_exists($class, '_remap')) - { - $params = array($method, array_slice($URI->rsegments, 2)); - $method = '_remap'; - } - elseif ( ! method_exists($class, $method)) - { - $e404 = TRUE; - } - /** - * DO NOT CHANGE THIS, NOTHING ELSE WORKS! - * - * - method_exists() returns true for non-public methods, which passes the previous elseif - * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct() - * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited - * - People will only complain if this doesn't work, even though it is documented that it shouldn't. - * - * ReflectionMethod::isConstructor() is the ONLY reliable check, - * knowing which method will be executed as a constructor. - */ - elseif ( ! is_callable(array($class, $method))) - { - $reflection = new ReflectionMethod($class, $method); - if ( ! $reflection->isPublic() OR $reflection->isConstructor()) - { - $e404 = TRUE; - } - } - } - - if ($e404) - { - if ( ! empty($RTR->routes['404_override'])) - { - if (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2) - { - $error_method = 'index'; - } - - $error_class = ucfirst($error_class); - - if ( ! class_exists($error_class, FALSE)) - { - if (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php')) - { - require_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'); - $e404 = ! class_exists($error_class, FALSE); - } - // Were we in a directory? If so, check for a global override - elseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php')) - { - require_once(APPPATH.'controllers/'.$error_class.'.php'); - if (($e404 = ! class_exists($error_class, FALSE)) === FALSE) - { - $RTR->directory = ''; - } - } - } - else - { - $e404 = FALSE; - } - } - - // Did we reset the $e404 flag? If so, set the rsegments, starting from index 1 - if ( ! $e404) - { - $class = $error_class; - $method = $error_method; - - $URI->rsegments = array( - 1 => $class, - 2 => $method - ); - } - else - { - show_404($RTR->directory.$class.'/'.$method); - } - } - - if ($method !== '_remap') - { - $params = array_slice($URI->rsegments, 2); - } - -/* - * ------------------------------------------------------ - * Is there a "pre_controller" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('pre_controller'); - -/* - * ------------------------------------------------------ - * Instantiate the requested controller - * ------------------------------------------------------ - */ - // Mark a start point so we can benchmark the controller - $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); - - $CI = new $class(); - -/* - * ------------------------------------------------------ - * Is there a "post_controller_constructor" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('post_controller_constructor'); - -/* - * ------------------------------------------------------ - * Call the requested method - * ------------------------------------------------------ - */ - call_user_func_array(array(&$CI, $method), $params); - - // Mark a benchmark end point - $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); - -/* - * ------------------------------------------------------ - * Is there a "post_controller" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('post_controller'); - -/* - * ------------------------------------------------------ - * Send the final rendered output to the browser - * ------------------------------------------------------ - */ - if ($EXT->call_hook('display_override') === FALSE) - { - $OUT->_display(); - } - -/* - * ------------------------------------------------------ - * Is there a "post_system" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('post_system'); diff --git a/finecms/finecms/system/core/Common.php b/finecms/finecms/system/core/Common.php deleted file mode 100644 index d6a1fdb..0000000 --- a/finecms/finecms/system/core/Common.php +++ /dev/null @@ -1,849 +0,0 @@ -='); - } - - return $_is_php[$version]; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('is_really_writable')) -{ - /** - * Tests for file writability - * - * is_writable() returns TRUE on Windows servers when you really can't write to - * the file, based on the read-only attribute. is_writable() is also unreliable - * on Unix servers if safe_mode is on. - * - * @link https://bugs.php.net/bug.php?id=54709 - * @param string - * @return bool - */ - function is_really_writable($file) - { - // If we're on a Unix server with safe_mode off we call is_writable - if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode'))) - { - return is_writable($file); - } - - /* For Windows servers and safe_mode "on" installations we'll actually - * write a file then read it. Bah... - */ - if (is_dir($file)) - { - $file = rtrim($file, '/').'/'.md5(mt_rand()); - if (($fp = @fopen($file, 'ab')) === FALSE) - { - return FALSE; - } - - fclose($fp); - @chmod($file, 0777); - @unlink($file); - return TRUE; - } - elseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) - { - return FALSE; - } - - fclose($fp); - return TRUE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('load_class')) -{ - /** - * Class registry - * - * This function acts as a singleton. If the requested class does not - * exist it is instantiated and set to a static variable. If it has - * previously been instantiated the variable is returned. - * - * @param string the class name being requested - * @param string the directory where the class should be found - * @param mixed an optional argument to pass to the class constructor - * @return object - */ - function &load_class($class, $directory = 'libraries', $param = NULL) - { - static $_classes = array(); - - // Does the class exist? If so, we're done... - if (isset($_classes[$class])) - { - return $_classes[$class]; - } - - $name = FALSE; - - // Look for the class first in the local application/libraries folder - // then in the native system/libraries folder - foreach (array(APPPATH, BASEPATH) as $path) - { - if (file_exists($path.$directory.'/'.$class.'.php')) - { - $name = 'CI_'.$class; - - if (class_exists($name, FALSE) === FALSE) - { - require_once($path.$directory.'/'.$class.'.php'); - } - - break; - } - } - - // Is the request a class extension? If so we load it too - if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) - { - $name = config_item('subclass_prefix').$class; - - if (class_exists($name, FALSE) === FALSE) - { - require_once(APPPATH.$directory.'/'.$name.'.php'); - } - } - - // Did we find the class? - if ($name === FALSE) - { - // Note: We use exit() rather than show_error() in order to avoid a - // self-referencing loop with the Exceptions class - set_status_header(503); - echo 'Unable to locate the specified class: '.$class.'.php'; - exit(5); // EXIT_UNK_CLASS - } - - // Keep track of what we just loaded - is_loaded($class); - - $_classes[$class] = isset($param) - ? new $name($param) - : new $name(); - return $_classes[$class]; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('is_loaded')) -{ - /** - * Keeps track of which libraries have been loaded. This function is - * called by the load_class() function above - * - * @param string - * @return array - */ - function &is_loaded($class = '') - { - static $_is_loaded = array(); - - if ($class !== '') - { - $_is_loaded[strtolower($class)] = $class; - } - - return $_is_loaded; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_config')) -{ - /** - * Loads the main config.php file - * - * This function lets us grab the config file even if the Config class - * hasn't been instantiated yet - * - * @param array - * @return array - */ - function &get_config(Array $replace = array()) - { - static $config; - - if (empty($config)) - { - $file_path = APPPATH.'config/config.php'; - $found = FALSE; - if (file_exists($file_path)) - { - $found = TRUE; - require($file_path); - } - - // Is the config file in the environment folder? - if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) - { - require($file_path); - } - elseif ( ! $found) - { - set_status_header(503); - echo 'The configuration file does not exist.'; - exit(3); // EXIT_CONFIG - } - - // Does the $config array exist in the file? - if ( ! isset($config) OR ! is_array($config)) - { - set_status_header(503); - echo 'Your config file does not appear to be formatted correctly.'; - exit(3); // EXIT_CONFIG - } - } - - // Are any values being dynamically added or replaced? - foreach ($replace as $key => $val) - { - $config[$key] = $val; - } - - return $config; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('config_item')) -{ - /** - * Returns the specified config item - * - * @param string - * @return mixed - */ - function config_item($item) - { - static $_config; - - if (empty($_config)) - { - // references cannot be directly assigned to static variables, so we use an array - $_config[0] =& get_config(); - } - - return isset($_config[0][$item]) ? $_config[0][$item] : NULL; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_mimes')) -{ - /** - * Returns the MIME types array from config/mimes.php - * - * @return array - */ - function &get_mimes() - { - static $_mimes; - - if (empty($_mimes)) - { - $_mimes = file_exists(APPPATH.'config/mimes.php') - ? include(APPPATH.'config/mimes.php') - : array(); - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) - { - $_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')); - } - } - - return $_mimes; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('is_https')) -{ - /** - * Is HTTPS? - * - * Determines if the application is accessed via an encrypted - * (HTTPS) connection. - * - * @return bool - */ - function is_https() - { - if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') - { - return TRUE; - } - elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') - { - return TRUE; - } - elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') - { - return TRUE; - } - - return FALSE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('is_cli')) -{ - - /** - * Is CLI? - * - * Test to see if a request was made from the command line. - * - * @return bool - */ - function is_cli() - { - return (PHP_SAPI === 'cli' OR defined('STDIN')); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('show_error')) -{ - /** - * Error Handler - * - * This function lets us invoke the exception class and - * display errors using the standard error template located - * in application/views/errors/error_general.php - * This function will send the error page directly to the - * browser and exit. - * - * @param string - * @param int - * @param string - * @return void - */ - function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') - { - $status_code = abs($status_code); - if ($status_code < 100) - { - $exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN - $status_code = 500; - } - else - { - $exit_status = 1; // EXIT_ERROR - } - - $_error =& load_class('Exceptions', 'core'); - echo $_error->show_error($heading, $message, 'error_general', $status_code); - exit($exit_status); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('show_404')) -{ - /** - * 404 Page Handler - * - * This function is similar to the show_error() function above - * However, instead of the standard error template it displays - * 404 errors. - * - * @param string - * @param bool - * @return void - */ - function show_404($page = '', $log_error = TRUE) - { - $_error =& load_class('Exceptions', 'core'); - $_error->show_404($page, $log_error); - exit(4); // EXIT_UNKNOWN_FILE - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('log_message')) -{ - /** - * Error Logging Interface - * - * We use this as a simple mechanism to access the logging - * class and send messages to be logged. - * - * @param string the error level: 'error', 'debug' or 'info' - * @param string the error message - * @return void - */ - function log_message($level, $message) - { - static $_log; - - if ($_log === NULL) - { - // references cannot be directly assigned to static variables, so we use an array - $_log[0] =& load_class('Log', 'core'); - } - - $_log[0]->write_log($level, $message); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('set_status_header')) -{ - /** - * Set HTTP Status Header - * - * @param int the status code - * @param string - * @return void - */ - function set_status_header($code = 200, $text = '') - { - if (is_cli()) - { - return; - } - - if (empty($code) OR ! is_numeric($code)) - { - show_error('Status codes must be numeric', 500); - } - - if (empty($text)) - { - is_int($code) OR $code = (int) $code; - $stati = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 511 => 'Network Authentication Required', - ); - - if (isset($stati[$code])) - { - $text = $stati[$code]; - } - else - { - show_error('No status text available. Please check your status code number or supply your own message text.', 500); - } - } - - if (strpos(PHP_SAPI, 'cgi') === 0) - { - header('Status: '.$code.' '.$text, TRUE); - return; - } - - $server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2'), TRUE)) - ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; - header($server_protocol.' '.$code.' '.$text, TRUE, $code); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('_error_handler')) -{ - /** - * Error Handler - * - * This is the custom error handler that is declared at the (relative) - * top of CodeIgniter.php. The main reason we use this is to permit - * PHP errors to be logged in our own log files since the user may - * not have access to server logs. Since this function effectively - * intercepts PHP errors, however, we also need to display errors - * based on the current error_reporting level. - * We do that with the use of a PHP error template. - * - * @param int $severity - * @param string $message - * @param string $filepath - * @param int $line - * @return void - */ - function _error_handler($severity, $message, $filepath, $line) - { - $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); - - // When an error occurred, set the status header to '500 Internal Server Error' - // to indicate to the client something went wrong. - // This can't be done within the $_error->show_php_error method because - // it is only called when the display_errors flag is set (which isn't usually - // the case in a production environment) or when errors are ignored because - // they are above the error_reporting threshold. - if ($is_error) - { - set_status_header(500); - } - - // Should we ignore the error? We'll get the current error_reporting - // level and add its bits with the severity bits to find out. - if (($severity & error_reporting()) !== $severity) - { - return; - } - - $_error =& load_class('Exceptions', 'core'); - $_error->log_exception($severity, $message, $filepath, $line); - - // Should we display the error? - if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) - { - $_error->show_php_error($severity, $message, $filepath, $line); - } - - // If the error is fatal, the execution of the script should be stopped because - // errors can't be recovered from. Halting the script conforms with PHP's - // default error handling. See http://www.php.net/manual/en/errorfunc.constants.php - if ($is_error) - { - exit(1); // EXIT_ERROR - } - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_exception_handler')) -{ - /** - * Exception Handler - * - * Sends uncaught exceptions to the logger and displays them - * only if display_errors is On so that they don't show up in - * production environments. - * - * @param Exception $exception - * @return void - */ - function _exception_handler($exception) - { - $_error =& load_class('Exceptions', 'core'); - $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); - - is_cli() OR set_status_header(500); - // Should we display the error? - if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) - { - $_error->show_exception($exception); - } - - exit(1); // EXIT_ERROR - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_shutdown_handler')) -{ - /** - * Shutdown Handler - * - * This is the shutdown handler that is declared at the top - * of CodeIgniter.php. The main reason we use this is to simulate - * a complete custom exception handler. - * - * E_STRICT is purposively neglected because such events may have - * been caught. Duplication or none? None is preferred for now. - * - * @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a - * @return void - */ - function _shutdown_handler() - { - $last_error = error_get_last(); - if (isset($last_error) && - ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) - { - _error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); - } - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('remove_invisible_characters')) -{ - /** - * Remove Invisible Characters - * - * This prevents sandwiching null characters - * between ascii characters, like Java\0script. - * - * @param string - * @param bool - * @return string - */ - function remove_invisible_characters($str, $url_encoded = TRUE) - { - $non_displayables = array(); - - // every control character except newline (dec 10), - // carriage return (dec 13) and horizontal tab (dec 09) - if ($url_encoded) - { - $non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 - $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 - $non_displayables[] = '/%7f/i'; // url encoded 127 - } - - $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - - do - { - $str = preg_replace($non_displayables, '', $str, -1, $count); - } - while ($count); - - return $str; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('html_escape')) -{ - /** - * Returns HTML escaped variable. - * - * @param mixed $var The input string or array of strings to be escaped. - * @param bool $double_encode $double_encode set to FALSE prevents escaping twice. - * @return mixed The escaped string or array of strings as a result. - */ - function html_escape($var, $double_encode = TRUE) - { - if (empty($var)) - { - return $var; - } - - if (is_array($var)) - { - foreach (array_keys($var) as $key) - { - $var[$key] = html_escape($var[$key], $double_encode); - } - - return $var; - } - - return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_stringify_attributes')) -{ - /** - * Stringify attributes for use in HTML tags. - * - * Helper function used to convert a string, array, or object - * of attributes to a string. - * - * @param mixed string, array, object - * @param bool - * @return string - */ - function _stringify_attributes($attributes, $js = FALSE) - { - $atts = NULL; - - if (empty($attributes)) - { - return $atts; - } - - if (is_string($attributes)) - { - return ' '.$attributes; - } - - $attributes = (array) $attributes; - - foreach ($attributes as $key => $val) - { - $atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'="'.$val.'"'; - } - - return rtrim($atts, ','); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('function_usable')) -{ - /** - * Function usable - * - * Executes a function_exists() check, and if the Suhosin PHP - * extension is loaded - checks whether the function that is - * checked might be disabled in there as well. - * - * This is useful as function_exists() will return FALSE for - * functions disabled via the *disable_functions* php.ini - * setting, but not for *suhosin.executor.func.blacklist* and - * *suhosin.executor.disable_eval*. These settings will just - * terminate script execution if a disabled function is executed. - * - * The above described behavior turned out to be a bug in Suhosin, - * but even though a fix was committed for 0.9.34 on 2012-02-12, - * that version is yet to be released. This function will therefore - * be just temporary, but would probably be kept for a few years. - * - * @link http://www.hardened-php.net/suhosin/ - * @param string $function_name Function to check for - * @return bool TRUE if the function exists and is safe to call, - * FALSE otherwise. - */ - function function_usable($function_name) - { - static $_suhosin_func_blacklist; - - if (function_exists($function_name)) - { - if ( ! isset($_suhosin_func_blacklist)) - { - $_suhosin_func_blacklist = extension_loaded('suhosin') - ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) - : array(); - } - - return ! in_array($function_name, $_suhosin_func_blacklist, TRUE); - } - - return FALSE; - } -} diff --git a/finecms/finecms/system/core/Config.php b/finecms/finecms/system/core/Config.php deleted file mode 100644 index cda6224..0000000 --- a/finecms/finecms/system/core/Config.php +++ /dev/null @@ -1,379 +0,0 @@ -config =& get_config(); - - // Set the base_url automatically if none was provided - if (empty($this->config['base_url'])) - { - if (isset($_SERVER['SERVER_ADDR'])) - { - if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) - { - $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; - } - else - { - $server_addr = $_SERVER['SERVER_ADDR']; - } - - $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr - .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); - } - else - { - $base_url = 'http://localhost/'; - } - - $this->set_item('base_url', $base_url); - } - - log_message('info', 'Config Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Load Config File - * - * @param string $file Configuration file name - * @param bool $use_sections Whether configuration values should be loaded into their own section - * @param bool $fail_gracefully Whether to just return FALSE or display an error message - * @return bool TRUE if the file was loaded correctly or FALSE on failure - */ - public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) - { - $file = ($file === '') ? 'config' : str_replace('.php', '', $file); - $loaded = FALSE; - - foreach ($this->_config_paths as $path) - { - foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location) - { - $file_path = $path.'config/'.$location.'.php'; - if (in_array($file_path, $this->is_loaded, TRUE)) - { - return TRUE; - } - - if ( ! file_exists($file_path)) - { - continue; - } - - include($file_path); - - if ( ! isset($config) OR ! is_array($config)) - { - if ($fail_gracefully === TRUE) - { - return FALSE; - } - - show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); - } - - if ($use_sections === TRUE) - { - $this->config[$file] = isset($this->config[$file]) - ? array_merge($this->config[$file], $config) - : $config; - } - else - { - $this->config = array_merge($this->config, $config); - } - - $this->is_loaded[] = $file_path; - $config = NULL; - $loaded = TRUE; - log_message('debug', 'Config file loaded: '.$file_path); - } - } - - if ($loaded === TRUE) - { - return TRUE; - } - elseif ($fail_gracefully === TRUE) - { - return FALSE; - } - - show_error('The configuration file '.$file.'.php does not exist.'); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a config file item - * - * @param string $item Config item name - * @param string $index Index name - * @return string|null The configuration item or NULL if the item doesn't exist - */ - public function item($item, $index = '') - { - if ($index == '') - { - return isset($this->config[$item]) ? $this->config[$item] : NULL; - } - - return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Fetch a config file item with slash appended (if not empty) - * - * @param string $item Config item name - * @return string|null The configuration item or NULL if the item doesn't exist - */ - public function slash_item($item) - { - if ( ! isset($this->config[$item])) - { - return NULL; - } - elseif (trim($this->config[$item]) === '') - { - return ''; - } - - return rtrim($this->config[$item], '/').'/'; - } - - // -------------------------------------------------------------------- - - /** - * Site URL - * - * Returns base_url . index_page [. uri_string] - * - * @uses CI_Config::_uri_string() - * - * @param string|string[] $uri URI string or an array of segments - * @param string $protocol - * @return string - */ - public function site_url($uri = '', $protocol = NULL) - { - $base_url = $this->slash_item('base_url'); - - if (isset($protocol)) - { - // For protocol-relative links - if ($protocol === '') - { - $base_url = substr($base_url, strpos($base_url, '//')); - } - else - { - $base_url = $protocol.substr($base_url, strpos($base_url, '://')); - } - } - - if (empty($uri)) - { - return $base_url.$this->item('index_page'); - } - - $uri = $this->_uri_string($uri); - - if ($this->item('enable_query_strings') === FALSE) - { - $suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : ''; - - if ($suffix !== '') - { - if (($offset = strpos($uri, '?')) !== FALSE) - { - $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset); - } - else - { - $uri .= $suffix; - } - } - - return $base_url.$this->slash_item('index_page').$uri; - } - elseif (strpos($uri, '?') === FALSE) - { - $uri = '?'.$uri; - } - - return $base_url.$this->item('index_page').$uri; - } - - // ------------------------------------------------------------- - - /** - * Base URL - * - * Returns base_url [. uri_string] - * - * @uses CI_Config::_uri_string() - * - * @param string|string[] $uri URI string or an array of segments - * @param string $protocol - * @return string - */ - public function base_url($uri = '', $protocol = NULL) - { - $base_url = $this->slash_item('base_url'); - - if (isset($protocol)) - { - // For protocol-relative links - if ($protocol === '') - { - $base_url = substr($base_url, strpos($base_url, '//')); - } - else - { - $base_url = $protocol.substr($base_url, strpos($base_url, '://')); - } - } - - return $base_url.$this->_uri_string($uri); - } - - // ------------------------------------------------------------- - - /** - * Build URI string - * - * @used-by CI_Config::site_url() - * @used-by CI_Config::base_url() - * - * @param string|string[] $uri URI string or an array of segments - * @return string - */ - protected function _uri_string($uri) - { - if ($this->item('enable_query_strings') === FALSE) - { - is_array($uri) && $uri = implode('/', $uri); - return ltrim($uri, '/'); - } - elseif (is_array($uri)) - { - return http_build_query($uri); - } - - return $uri; - } - - // -------------------------------------------------------------------- - - /** - * System URL - * - * @deprecated 3.0.0 Encourages insecure practices - * @return string - */ - public function system_url() - { - $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH)); - return $this->slash_item('base_url').end($x).'/'; - } - - // -------------------------------------------------------------------- - - /** - * Set a config file item - * - * @param string $item Config item key - * @param string $value Config item value - * @return void - */ - public function set_item($item, $value) - { - $this->config[$item] = $value; - } - -} diff --git a/finecms/finecms/system/core/Controller.php b/finecms/finecms/system/core/Controller.php deleted file mode 100644 index 59a9167..0000000 --- a/finecms/finecms/system/core/Controller.php +++ /dev/null @@ -1,96 +0,0 @@ - $class) - { - $this->$var =& load_class($class); - } - - $this->load =& load_class('Loader', 'core'); - $this->load->initialize(); - log_message('info', 'Controller Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Get the CI singleton - * - * @static - * @return object - */ - public static function &get_instance() - { - return self::$instance; - } - -} diff --git a/finecms/finecms/system/core/Exceptions.php b/finecms/finecms/system/core/Exceptions.php deleted file mode 100644 index 5269096..0000000 --- a/finecms/finecms/system/core/Exceptions.php +++ /dev/null @@ -1,274 +0,0 @@ - 'Error', - E_WARNING => 'Warning', - E_PARSE => 'Parsing Error', - E_NOTICE => 'Notice', - E_CORE_ERROR => 'Core Error', - E_CORE_WARNING => 'Core Warning', - E_COMPILE_ERROR => 'Compile Error', - E_COMPILE_WARNING => 'Compile Warning', - E_USER_ERROR => 'User Error', - E_USER_WARNING => 'User Warning', - E_USER_NOTICE => 'User Notice', - E_STRICT => 'Runtime Notice' - ); - - /** - * Class constructor - * - * @return void - */ - public function __construct() - { - $this->ob_level = ob_get_level(); - // Note: Do not log messages from this constructor. - } - - // -------------------------------------------------------------------- - - /** - * Exception Logger - * - * Logs PHP generated error messages - * - * @param int $severity Log level - * @param string $message Error message - * @param string $filepath File path - * @param int $line Line number - * @return void - */ - public function log_exception($severity, $message, $filepath, $line) - { - $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; - log_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line); - } - - // -------------------------------------------------------------------- - - /** - * 404 Error Handler - * - * @uses CI_Exceptions::show_error() - * - * @param string $page Page URI - * @param bool $log_error Whether to log the error - * @return void - */ - public function show_404($page = '', $log_error = TRUE) - { - if (is_cli()) - { - $heading = 'Not Found'; - $message = 'The controller/method pair you requested was not found.'; - } - else - { - $heading = '404 Page Not Found'; - $message = 'The page you requested was not found.'; - } - - // By default we log this, but allow a dev to skip it - if ($log_error) - { - log_message('error', $heading.': '.$page); - } - - echo $this->show_error($heading, $message, 'error_404', 404); - exit(4); // EXIT_UNKNOWN_FILE - } - - // -------------------------------------------------------------------- - - /** - * General Error Page - * - * Takes an error message as input (either as a string or an array) - * and displays it using the specified template. - * - * @param string $heading Page heading - * @param string|string[] $message Error message - * @param string $template Template name - * @param int $status_code (default: 500) - * - * @return string Error page output - */ - public function show_error($heading, $message, $template = 'error_general', $status_code = 500) - { - $templates_path = config_item('error_views_path'); - if (empty($templates_path)) - { - $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; - } - - if (is_cli()) - { - $message = "\t".(is_array($message) ? implode("\n\t", $message) : $message); - $template = 'cli'.DIRECTORY_SEPARATOR.$template; - } - else - { - set_status_header($status_code); - $message = '

    '.(is_array($message) ? implode('

    ', $message) : $message).'

    '; - $template = 'html'.DIRECTORY_SEPARATOR.$template; - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - ob_start(); - include($templates_path.$template.'.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - return $buffer; - } - - // -------------------------------------------------------------------- - - public function show_exception($exception) - { - $templates_path = config_item('error_views_path'); - if (empty($templates_path)) - { - $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; - } - - $message = $exception->getMessage(); - if (empty($message)) - { - $message = '(null)'; - } - - if (is_cli()) - { - $templates_path .= 'cli'.DIRECTORY_SEPARATOR; - } - else - { - $templates_path .= 'html'.DIRECTORY_SEPARATOR; - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - - ob_start(); - include($templates_path.'error_exception.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - echo $buffer; - } - - // -------------------------------------------------------------------- - - /** - * Native PHP error handler - * - * @param int $severity Error level - * @param string $message Error message - * @param string $filepath File path - * @param int $line Line number - * @return void - */ - public function show_php_error($severity, $message, $filepath, $line) - { - $templates_path = config_item('error_views_path'); - if (empty($templates_path)) - { - $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; - } - - $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; - - // For safety reasons we don't show the full file path in non-CLI requests - if ( ! is_cli()) - { - $filepath = str_replace('\\', '/', $filepath); - if (FALSE !== strpos($filepath, '/')) - { - $x = explode('/', $filepath); - $filepath = $x[count($x)-2].'/'.end($x); - } - - $template = 'html'.DIRECTORY_SEPARATOR.'error_php'; - } - else - { - $template = 'cli'.DIRECTORY_SEPARATOR.'error_php'; - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - ob_start(); - include($templates_path.$template.'.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - echo $buffer; - } - -} diff --git a/finecms/finecms/system/core/Hooks.php b/finecms/finecms/system/core/Hooks.php deleted file mode 100644 index f2d6f21..0000000 --- a/finecms/finecms/system/core/Hooks.php +++ /dev/null @@ -1,266 +0,0 @@ -item('enable_hooks') === FALSE) - { - return; - } - - // Grab the "hooks" definition file. - if (file_exists(APPPATH.'config/hooks.php')) - { - include(APPPATH.'config/hooks.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); - } - - // If there are no hooks, we're done. - if ( ! isset($hook) OR ! is_array($hook)) - { - return; - } - - $this->hooks =& $hook; - $this->enabled = TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Call Hook - * - * Calls a particular hook. Called by CodeIgniter.php. - * - * @uses CI_Hooks::_run_hook() - * - * @param string $which Hook name - * @return bool TRUE on success or FALSE on failure - */ - public function call_hook($which = '') - { - if ( ! $this->enabled OR ! isset($this->hooks[$which])) - { - return FALSE; - } - - if (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function'])) - { - foreach ($this->hooks[$which] as $val) - { - $this->_run_hook($val); - } - } - else - { - $this->_run_hook($this->hooks[$which]); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Run Hook - * - * Runs a particular hook - * - * @param array $data Hook details - * @return bool TRUE on success or FALSE on failure - */ - protected function _run_hook($data) - { - // Closures/lambda functions and array($object, 'method') callables - if (is_callable($data)) - { - is_array($data) - ? $data[0]->{$data[1]}() - : $data(); - - return TRUE; - } - elseif ( ! is_array($data)) - { - return FALSE; - } - - // ----------------------------------- - // Safety - Prevents run-away loops - // ----------------------------------- - - // If the script being called happens to have the same - // hook call within it a loop can happen - if ($this->_in_progress === TRUE) - { - return; - } - - // ----------------------------------- - // Set file path - // ----------------------------------- - - if ( ! isset($data['filepath'], $data['filename'])) - { - return FALSE; - } - - $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; - - if ( ! file_exists($filepath)) - { - return FALSE; - } - - // Determine and class and/or function names - $class = empty($data['class']) ? FALSE : $data['class']; - $function = empty($data['function']) ? FALSE : $data['function']; - $params = isset($data['params']) ? $data['params'] : ''; - - if (empty($function)) - { - return FALSE; - } - - // Set the _in_progress flag - $this->_in_progress = TRUE; - - // Call the requested class and/or function - if ($class !== FALSE) - { - // The object is stored? - if (isset($this->_objects[$class])) - { - if (method_exists($this->_objects[$class], $function)) - { - $this->_objects[$class]->$function($params); - } - else - { - return $this->_in_progress = FALSE; - } - } - else - { - class_exists($class, FALSE) OR require_once($filepath); - - if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function)) - { - return $this->_in_progress = FALSE; - } - - // Store the object and execute the method - $this->_objects[$class] = new $class(); - $this->_objects[$class]->$function($params); - } - } - else - { - function_exists($function) OR require_once($filepath); - - if ( ! function_exists($function)) - { - return $this->_in_progress = FALSE; - } - - $function($params); - } - - $this->_in_progress = FALSE; - return TRUE; - } - -} diff --git a/finecms/finecms/system/core/Input.php b/finecms/finecms/system/core/Input.php deleted file mode 100644 index af4f87c..0000000 --- a/finecms/finecms/system/core/Input.php +++ /dev/null @@ -1,895 +0,0 @@ -_allow_get_array = (config_item('allow_get_array') === TRUE); - $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); - $this->_enable_csrf = (config_item('csrf_protection') === TRUE); - $this->_standardize_newlines = (bool) config_item('standardize_newlines'); - - $this->security =& load_class('Security', 'core'); - - // Do we need the UTF-8 class? - if (UTF8_ENABLED === TRUE) - { - $this->uni =& load_class('Utf8', 'core'); - } - - // Sanitize global arrays - $this->_sanitize_globals(); - - // CSRF Protection check - if ($this->_enable_csrf === TRUE && ! is_cli()) - { - $this->security->csrf_verify(); - } - - log_message('info', 'Input Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Fetch from array - * - * Internal method used to retrieve values from global arrays. - * - * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. - * @param mixed $index Index for item to be fetched from $array - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) - { - is_bool($xss_clean) OR $xss_clean = $this->_enable_xss; - - // If $index is NULL, it means that the whole $array is requested - isset($index) OR $index = array_keys($array); - - // allow fetching multiple keys at once - if (is_array($index)) - { - $output = array(); - foreach ($index as $key) - { - $output[$key] = $this->_fetch_from_array($array, $key, $xss_clean); - } - - return $output; - } - - if (isset($array[$index])) - { - $value = $array[$index]; - } - elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation - { - $value = $array; - for ($i = 0; $i < $count; $i++) - { - $key = trim($matches[0][$i], '[]'); - if ($key === '') // Empty notation will return the value as array - { - break; - } - - if (isset($value[$key])) - { - $value = $value[$key]; - } - else - { - return NULL; - } - } - } - else - { - return NULL; - } - - return ($xss_clean === TRUE) - ? $this->security->xss_clean($value) - : $value; - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the GET array - * - * @param mixed $index Index for item to be fetched from $_GET - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function get($index = NULL, $xss_clean = NULL) - { - return $this->_fetch_from_array($_GET, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the POST array - * - * @param mixed $index Index for item to be fetched from $_POST - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function post($index = NULL, $xss_clean = NULL) - { - return $this->_fetch_from_array($_POST, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from POST data with fallback to GET - * - * @param string $index Index for item to be fetched from $_POST or $_GET - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function post_get($index, $xss_clean = NULL) - { - return isset($_POST[$index]) - ? $this->post($index, $xss_clean) - : $this->get($index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from GET data with fallback to POST - * - * @param string $index Index for item to be fetched from $_GET or $_POST - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function get_post($index, $xss_clean = NULL) - { - return isset($_GET[$index]) - ? $this->get($index, $xss_clean) - : $this->post($index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the COOKIE array - * - * @param mixed $index Index for item to be fetched from $_COOKIE - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function cookie($index = NULL, $xss_clean = NULL) - { - return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the SERVER array - * - * @param mixed $index Index for item to be fetched from $_SERVER - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function server($index, $xss_clean = NULL) - { - return $this->_fetch_from_array($_SERVER, $index, $xss_clean); - } - - // ------------------------------------------------------------------------ - - /** - * Fetch an item from the php://input stream - * - * Useful when you need to access PUT, DELETE or PATCH request data. - * - * @param string $index Index for item to be fetched - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function input_stream($index = NULL, $xss_clean = NULL) - { - // Prior to PHP 5.6, the input stream can only be read once, - // so we'll need to check if we have already done that first. - if ( ! is_array($this->_input_stream)) - { - // $this->raw_input_stream will trigger __get(). - parse_str($this->raw_input_stream, $this->_input_stream); - is_array($this->_input_stream) OR $this->_input_stream = array(); - } - - return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean); - } - - // ------------------------------------------------------------------------ - - /** - * Set cookie - * - * Accepts an arbitrary number of parameters (up to 7) or an associative - * array in the first parameter containing all the values. - * - * @param string|mixed[] $name Cookie name or an array containing parameters - * @param string $value Cookie value - * @param int $expire Cookie expiration time in seconds - * @param string $domain Cookie domain (e.g.: '.yourdomain.com') - * @param string $path Cookie path (default: '/') - * @param string $prefix Cookie name prefix - * @param bool $secure Whether to only transfer cookies via SSL - * @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript) - * @return void - */ - public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL) - { - if (is_array($name)) - { - // always leave 'name' in last place, as the loop will break otherwise, due to $$item - foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) - { - if (isset($name[$item])) - { - $$item = $name[$item]; - } - } - } - - if ($prefix === '' && config_item('cookie_prefix') !== '') - { - $prefix = config_item('cookie_prefix'); - } - - if ($domain == '' && config_item('cookie_domain') != '') - { - $domain = config_item('cookie_domain'); - } - - if ($path === '/' && config_item('cookie_path') !== '/') - { - $path = config_item('cookie_path'); - } - - $secure = ($secure === NULL && config_item('cookie_secure') !== NULL) - ? (bool) config_item('cookie_secure') - : (bool) $secure; - - $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL) - ? (bool) config_item('cookie_httponly') - : (bool) $httponly; - - if ( ! is_numeric($expire)) - { - $expire = time() - 86500; - } - else - { - $expire = ($expire > 0) ? time() + $expire : 0; - } - - setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the IP Address - * - * Determines and validates the visitor's IP address. - * - * @return string IP address - */ - public function ip_address() - { - if ($this->ip_address !== FALSE) - { - return $this->ip_address; - } - - $proxy_ips = config_item('proxy_ips'); - if ( ! empty($proxy_ips) && ! is_array($proxy_ips)) - { - $proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); - } - - $this->ip_address = $this->server('REMOTE_ADDR'); - - if ($proxy_ips) - { - foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) - { - if (($spoof = $this->server($header)) !== NULL) - { - // Some proxies typically list the whole chain of IP - // addresses through which the client has reached us. - // e.g. client_ip, proxy_ip1, proxy_ip2, etc. - sscanf($spoof, '%[^,]', $spoof); - - if ( ! $this->valid_ip($spoof)) - { - $spoof = NULL; - } - else - { - break; - } - } - } - - if ($spoof) - { - for ($i = 0, $c = count($proxy_ips); $i < $c; $i++) - { - // Check if we have an IP address or a subnet - if (strpos($proxy_ips[$i], '/') === FALSE) - { - // An IP address (and not a subnet) is specified. - // We can compare right away. - if ($proxy_ips[$i] === $this->ip_address) - { - $this->ip_address = $spoof; - break; - } - - continue; - } - - // We have a subnet ... now the heavy lifting begins - isset($separator) OR $separator = $this->valid_ip($this->ip_address, 'ipv6') ? ':' : '.'; - - // If the proxy entry doesn't match the IP protocol - skip it - if (strpos($proxy_ips[$i], $separator) === FALSE) - { - continue; - } - - // Convert the REMOTE_ADDR IP address to binary, if needed - if ( ! isset($ip, $sprintf)) - { - if ($separator === ':') - { - // Make sure we're have the "full" IPv6 format - $ip = explode(':', - str_replace('::', - str_repeat(':', 9 - substr_count($this->ip_address, ':')), - $this->ip_address - ) - ); - - for ($j = 0; $j < 8; $j++) - { - $ip[$j] = intval($ip[$j], 16); - } - - $sprintf = '%016b%016b%016b%016b%016b%016b%016b%016b'; - } - else - { - $ip = explode('.', $this->ip_address); - $sprintf = '%08b%08b%08b%08b'; - } - - $ip = vsprintf($sprintf, $ip); - } - - // Split the netmask length off the network address - sscanf($proxy_ips[$i], '%[^/]/%d', $netaddr, $masklen); - - // Again, an IPv6 address is most likely in a compressed form - if ($separator === ':') - { - $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); - for ($j = 0; $j < 8; $j++) - { - $netaddr[$j] = intval($netaddr[$j], 16); - } - } - else - { - $netaddr = explode('.', $netaddr); - } - - // Convert to binary and finally compare - if (strncmp($ip, vsprintf($sprintf, $netaddr), $masklen) === 0) - { - $this->ip_address = $spoof; - break; - } - } - } - } - - if ( ! $this->valid_ip($this->ip_address)) - { - return $this->ip_address = '0.0.0.0'; - } - - return $this->ip_address; - } - - // -------------------------------------------------------------------- - - /** - * Validate IP Address - * - * @param string $ip IP address - * @param string $which IP protocol: 'ipv4' or 'ipv6' - * @return bool - */ - public function valid_ip($ip, $which = '') - { - switch (strtolower($which)) - { - case 'ipv4': - $which = FILTER_FLAG_IPV4; - break; - case 'ipv6': - $which = FILTER_FLAG_IPV6; - break; - default: - $which = NULL; - break; - } - - return (bool) filter_var($ip, FILTER_VALIDATE_IP, $which); - } - - // -------------------------------------------------------------------- - - /** - * Fetch User Agent string - * - * @return string|null User Agent string or NULL if it doesn't exist - */ - public function user_agent($xss_clean = NULL) - { - return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Globals - * - * Internal method serving for the following purposes: - * - * - Unsets $_GET data, if query strings are not enabled - * - Cleans POST, COOKIE and SERVER data - * - Standardizes newline characters to PHP_EOL - * - * @return void - */ - protected function _sanitize_globals() - { - // Is $_GET data allowed? If not we'll set the $_GET to an empty array - if ($this->_allow_get_array === FALSE) - { - $_GET = array(); - } - elseif (is_array($_GET)) - { - foreach ($_GET as $key => $val) - { - $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_POST Data - if (is_array($_POST)) - { - foreach ($_POST as $key => $val) - { - $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_COOKIE Data - if (is_array($_COOKIE)) - { - // Also get rid of specially treated cookies that might be set by a server - // or silly application, that are of no use to a CI application anyway - // but that when present will trip our 'Disallowed Key Characters' alarm - // http://www.ietf.org/rfc/rfc2109.txt - // note that the key names below are single quoted strings, and are not PHP variables - unset( - $_COOKIE['$Version'], - $_COOKIE['$Path'], - $_COOKIE['$Domain'] - ); - - foreach ($_COOKIE as $key => $val) - { - if (($cookie_key = $this->_clean_input_keys($key)) !== FALSE) - { - $_COOKIE[$cookie_key] = $this->_clean_input_data($val); - } - else - { - unset($_COOKIE[$key]); - } - } - } - - // Sanitize PHP_SELF - $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); - - log_message('debug', 'Global POST, GET and COOKIE data sanitized'); - } - - // -------------------------------------------------------------------- - - /** - * Clean Input Data - * - * Internal method that aids in escaping data and - * standardizing newline characters to PHP_EOL. - * - * @param string|string[] $str Input string(s) - * @return string - */ - protected function _clean_input_data($str) - { - if (is_array($str)) - { - $new_array = array(); - foreach (array_keys($str) as $key) - { - $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]); - } - return $new_array; - } - - /* We strip slashes if magic quotes is on to keep things consistent - - NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and - it will probably not exist in future versions at all. - */ - if ( ! is_php('5.4') && get_magic_quotes_gpc()) - { - $str = stripslashes($str); - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - $str = $this->uni->clean_string($str); - } - - // Remove control characters - $str = remove_invisible_characters($str, FALSE); - - // Standardize newlines if needed - if ($this->_standardize_newlines === TRUE) - { - return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Clean Keys - * - * Internal method that helps to prevent malicious users - * from trying to exploit keys we make sure that keys are - * only named with alpha-numeric text and a few other items. - * - * @param string $str Input string - * @param bool $fatal Whether to terminate script exection - * or to return FALSE if an invalid - * key is encountered - * @return string|bool - */ - protected function _clean_input_keys($str, $fatal = TRUE) - { - if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) - { - if ($fatal === TRUE) - { - return FALSE; - } - else - { - set_status_header(503); - echo 'Disallowed Key Characters.'; - exit(7); // EXIT_USER_INPUT - } - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - return $this->uni->clean_string($str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Request Headers - * - * @param bool $xss_clean Whether to apply XSS filtering - * @return array - */ - public function request_headers($xss_clean = FALSE) - { - // If header is already defined, return it immediately - if ( ! empty($this->headers)) - { - return $this->_fetch_from_array($this->headers, NULL, $xss_clean); - } - - // In Apache, you can simply call apache_request_headers() - if (function_exists('apache_request_headers')) - { - $this->headers = apache_request_headers(); - } - else - { - isset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE']; - - foreach ($_SERVER as $key => $val) - { - if (sscanf($key, 'HTTP_%s', $header) === 1) - { - // take SOME_HEADER and turn it into Some-Header - $header = str_replace('_', ' ', strtolower($header)); - $header = str_replace(' ', '-', ucwords($header)); - - $this->headers[$header] = $_SERVER[$key]; - } - } - } - - return $this->_fetch_from_array($this->headers, NULL, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Get Request Header - * - * Returns the value of a single member of the headers class member - * - * @param string $index Header name - * @param bool $xss_clean Whether to apply XSS filtering - * @return string|null The requested header on success or NULL on failure - */ - public function get_request_header($index, $xss_clean = FALSE) - { - static $headers; - - if ( ! isset($headers)) - { - empty($this->headers) && $this->request_headers(); - foreach ($this->headers as $key => $value) - { - $headers[strtolower($key)] = $value; - } - } - - $index = strtolower($index); - - if ( ! isset($headers[$index])) - { - return NULL; - } - - return ($xss_clean === TRUE) - ? $this->security->xss_clean($headers[$index]) - : $headers[$index]; - } - - // -------------------------------------------------------------------- - - /** - * Is AJAX request? - * - * Test to see if a request contains the HTTP_X_REQUESTED_WITH header. - * - * @return bool - */ - public function is_ajax_request() - { - return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); - } - - // -------------------------------------------------------------------- - - /** - * Is CLI request? - * - * Test to see if a request was made from the command line. - * - * @deprecated 3.0.0 Use is_cli() instead - * @return bool - */ - public function is_cli_request() - { - return is_cli(); - } - - // -------------------------------------------------------------------- - - /** - * Get Request Method - * - * Return the request method - * - * @param bool $upper Whether to return in upper or lower case - * (default: FALSE) - * @return string - */ - public function method($upper = FALSE) - { - return ($upper) - ? strtoupper($this->server('REQUEST_METHOD')) - : strtolower($this->server('REQUEST_METHOD')); - } - - // ------------------------------------------------------------------------ - - /** - * Magic __get() - * - * Allows read access to protected properties - * - * @param string $name - * @return mixed - */ - public function __get($name) - { - if ($name === 'raw_input_stream') - { - isset($this->_raw_input_stream) OR $this->_raw_input_stream = file_get_contents('php://input'); - return $this->_raw_input_stream; - } - elseif ($name === 'ip_address') - { - return $this->ip_address; - } - } - -} diff --git a/finecms/finecms/system/core/Lang.php b/finecms/finecms/system/core/Lang.php deleted file mode 100644 index 569b023..0000000 --- a/finecms/finecms/system/core/Lang.php +++ /dev/null @@ -1,203 +0,0 @@ -load($value, $idiom, $return, $add_suffix, $alt_path); - } - - return; - } - - $langfile = str_replace('.php', '', $langfile); - - if ($add_suffix === TRUE) - { - $langfile = preg_replace('/_lang$/', '', $langfile).'_lang'; - } - - $langfile .= '.php'; - - if (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom)) - { - $config =& get_config(); - $idiom = empty($config['language']) ? 'english' : $config['language']; - } - - if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) - { - return; - } - - // Load the base file, so any others found can override it - $basepath = BASEPATH.'language/'.$idiom.'/'.$langfile; - if (($found = file_exists($basepath)) === TRUE) - { - include($basepath); - } - - // Do we have an alternative path to look in? - if ($alt_path !== '') - { - $alt_path .= 'language/'.$idiom.'/'.$langfile; - if (file_exists($alt_path)) - { - include($alt_path); - $found = TRUE; - } - } - else - { - foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) - { - $package_path .= 'language/'.$idiom.'/'.$langfile; - if ($basepath !== $package_path && file_exists($package_path)) - { - include($package_path); - $found = TRUE; - break; - } - } - } - - if ($found !== TRUE) - { - show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); - } - - if ( ! isset($lang) OR ! is_array($lang)) - { - log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); - - if ($return === TRUE) - { - return array(); - } - return; - } - - if ($return === TRUE) - { - return $lang; - } - - $this->is_loaded[$langfile] = $idiom; - $this->language = array_merge($this->language, $lang); - - log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Language line - * - * Fetches a single line of text from the language array - * - * @param string $line Language line key - * @param bool $log_errors Whether to log an error message if the line is not found - * @return string Translation - */ - public function line($line, $log_errors = TRUE) - { - $value = isset($this->language[$line]) ? $this->language[$line] : FALSE; - - // Because killer robots like unicorns! - if ($value === FALSE && $log_errors === TRUE) - { - log_message('error', 'Could not find the language line "'.$line.'"'); - } - - return $value; - } - -} diff --git a/finecms/finecms/system/core/Loader.php b/finecms/finecms/system/core/Loader.php deleted file mode 100644 index 5ed6adb..0000000 --- a/finecms/finecms/system/core/Loader.php +++ /dev/null @@ -1,1411 +0,0 @@ - TRUE); - - /** - * List of paths to load libraries from - * - * @var array - */ - protected $_ci_library_paths = array(APPPATH, BASEPATH); - - /** - * List of paths to load models from - * - * @var array - */ - protected $_ci_model_paths = array(APPPATH); - - /** - * List of paths to load helpers from - * - * @var array - */ - protected $_ci_helper_paths = array(APPPATH, BASEPATH); - - /** - * List of cached variables - * - * @var array - */ - protected $_ci_cached_vars = array(); - - /** - * List of loaded classes - * - * @var array - */ - protected $_ci_classes = array(); - - /** - * List of loaded models - * - * @var array - */ - protected $_ci_models = array(); - - /** - * List of loaded helpers - * - * @var array - */ - protected $_ci_helpers = array(); - - /** - * List of class name mappings - * - * @var array - */ - protected $_ci_varmap = array( - 'unit_test' => 'unit', - 'user_agent' => 'agent' - ); - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * Sets component load paths, gets the initial output buffering level. - * - * @return void - */ - public function __construct() - { - $this->_ci_ob_level = ob_get_level(); - $this->_ci_classes =& is_loaded(); - - log_message('info', 'Loader Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Initializer - * - * @todo Figure out a way to move this to the constructor - * without breaking *package_path*() methods. - * @uses CI_Loader::_ci_autoloader() - * @used-by CI_Controller::__construct() - * @return void - */ - public function initialize() - { - $this->_ci_autoloader(); - } - - // -------------------------------------------------------------------- - - /** - * Is Loaded - * - * A utility method to test if a class is in the self::$_ci_classes array. - * - * @used-by Mainly used by Form Helper function _get_validation_object(). - * - * @param string $class Class name to check for - * @return string|bool Class object name if loaded or FALSE - */ - public function is_loaded($class) - { - return array_search(ucfirst($class), $this->_ci_classes, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Library Loader - * - * Loads and instantiates libraries. - * Designed to be called from application controllers. - * - * @param string $library Library name - * @param array $params Optional parameters to pass to the library class constructor - * @param string $object_name An optional object name to assign to - * @return object - */ - public function library($library, $params = NULL, $object_name = NULL) - { - if (empty($library)) - { - return $this; - } - elseif (is_array($library)) - { - foreach ($library as $key => $value) - { - if (is_int($key)) - { - $this->library($value, $params); - } - else - { - $this->library($key, $params, $value); - } - } - - return $this; - } - - if ($params !== NULL && ! is_array($params)) - { - $params = NULL; - } - - $this->_ci_load_library($library, $params, $object_name); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Model Loader - * - * Loads and instantiates models. - * - * @param string $model Model name - * @param string $name An optional object name to assign to - * @param bool $db_conn An optional database connection configuration to initialize - * @return object - */ - public function model($model, $name = '', $db_conn = FALSE) - { - if (empty($model)) - { - return $this; - } - elseif (is_array($model)) - { - foreach ($model as $key => $value) - { - is_int($key) ? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn); - } - - return $this; - } - - $path = ''; - - // Is the model in a sub-folder? If so, parse out the filename and path. - if (($last_slash = strrpos($model, '/')) !== FALSE) - { - // The path is in front of the last slash - $path = substr($model, 0, ++$last_slash); - - // And the model name behind it - $model = substr($model, $last_slash); - } - - if (empty($name)) - { - $name = $model; - } - - if (in_array($name, $this->_ci_models, TRUE)) - { - return $this; - } - - $CI =& get_instance(); - if (isset($CI->$name)) - { - throw new RuntimeException('The model name you are loading is the name of a resource that is already being used: '.$name); - } - - if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE)) - { - if ($db_conn === TRUE) - { - $db_conn = ''; - } - - $this->database($db_conn, FALSE, TRUE); - } - - // Note: All of the code under this condition used to be just: - // - // load_class('Model', 'core'); - // - // However, load_class() instantiates classes - // to cache them for later use and that prevents - // MY_Model from being an abstract class and is - // sub-optimal otherwise anyway. - if ( ! class_exists('CI_Model', FALSE)) - { - $app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; - if (file_exists($app_path.'Model.php')) - { - require_once($app_path.'Model.php'); - if ( ! class_exists('CI_Model', FALSE)) - { - throw new RuntimeException($app_path."Model.php exists, but doesn't declare class CI_Model"); - } - } - elseif ( ! class_exists('CI_Model', FALSE)) - { - require_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php'); - } - - $class = config_item('subclass_prefix').'Model'; - if (file_exists($app_path.$class.'.php')) - { - require_once($app_path.$class.'.php'); - if ( ! class_exists($class, FALSE)) - { - throw new RuntimeException($app_path.$class.".php exists, but doesn't declare class ".$class); - } - } - } - - $model = ucfirst($model); - if ( ! class_exists($model, FALSE)) - { - foreach ($this->_ci_model_paths as $mod_path) - { - if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) - { - continue; - } - - require_once($mod_path.'models/'.$path.$model.'.php'); - if ( ! class_exists($model, FALSE)) - { - throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model); - } - - break; - } - - if ( ! class_exists($model, FALSE)) - { - throw new RuntimeException('Unable to locate the model you have specified: '.$model); - } - } - elseif ( ! is_subclass_of($model, 'CI_Model')) - { - throw new RuntimeException("Class ".$model." already exists and doesn't extend CI_Model"); - } - - $this->_ci_models[] = $name; - $CI->$name = new $model(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Database Loader - * - * @param mixed $params Database configuration options - * @param bool $return Whether to return the database object - * @param bool $query_builder Whether to enable Query Builder - * (overrides the configuration setting) - * - * @return object|bool Database object if $return is set to TRUE, - * FALSE on failure, CI_Loader instance in any other case - */ - public function database($params = '', $return = FALSE, $query_builder = NULL) - { - // Grab the super object - $CI =& get_instance(); - - // Do we even need to load the database class? - if ($return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id)) - { - return FALSE; - } - - require_once(BASEPATH.'database/DB.php'); - - if ($return === TRUE) - { - return DB($params, $query_builder); - } - - // Initialize the db variable. Needed to prevent - // reference errors with some configurations - $CI->db = ''; - - // Load the DB class - $CI->db =& DB($params, $query_builder); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Load the Database Utilities Class - * - * @param object $db Database object - * @param bool $return Whether to return the DB Utilities class object or not - * @return object - */ - public function dbutil($db = NULL, $return = FALSE) - { - $CI =& get_instance(); - - if ( ! is_object($db) OR ! ($db instanceof CI_DB)) - { - class_exists('CI_DB', FALSE) OR $this->database(); - $db =& $CI->db; - } - - require_once(BASEPATH.'database/DB_utility.php'); - require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_utility.php'); - $class = 'CI_DB_'.$db->dbdriver.'_utility'; - - if ($return === TRUE) - { - return new $class($db); - } - - $CI->dbutil = new $class($db); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Load the Database Forge Class - * - * @param object $db Database object - * @param bool $return Whether to return the DB Forge class object or not - * @return object - */ - public function dbforge($db = NULL, $return = FALSE) - { - $CI =& get_instance(); - if ( ! is_object($db) OR ! ($db instanceof CI_DB)) - { - class_exists('CI_DB', FALSE) OR $this->database(); - $db =& $CI->db; - } - - require_once(BASEPATH.'database/DB_forge.php'); - require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_forge.php'); - - if ( ! empty($db->subdriver)) - { - $driver_path = BASEPATH.'database/drivers/'.$db->dbdriver.'/subdrivers/'.$db->dbdriver.'_'.$db->subdriver.'_forge.php'; - if (file_exists($driver_path)) - { - require_once($driver_path); - $class = 'CI_DB_'.$db->dbdriver.'_'.$db->subdriver.'_forge'; - } - } - else - { - $class = 'CI_DB_'.$db->dbdriver.'_forge'; - } - - if ($return === TRUE) - { - return new $class($db); - } - - $CI->dbforge = new $class($db); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * View Loader - * - * Loads "view" files. - * - * @param string $view View name - * @param array $vars An associative array of data - * to be extracted for use in the view - * @param bool $return Whether to return the view output - * or leave it to the Output class - * @return object|string - */ - public function view($view, $vars = array(), $return = FALSE) - { - return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return)); - } - - // -------------------------------------------------------------------- - - /** - * Generic File Loader - * - * @param string $path File path - * @param bool $return Whether to return the file output - * @return object|string - */ - public function file($path, $return = FALSE) - { - return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return)); - } - - // -------------------------------------------------------------------- - - /** - * Set Variables - * - * Once variables are set they become available within - * the controller class and its "view" files. - * - * @param array|object|string $vars - * An associative array or object containing values - * to be set, or a value's name if string - * @param string $val Value to set, only used if $vars is a string - * @return object - */ - public function vars($vars, $val = '') - { - $vars = is_string($vars) - ? array($vars => $val) - : $this->_ci_prepare_view_vars($vars); - - foreach ($vars as $key => $val) - { - $this->_ci_cached_vars[$key] = $val; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Clear Cached Variables - * - * Clears the cached variables. - * - * @return CI_Loader - */ - public function clear_vars() - { - $this->_ci_cached_vars = array(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get Variable - * - * Check if a variable is set and retrieve it. - * - * @param string $key Variable name - * @return mixed The variable or NULL if not found - */ - public function get_var($key) - { - return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Get Variables - * - * Retrieves all loaded variables. - * - * @return array - */ - public function get_vars() - { - return $this->_ci_cached_vars; - } - - // -------------------------------------------------------------------- - - /** - * Helper Loader - * - * @param string|string[] $helpers Helper name(s) - * @return object - */ - public function helper($helpers = array()) - { - is_array($helpers) OR $helpers = array($helpers); - foreach ($helpers as &$helper) - { - $filename = basename($helper); - $filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename)); - $filename = strtolower(preg_replace('#(_helper)?(\.php)?$#i', '', $filename)).'_helper'; - $helper = $filepath.$filename; - - if (isset($this->_ci_helpers[$helper])) - { - continue; - } - - // Is this a helper extension request? - $ext_helper = config_item('subclass_prefix').$filename; - $ext_loaded = FALSE; - foreach ($this->_ci_helper_paths as $path) - { - if (file_exists($path.'helpers/'.$ext_helper.'.php')) - { - include_once($path.'helpers/'.$ext_helper.'.php'); - $ext_loaded = TRUE; - } - } - - // If we have loaded extensions - check if the base one is here - if ($ext_loaded === TRUE) - { - $base_helper = BASEPATH.'helpers/'.$helper.'.php'; - if ( ! file_exists($base_helper)) - { - show_error('Unable to load the requested file: helpers/'.$helper.'.php'); - } - - include_once($base_helper); - $this->_ci_helpers[$helper] = TRUE; - log_message('info', 'Helper loaded: '.$helper); - continue; - } - - // No extensions found ... try loading regular helpers and/or overrides - foreach ($this->_ci_helper_paths as $path) - { - if (file_exists($path.'helpers/'.$helper.'.php')) - { - include_once($path.'helpers/'.$helper.'.php'); - - $this->_ci_helpers[$helper] = TRUE; - log_message('info', 'Helper loaded: '.$helper); - break; - } - } - - // unable to load the helper - if ( ! isset($this->_ci_helpers[$helper])) - { - show_error('Unable to load the requested file: helpers/'.$helper.'.php'); - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Load Helpers - * - * An alias for the helper() method in case the developer has - * written the plural form of it. - * - * @uses CI_Loader::helper() - * @param string|string[] $helpers Helper name(s) - * @return object - */ - public function helpers($helpers = array()) - { - return $this->helper($helpers); - } - - // -------------------------------------------------------------------- - - /** - * Language Loader - * - * Loads language files. - * - * @param string|string[] $files List of language file names to load - * @param string Language name - * @return object - */ - public function language($files, $lang = '') - { - get_instance()->lang->load($files, $lang); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Config Loader - * - * Loads a config file (an alias for CI_Config::load()). - * - * @uses CI_Config::load() - * @param string $file Configuration file name - * @param bool $use_sections Whether configuration values should be loaded into their own section - * @param bool $fail_gracefully Whether to just return FALSE or display an error message - * @return bool TRUE if the file was loaded correctly or FALSE on failure - */ - public function config($file, $use_sections = FALSE, $fail_gracefully = FALSE) - { - return get_instance()->config->load($file, $use_sections, $fail_gracefully); - } - - // -------------------------------------------------------------------- - - /** - * Driver Loader - * - * Loads a driver library. - * - * @param string|string[] $library Driver name(s) - * @param array $params Optional parameters to pass to the driver - * @param string $object_name An optional object name to assign to - * - * @return object|bool Object or FALSE on failure if $library is a string - * and $object_name is set. CI_Loader instance otherwise. - */ - public function driver($library, $params = NULL, $object_name = NULL) - { - if (is_array($library)) - { - foreach ($library as $key => $value) - { - if (is_int($key)) - { - $this->driver($value, $params); - } - else - { - $this->driver($key, $params, $value); - } - } - - return $this; - } - elseif (empty($library)) - { - return FALSE; - } - - if ( ! class_exists('CI_Driver_Library', FALSE)) - { - // We aren't instantiating an object here, just making the base class available - require BASEPATH.'libraries/Driver.php'; - } - - // We can save the loader some time since Drivers will *always* be in a subfolder, - // and typically identically named to the library - if ( ! strpos($library, '/')) - { - $library = ucfirst($library).'/'.$library; - } - - return $this->library($library, $params, $object_name); - } - - // -------------------------------------------------------------------- - - /** - * Add Package Path - * - * Prepends a parent path to the library, model, helper and config - * path arrays. - * - * @see CI_Loader::$_ci_library_paths - * @see CI_Loader::$_ci_model_paths - * @see CI_Loader::$_ci_helper_paths - * @see CI_Config::$_config_paths - * - * @param string $path Path to add - * @param bool $view_cascade (default: TRUE) - * @return object - */ - public function add_package_path($path, $view_cascade = TRUE) - { - $path = rtrim($path, '/').'/'; - - array_unshift($this->_ci_library_paths, $path); - array_unshift($this->_ci_model_paths, $path); - array_unshift($this->_ci_helper_paths, $path); - - $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; - - // Add config file path - $config =& $this->_ci_get_component('config'); - $config->_config_paths[] = $path; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get Package Paths - * - * Return a list of all package paths. - * - * @param bool $include_base Whether to include BASEPATH (default: FALSE) - * @return array - */ - public function get_package_paths($include_base = FALSE) - { - return ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths; - } - - // -------------------------------------------------------------------- - - /** - * Remove Package Path - * - * Remove a path from the library, model, helper and/or config - * path arrays if it exists. If no path is provided, the most recently - * added path will be removed removed. - * - * @param string $path Path to remove - * @return object - */ - public function remove_package_path($path = '') - { - $config =& $this->_ci_get_component('config'); - - if ($path === '') - { - array_shift($this->_ci_library_paths); - array_shift($this->_ci_model_paths); - array_shift($this->_ci_helper_paths); - array_shift($this->_ci_view_paths); - array_pop($config->_config_paths); - } - else - { - $path = rtrim($path, '/').'/'; - foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var) - { - if (($key = array_search($path, $this->{$var})) !== FALSE) - { - unset($this->{$var}[$key]); - } - } - - if (isset($this->_ci_view_paths[$path.'views/'])) - { - unset($this->_ci_view_paths[$path.'views/']); - } - - if (($key = array_search($path, $config->_config_paths)) !== FALSE) - { - unset($config->_config_paths[$key]); - } - } - - // make sure the application default paths are still in the array - $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH))); - $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH))); - $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH))); - $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE)); - $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH))); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Data Loader - * - * Used to load views and files. - * - * Variables are prefixed with _ci_ to avoid symbol collision with - * variables made available to view files. - * - * @used-by CI_Loader::view() - * @used-by CI_Loader::file() - * @param array $_ci_data Data to load - * @return object - */ - protected function _ci_load($_ci_data) - { - // Set the default data variables - foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) - { - $$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE; - } - - $file_exists = FALSE; - - // Set the path to the requested file - if (is_string($_ci_path) && $_ci_path !== '') - { - $_ci_x = explode('/', $_ci_path); - $_ci_file = end($_ci_x); - } - else - { - $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); - $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view; - - foreach ($this->_ci_view_paths as $_ci_view_file => $cascade) - { - if (file_exists($_ci_view_file.$_ci_file)) - { - $_ci_path = $_ci_view_file.$_ci_file; - $file_exists = TRUE; - break; - } - - if ( ! $cascade) - { - break; - } - } - } - - if ( ! $file_exists && ! file_exists($_ci_path)) - { - show_error('Unable to load the requested file: '.$_ci_file); - } - - // This allows anything loaded using $this->load (views, files, etc.) - // to become accessible from within the Controller and Model functions. - $_ci_CI =& get_instance(); - foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) - { - if ( ! isset($this->$_ci_key)) - { - $this->$_ci_key =& $_ci_CI->$_ci_key; - } - } - - /* - * Extract and cache variables - * - * You can either set variables using the dedicated $this->load->vars() - * function or via the second parameter of this function. We'll merge - * the two types and cache them so that views that are embedded within - * other views can have access to these variables. - */ - empty($_ci_vars) OR $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); - extract($this->_ci_cached_vars); - - /* - * Buffer the output - * - * We buffer the output for two reasons: - * 1. Speed. You get a significant speed boost. - * 2. So that the final rendered template can be post-processed by - * the output class. Why do we need post processing? For one thing, - * in order to show the elapsed page load time. Unless we can - * intercept the content right before it's sent to the browser and - * then stop the timer it won't be accurate. - */ - ob_start(); - - // If the PHP installation does not support short tags we'll - // do a little string replacement, changing the short tags - // to standard PHP echo statements. - if ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE) - { - echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace(' $this->_ci_ob_level + 1) - { - ob_end_flush(); - } - else - { - $_ci_CI->output->append_output(ob_get_contents()); - @ob_end_clean(); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Library Loader - * - * @used-by CI_Loader::library() - * @uses CI_Loader::_ci_init_library() - * - * @param string $class Class name to load - * @param mixed $params Optional parameters to pass to the class constructor - * @param string $object_name Optional object name to assign to - * @return void - */ - protected function _ci_load_library($class, $params = NULL, $object_name = NULL) - { - // Get the class name, and while we're at it trim any slashes. - // The directory path can be included as part of the class name, - // but we don't want a leading slash - $class = str_replace('.php', '', trim($class, '/')); - - // Was the path included with the class name? - // We look for a slash to determine this - if (($last_slash = strrpos($class, '/')) !== FALSE) - { - // Extract the path - $subdir = substr($class, 0, ++$last_slash); - - // Get the filename from the path - $class = substr($class, $last_slash); - } - else - { - $subdir = ''; - } - - $class = ucfirst($class); - - // Is this a stock library? There are a few special conditions if so ... - if (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php')) - { - return $this->_ci_load_stock_library($class, $subdir, $params, $object_name); - } - - // Let's search for the requested library file and load it. - foreach ($this->_ci_library_paths as $path) - { - // BASEPATH has already been checked for - if ($path === BASEPATH) - { - continue; - } - - $filepath = $path.'libraries/'.$subdir.$class.'.php'; - - // Safety: Was the class already loaded by a previous call? - if (class_exists($class, FALSE)) - { - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ($object_name !== NULL) - { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_library($class, '', $params, $object_name); - } - } - - log_message('debug', $class.' class already loaded. Second attempt ignored.'); - return; - } - // Does the file exist? No? Bummer... - elseif ( ! file_exists($filepath)) - { - continue; - } - - include_once($filepath); - return $this->_ci_init_library($class, '', $params, $object_name); - } - - // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? - if ($subdir === '') - { - return $this->_ci_load_library($class.'/'.$class, $params, $object_name); - } - - // If we got this far we were unable to find the requested class. - log_message('error', 'Unable to load the requested class: '.$class); - show_error('Unable to load the requested class: '.$class); - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Stock Library Loader - * - * @used-by CI_Loader::_ci_load_library() - * @uses CI_Loader::_ci_init_library() - * - * @param string $library_name Library name to load - * @param string $file_path Path to the library filename, relative to libraries/ - * @param mixed $params Optional parameters to pass to the class constructor - * @param string $object_name Optional object name to assign to - * @return void - */ - protected function _ci_load_stock_library($library_name, $file_path, $params, $object_name) - { - $prefix = 'CI_'; - - if (class_exists($prefix.$library_name, FALSE)) - { - if (class_exists(config_item('subclass_prefix').$library_name, FALSE)) - { - $prefix = config_item('subclass_prefix'); - } - - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ($object_name !== NULL) - { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_library($library_name, $prefix, $params, $object_name); - } - } - - log_message('debug', $library_name.' class already loaded. Second attempt ignored.'); - return; - } - - $paths = $this->_ci_library_paths; - array_pop($paths); // BASEPATH - array_pop($paths); // APPPATH (needs to be the first path checked) - array_unshift($paths, APPPATH); - - foreach ($paths as $path) - { - if (file_exists($path = $path.'libraries/'.$file_path.$library_name.'.php')) - { - // Override - include_once($path); - if (class_exists($prefix.$library_name, FALSE)) - { - return $this->_ci_init_library($library_name, $prefix, $params, $object_name); - } - else - { - log_message('debug', $path.' exists, but does not declare '.$prefix.$library_name); - } - } - } - - include_once(BASEPATH.'libraries/'.$file_path.$library_name.'.php'); - - // Check for extensions - $subclass = config_item('subclass_prefix').$library_name; - foreach ($paths as $path) - { - if (file_exists($path = $path.'libraries/'.$file_path.$subclass.'.php')) - { - include_once($path); - if (class_exists($subclass, FALSE)) - { - $prefix = config_item('subclass_prefix'); - break; - } - else - { - log_message('debug', $path.' exists, but does not declare '.$subclass); - } - } - } - - return $this->_ci_init_library($library_name, $prefix, $params, $object_name); - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Library Instantiator - * - * @used-by CI_Loader::_ci_load_stock_library() - * @used-by CI_Loader::_ci_load_library() - * - * @param string $class Class name - * @param string $prefix Class name prefix - * @param array|null|bool $config Optional configuration to pass to the class constructor: - * FALSE to skip; - * NULL to search in config paths; - * array containing configuration data - * @param string $object_name Optional object name to assign to - * @return void - */ - protected function _ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL) - { - // Is there an associated config file for this class? Note: these should always be lowercase - if ($config === NULL) - { - // Fetch the config paths containing any package paths - $config_component = $this->_ci_get_component('config'); - - if (is_array($config_component->_config_paths)) - { - $found = FALSE; - foreach ($config_component->_config_paths as $path) - { - // We test for both uppercase and lowercase, for servers that - // are case-sensitive with regard to file names. Load global first, - // override with environment next - if (file_exists($path.'config/'.strtolower($class).'.php')) - { - include($path.'config/'.strtolower($class).'.php'); - $found = TRUE; - } - elseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php')) - { - include($path.'config/'.ucfirst(strtolower($class)).'.php'); - $found = TRUE; - } - - if (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php')) - { - include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'); - $found = TRUE; - } - elseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php')) - { - include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'); - $found = TRUE; - } - - // Break on the first found configuration, thus package - // files are not overridden by default paths - if ($found === TRUE) - { - break; - } - } - } - } - - $class_name = $prefix.$class; - - // Is the class name valid? - if ( ! class_exists($class_name, FALSE)) - { - log_message('error', 'Non-existent class: '.$class_name); - show_error('Non-existent class: '.$class_name); - } - - // Set the variable name we will assign the class to - // Was a custom class name supplied? If so we'll use it - if (empty($object_name)) - { - $object_name = strtolower($class); - if (isset($this->_ci_varmap[$object_name])) - { - $object_name = $this->_ci_varmap[$object_name]; - } - } - - // Don't overwrite existing properties - $CI =& get_instance(); - if (isset($CI->$object_name)) - { - if ($CI->$object_name instanceof $class_name) - { - log_message('debug', $class_name." has already been instantiated as '".$object_name."'. Second attempt aborted."); - return; - } - - show_error("Resource '".$object_name."' already exists and is not a ".$class_name." instance."); - } - - // Save the class name and object name - $this->_ci_classes[$object_name] = $class; - - // Instantiate the class - $CI->$object_name = isset($config) - ? new $class_name($config) - : new $class_name(); - } - - // -------------------------------------------------------------------- - - /** - * CI Autoloader - * - * Loads component listed in the config/autoload.php file. - * - * @used-by CI_Loader::initialize() - * @return void - */ - protected function _ci_autoloader() - { - if (file_exists(APPPATH.'config/autoload.php')) - { - include(APPPATH.'config/autoload.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'); - } - - if ( ! isset($autoload)) - { - return; - } - - // Autoload packages - if (isset($autoload['packages'])) - { - foreach ($autoload['packages'] as $package_path) - { - $this->add_package_path($package_path); - } - } - - // Load any custom config file - if (count($autoload['config']) > 0) - { - foreach ($autoload['config'] as $val) - { - $this->config($val); - } - } - - // Autoload helpers and languages - foreach (array('helper', 'language') as $type) - { - if (isset($autoload[$type]) && count($autoload[$type]) > 0) - { - $this->$type($autoload[$type]); - } - } - - // Autoload drivers - if (isset($autoload['drivers'])) - { - $this->driver($autoload['drivers']); - } - - // Load libraries - if (isset($autoload['libraries']) && count($autoload['libraries']) > 0) - { - // Load the database driver. - if (in_array('database', $autoload['libraries'])) - { - $this->database(); - $autoload['libraries'] = array_diff($autoload['libraries'], array('database')); - } - - // Load all other libraries - $this->library($autoload['libraries']); - } - - // Autoload models - if (isset($autoload['model'])) - { - $this->model($autoload['model']); - } - } - - // -------------------------------------------------------------------- - - /** - * Prepare variables for _ci_vars, to be later extract()-ed inside views - * - * Converts objects to associative arrays and filters-out internal - * variable names (i.e. keys prefixed with '_ci_'). - * - * @param mixed $vars - * @return array - */ - protected function _ci_prepare_view_vars($vars) - { - if ( ! is_array($vars)) - { - $vars = is_object($vars) - ? get_object_vars($vars) - : array(); - } - - foreach (array_keys($vars) as $key) - { - if (strncmp($key, '_ci_', 4) === 0) - { - unset($vars[$key]); - } - } - - return $vars; - } - - // -------------------------------------------------------------------- - - /** - * CI Component getter - * - * Get a reference to a specific library or model. - * - * @param string $component Component name - * @return bool - */ - protected function &_ci_get_component($component) - { - $CI =& get_instance(); - return $CI->$component; - } -} diff --git a/finecms/finecms/system/core/Log.php b/finecms/finecms/system/core/Log.php deleted file mode 100644 index d443aed..0000000 --- a/finecms/finecms/system/core/Log.php +++ /dev/null @@ -1,296 +0,0 @@ - 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); - - /** - * mbstring.func_overload flag - * - * @var bool - */ - protected static $func_overload; - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * @return void - */ - public function __construct() - { - $config =& get_config(); - - isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - - $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; - $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') - ? ltrim($config['log_file_extension'], '.') : 'php'; - - file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE); - - if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) - { - $this->_enabled = FALSE; - } - - if (is_numeric($config['log_threshold'])) - { - $this->_threshold = (int) $config['log_threshold']; - } - elseif (is_array($config['log_threshold'])) - { - $this->_threshold = 0; - $this->_threshold_array = array_flip($config['log_threshold']); - } - - if ( ! empty($config['log_date_format'])) - { - $this->_date_fmt = $config['log_date_format']; - } - - if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions'])) - { - $this->_file_permissions = $config['log_file_permissions']; - } - } - - // -------------------------------------------------------------------- - - /** - * Write Log File - * - * Generally this function will be called using the global log_message() function - * - * @param string $level The error level: 'error', 'debug' or 'info' - * @param string $msg The error message - * @return bool - */ - public function write_log($level, $msg) - { - if ($this->_enabled === FALSE) - { - return FALSE; - } - - $level = strtoupper($level); - - if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold)) - && ! isset($this->_threshold_array[$this->_levels[$level]])) - { - return FALSE; - } - - $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext; - $message = ''; - - if ( ! file_exists($filepath)) - { - $newfile = TRUE; - // Only add protection to php files - if ($this->_file_ext === 'php') - { - $message .= "\n\n"; - } - } - - if ( ! $fp = @fopen($filepath, 'ab')) - { - return FALSE; - } - - flock($fp, LOCK_EX); - - // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format - if (strpos($this->_date_fmt, 'u') !== FALSE) - { - $microtime_full = microtime(TRUE); - $microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000); - $date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full)); - $date = $date->format($this->_date_fmt); - } - else - { - $date = date($this->_date_fmt); - } - - $message .= $this->_format_line($level, $date, $msg); - - for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result) - { - if (($result = fwrite($fp, self::substr($message, $written))) === FALSE) - { - break; - } - } - - flock($fp, LOCK_UN); - fclose($fp); - - if (isset($newfile) && $newfile === TRUE) - { - chmod($filepath, $this->_file_permissions); - } - - return is_int($result); - } - - // -------------------------------------------------------------------- - - /** - * Format the log line. - * - * This is for extensibility of log formatting - * If you want to change the log format, extend the CI_Log class and override this method - * - * @param string $level The error level - * @param string $date Formatted date string - * @param string $message The log message - * @return string Formatted log line with a new line character '\n' at the end - */ - protected function _format_line($level, $date, $message) - { - return $level.' - '.$date.' --> '.$message."\n"; - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe strlen() - * - * @param string $str - * @return int - */ - protected static function strlen($str) - { - return (self::$func_overload) - ? mb_strlen($str, '8bit') - : strlen($str); - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe substr() - * - * @param string $str - * @param int $start - * @param int $length - * @return string - */ - protected static function substr($str, $start, $length = NULL) - { - if (self::$func_overload) - { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); - return mb_substr($str, $start, $length, '8bit'); - } - - return isset($length) - ? substr($str, $start, $length) - : substr($str, $start); - } -} diff --git a/finecms/finecms/system/core/Model.php b/finecms/finecms/system/core/Model.php deleted file mode 100644 index c809e7b..0000000 --- a/finecms/finecms/system/core/Model.php +++ /dev/null @@ -1,80 +0,0 @@ -$key; - } - -} diff --git a/finecms/finecms/system/core/Output.php b/finecms/finecms/system/core/Output.php deleted file mode 100644 index a3155fe..0000000 --- a/finecms/finecms/system/core/Output.php +++ /dev/null @@ -1,842 +0,0 @@ -_zlib_oc = (bool) ini_get('zlib.output_compression'); - $this->_compress_output = ( - $this->_zlib_oc === FALSE - && config_item('compress_output') === TRUE - && extension_loaded('zlib') - ); - - isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - - // Get mime types for later - $this->mimes =& get_mimes(); - - log_message('info', 'Output Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Get Output - * - * Returns the current output string. - * - * @return string - */ - public function get_output() - { - return $this->final_output; - } - - // -------------------------------------------------------------------- - - /** - * Set Output - * - * Sets the output string. - * - * @param string $output Output data - * @return CI_Output - */ - public function set_output($output) - { - $this->final_output = $output; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Append Output - * - * Appends data onto the output string. - * - * @param string $output Data to append - * @return CI_Output - */ - public function append_output($output) - { - $this->final_output .= $output; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Header - * - * Lets you set a server header which will be sent with the final output. - * - * Note: If a file is cached, headers will not be sent. - * @todo We need to figure out how to permit headers to be cached. - * - * @param string $header Header - * @param bool $replace Whether to replace the old header value, if already set - * @return CI_Output - */ - public function set_header($header, $replace = TRUE) - { - // If zlib.output_compression is enabled it will compress the output, - // but it will not modify the content-length header to compensate for - // the reduction, causing the browser to hang waiting for more data. - // We'll just skip content-length in those cases. - if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0) - { - return $this; - } - - $this->headers[] = array($header, $replace); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Content-Type Header - * - * @param string $mime_type Extension of the file we're outputting - * @param string $charset Character set (default: NULL) - * @return CI_Output - */ - public function set_content_type($mime_type, $charset = NULL) - { - if (strpos($mime_type, '/') === FALSE) - { - $extension = ltrim($mime_type, '.'); - - // Is this extension supported? - if (isset($this->mimes[$extension])) - { - $mime_type =& $this->mimes[$extension]; - - if (is_array($mime_type)) - { - $mime_type = current($mime_type); - } - } - } - - $this->mime_type = $mime_type; - - if (empty($charset)) - { - $charset = config_item('charset'); - } - - $header = 'Content-Type: '.$mime_type - .(empty($charset) ? '' : '; charset='.$charset); - - $this->headers[] = array($header, TRUE); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get Current Content-Type Header - * - * @return string 'text/html', if not already set - */ - public function get_content_type() - { - for ($i = 0, $c = count($this->headers); $i < $c; $i++) - { - if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1) - { - return $content_type; - } - } - - return 'text/html'; - } - - // -------------------------------------------------------------------- - - /** - * Get Header - * - * @param string $header - * @return string - */ - public function get_header($header) - { - // Combine headers already sent with our batched headers - $headers = array_merge( - // We only need [x][0] from our multi-dimensional array - array_map('array_shift', $this->headers), - headers_list() - ); - - if (empty($headers) OR empty($header)) - { - return NULL; - } - - // Count backwards, in order to get the last matching header - for ($c = count($headers) - 1; $c > -1; $c--) - { - if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0) - { - return trim(self::substr($headers[$c], $l+1)); - } - } - - return NULL; - } - - // -------------------------------------------------------------------- - - /** - * Set HTTP Status Header - * - * As of version 1.7.2, this is an alias for common function - * set_status_header(). - * - * @param int $code Status code (default: 200) - * @param string $text Optional message - * @return CI_Output - */ - public function set_status_header($code = 200, $text = '') - { - set_status_header($code, $text); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Enable/disable Profiler - * - * @param bool $val TRUE to enable or FALSE to disable - * @return CI_Output - */ - public function enable_profiler($val = TRUE) - { - $this->enable_profiler = is_bool($val) ? $val : TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Profiler Sections - * - * Allows override of default/config settings for - * Profiler section display. - * - * @param array $sections Profiler sections - * @return CI_Output - */ - public function set_profiler_sections($sections) - { - if (isset($sections['query_toggle_count'])) - { - $this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count']; - unset($sections['query_toggle_count']); - } - - foreach ($sections as $section => $enable) - { - $this->_profiler_sections[$section] = ($enable !== FALSE); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Cache - * - * @param int $time Cache expiration time in minutes - * @return CI_Output - */ - public function cache($time) - { - $this->cache_expiration = is_numeric($time) ? $time : 0; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Display Output - * - * Processes and sends finalized output data to the browser along - * with any server headers and profile data. It also stops benchmark - * timers so the page rendering speed and memory usage can be shown. - * - * Note: All "view" data is automatically put into $this->final_output - * by controller class. - * - * @uses CI_Output::$final_output - * @param string $output Output data override - * @return void - */ - public function _display($output = '') - { - // Note: We use load_class() because we can't use $CI =& get_instance() - // since this function is sometimes called by the caching mechanism, - // which happens before the CI super object is available. - $BM =& load_class('Benchmark', 'core'); - $CFG =& load_class('Config', 'core'); - - // Grab the super object if we can. - if (class_exists('CI_Controller', FALSE)) - { - $CI =& get_instance(); - } - - // -------------------------------------------------------------------- - - // Set the output data - if ($output === '') - { - $output =& $this->final_output; - } - - // -------------------------------------------------------------------- - - // Do we need to write a cache file? Only if the controller does not have its - // own _output() method and we are not dealing with a cache file, which we - // can determine by the existence of the $CI object above - if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) - { - $this->_write_cache($output); - } - - // -------------------------------------------------------------------- - - // Parse out the elapsed time and memory usage, - // then swap the pseudo-variables with the data - - $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); - - if ($this->parse_exec_vars === TRUE) - { - $memory = round(memory_get_usage() / 1024 / 1024, 2).'MB'; - $output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output); - } - - // -------------------------------------------------------------------- - - // Is compression requested? - if (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed - && $this->_compress_output === TRUE - && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) - { - ob_start('ob_gzhandler'); - } - - // -------------------------------------------------------------------- - - // Are there any server headers to send? - if (count($this->headers) > 0) - { - foreach ($this->headers as $header) - { - @header($header[0], $header[1]); - } - } - - // -------------------------------------------------------------------- - - // Does the $CI object exist? - // If not we know we are dealing with a cache file so we'll - // simply echo out the data and exit. - if ( ! isset($CI)) - { - if ($this->_compress_output === TRUE) - { - if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) - { - header('Content-Encoding: gzip'); - header('Content-Length: '.self::strlen($output)); - } - else - { - // User agent doesn't support gzip compression, - // so we'll have to decompress our cache - $output = gzinflate(self::substr($output, 10, -8)); - } - } - - echo $output; - log_message('info', 'Final output sent to browser'); - log_message('debug', 'Total execution time: '.$elapsed); - return; - } - - // -------------------------------------------------------------------- - - // Do we need to generate profile data? - // If so, load the Profile class and run it. - if ($this->enable_profiler === TRUE) - { - $CI->load->library('profiler'); - if ( ! empty($this->_profiler_sections)) - { - $CI->profiler->set_sections($this->_profiler_sections); - } - - // If the output data contains closing and tags - // we will remove them and add them back after we insert the profile data - $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); - if ($count > 0) - { - $output .= ''; - } - } - - // Does the controller contain a function named _output()? - // If so send the output there. Otherwise, echo it. - if (method_exists($CI, '_output')) - { - $CI->_output($output); - } - else - { - echo $output; // Send it to the browser! - } - - log_message('info', 'Final output sent to browser'); - log_message('debug', 'Total execution time: '.$elapsed); - } - - // -------------------------------------------------------------------- - - /** - * Write Cache - * - * @param string $output Output data to cache - * @return void - */ - public function _write_cache($output) - { - $CI =& get_instance(); - $path = $CI->config->item('cache_path'); - $cache_path = ($path === '') ? APPPATH.'cache/' : $path; - - if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) - { - log_message('error', 'Unable to write cache file: '.$cache_path); - return; - } - - $uri = $CI->config->item('base_url') - .$CI->config->item('index_page') - .$CI->uri->uri_string(); - - if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) - { - if (is_array($cache_query_string)) - { - $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); - } - else - { - $uri .= '?'.$_SERVER['QUERY_STRING']; - } - } - - $cache_path .= md5($uri); - - if ( ! $fp = @fopen($cache_path, 'w+b')) - { - log_message('error', 'Unable to write cache file: '.$cache_path); - return; - } - - if ( ! flock($fp, LOCK_EX)) - { - log_message('error', 'Unable to secure a file lock for file at: '.$cache_path); - fclose($fp); - return; - } - - // If output compression is enabled, compress the cache - // itself, so that we don't have to do that each time - // we're serving it - if ($this->_compress_output === TRUE) - { - $output = gzencode($output); - - if ($this->get_header('content-type') === NULL) - { - $this->set_content_type($this->mime_type); - } - } - - $expire = time() + ($this->cache_expiration * 60); - - // Put together our serialized info. - $cache_info = serialize(array( - 'expire' => $expire, - 'headers' => $this->headers - )); - - $output = $cache_info.'ENDCI--->'.$output; - - for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result) - { - if (($result = fwrite($fp, self::substr($output, $written))) === FALSE) - { - break; - } - } - - flock($fp, LOCK_UN); - fclose($fp); - - if ( ! is_int($result)) - { - @unlink($cache_path); - log_message('error', 'Unable to write the complete cache content at: '.$cache_path); - return; - } - - chmod($cache_path, 0640); - log_message('debug', 'Cache file written: '.$cache_path); - - // Send HTTP cache-control headers to browser to match file cache settings. - $this->set_cache_header($_SERVER['REQUEST_TIME'], $expire); - } - - // -------------------------------------------------------------------- - - /** - * Update/serve cached output - * - * @uses CI_Config - * @uses CI_URI - * - * @param object &$CFG CI_Config class instance - * @param object &$URI CI_URI class instance - * @return bool TRUE on success or FALSE on failure - */ - public function _display_cache(&$CFG, &$URI) - { - $cache_path = ($CFG->item('cache_path') === '') ? APPPATH.'cache/' : $CFG->item('cache_path'); - - // Build the file path. The file name is an MD5 hash of the full URI - $uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string; - - if (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) - { - if (is_array($cache_query_string)) - { - $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); - } - else - { - $uri .= '?'.$_SERVER['QUERY_STRING']; - } - } - - $filepath = $cache_path.md5($uri); - - if ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb')) - { - return FALSE; - } - - flock($fp, LOCK_SH); - - $cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : ''; - - flock($fp, LOCK_UN); - fclose($fp); - - // Look for embedded serialized file info. - if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match)) - { - return FALSE; - } - - $cache_info = unserialize($match[1]); - $expire = $cache_info['expire']; - - $last_modified = filemtime($filepath); - - // Has the file expired? - if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path)) - { - // If so we'll delete it. - @unlink($filepath); - log_message('debug', 'Cache file has expired. File deleted.'); - return FALSE; - } - - // Send the HTTP cache control headers - $this->set_cache_header($last_modified, $expire); - - // Add headers from cache file. - foreach ($cache_info['headers'] as $header) - { - $this->set_header($header[0], $header[1]); - } - - // Display the cache - $this->_display(self::substr($cache, self::strlen($match[0]))); - log_message('debug', 'Cache file is current. Sending it to browser.'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Delete cache - * - * @param string $uri URI string - * @return bool - */ - public function delete_cache($uri = '') - { - $CI =& get_instance(); - $cache_path = $CI->config->item('cache_path'); - if ($cache_path === '') - { - $cache_path = APPPATH.'cache/'; - } - - if ( ! is_dir($cache_path)) - { - log_message('error', 'Unable to find cache path: '.$cache_path); - return FALSE; - } - - if (empty($uri)) - { - $uri = $CI->uri->uri_string(); - - if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) - { - if (is_array($cache_query_string)) - { - $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); - } - else - { - $uri .= '?'.$_SERVER['QUERY_STRING']; - } - } - } - - $cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/')); - - if ( ! @unlink($cache_path)) - { - log_message('error', 'Unable to delete cache file for '.$uri); - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Header - * - * Set the HTTP headers to match the server-side file cache settings - * in order to reduce bandwidth. - * - * @param int $last_modified Timestamp of when the page was last modified - * @param int $expiration Timestamp of when should the requested page expire from cache - * @return void - */ - public function set_cache_header($last_modified, $expiration) - { - $max_age = $expiration - $_SERVER['REQUEST_TIME']; - - if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) - { - $this->set_status_header(304); - exit; - } - - header('Pragma: public'); - header('Cache-Control: max-age='.$max_age.', public'); - header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); - header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe strlen() - * - * @param string $str - * @return int - */ - protected static function strlen($str) - { - return (self::$func_overload) - ? mb_strlen($str, '8bit') - : strlen($str); - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe substr() - * - * @param string $str - * @param int $start - * @param int $length - * @return string - */ - protected static function substr($str, $start, $length = NULL) - { - if (self::$func_overload) - { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); - return mb_substr($str, $start, $length, '8bit'); - } - - return isset($length) - ? substr($str, $start, $length) - : substr($str, $start); - } -} diff --git a/finecms/finecms/system/core/Router.php b/finecms/finecms/system/core/Router.php deleted file mode 100644 index 1abe4c4..0000000 --- a/finecms/finecms/system/core/Router.php +++ /dev/null @@ -1,515 +0,0 @@ -config =& load_class('Config', 'core'); - $this->uri =& load_class('URI', 'core'); - - $this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE); - - // If a directory override is configured, it has to be set before any dynamic routing logic - is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']); - $this->_set_routing(); - - // Set any routing overrides that may exist in the main index file - if (is_array($routing)) - { - empty($routing['controller']) OR $this->set_class($routing['controller']); - empty($routing['function']) OR $this->set_method($routing['function']); - } - - log_message('info', 'Router Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Set route mapping - * - * Determines what should be served based on the URI request, - * as well as any "routes" that have been set in the routing config file. - * - * @return void - */ - protected function _set_routing() - { - // Load the routes.php file. It would be great if we could - // skip this for enable_query_strings = TRUE, but then - // default_controller would be empty ... - if (file_exists(APPPATH.'config/routes.php')) - { - include(APPPATH.'config/routes.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); - } - - // Validate & get reserved routes - if (isset($route) && is_array($route)) - { - isset($route['default_controller']) && $this->default_controller = $route['default_controller']; - isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes']; - unset($route['default_controller'], $route['translate_uri_dashes']); - $this->routes = $route; - } - - // Are query strings enabled in the config file? Normally CI doesn't utilize query strings - // since URI segments are more search-engine friendly, but they can optionally be used. - // If this feature is enabled, we will gather the directory/class/method a little differently - if ($this->enable_query_strings) - { - // If the directory is set at this time, it means an override exists, so skip the checks - if ( ! isset($this->directory)) - { - $_d = $this->config->item('directory_trigger'); - $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; - - if ($_d !== '') - { - $this->uri->filter_uri($_d); - $this->set_directory($_d); - } - } - - $_c = trim($this->config->item('controller_trigger')); - if ( ! empty($_GET[$_c])) - { - $this->uri->filter_uri($_GET[$_c]); - $this->set_class($_GET[$_c]); - - $_f = trim($this->config->item('function_trigger')); - if ( ! empty($_GET[$_f])) - { - $this->uri->filter_uri($_GET[$_f]); - $this->set_method($_GET[$_f]); - } - - $this->uri->rsegments = array( - 1 => $this->class, - 2 => $this->method - ); - } - else - { - $this->_set_default_controller(); - } - - // Routing rules don't apply to query strings and we don't need to detect - // directories, so we're done here - return; - } - - // Is there anything to parse? - if ($this->uri->uri_string !== '') - { - $this->_parse_routes(); - } - else - { - $this->_set_default_controller(); - } - } - - // -------------------------------------------------------------------- - - /** - * Set request route - * - * Takes an array of URI segments as input and sets the class/method - * to be called. - * - * @used-by CI_Router::_parse_routes() - * @param array $segments URI segments - * @return void - */ - protected function _set_request($segments = array()) - { - $segments = $this->_validate_request($segments); - // If we don't have any segments left - try the default controller; - // WARNING: Directories get shifted out of the segments array! - if (empty($segments)) - { - $this->_set_default_controller(); - return; - } - - if ($this->translate_uri_dashes === TRUE) - { - $segments[0] = str_replace('-', '_', $segments[0]); - if (isset($segments[1])) - { - $segments[1] = str_replace('-', '_', $segments[1]); - } - } - - $this->set_class($segments[0]); - if (isset($segments[1])) - { - $this->set_method($segments[1]); - } - else - { - $segments[1] = 'index'; - } - - array_unshift($segments, NULL); - unset($segments[0]); - $this->uri->rsegments = $segments; - } - - // -------------------------------------------------------------------- - - /** - * Set default controller - * - * @return void - */ - protected function _set_default_controller() - { - if (empty($this->default_controller)) - { - show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.'); - } - - // Is the method being specified? - if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) - { - $method = 'index'; - } - - if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) - { - // This will trigger 404 later - return; - } - - $this->set_class($class); - $this->set_method($method); - - // Assign routed segments, index starting from 1 - $this->uri->rsegments = array( - 1 => $class, - 2 => $method - ); - - log_message('debug', 'No URI present. Default controller set.'); - } - - // -------------------------------------------------------------------- - - /** - * Validate request - * - * Attempts validate the URI request and determine the controller path. - * - * @used-by CI_Router::_set_request() - * @param array $segments URI segments - * @return mixed URI segments - */ - protected function _validate_request($segments) - { - $c = count($segments); - $directory_override = isset($this->directory); - - // Loop through our segments and return as soon as a controller - // is found or when such a directory doesn't exist - while ($c-- > 0) - { - $test = $this->directory - .ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]); - - if ( ! file_exists(APPPATH.'controllers/'.$test.'.php') - && $directory_override === FALSE - && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) - ) - { - $this->set_directory(array_shift($segments), TRUE); - continue; - } - - return $segments; - } - - // This means that all segments were actually directories - return $segments; - } - - // -------------------------------------------------------------------- - - /** - * Parse Routes - * - * Matches any routes that may exist in the config/routes.php file - * against the URI to determine if the class/method need to be remapped. - * - * @return void - */ - protected function _parse_routes() - { - // Turn the segment array into a URI string - $uri = implode('/', $this->uri->segments); - - // Get HTTP verb - $http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli'; - - // Loop through the route array looking for wildcards - foreach ($this->routes as $key => $val) - { - // Check if route format is using HTTP verbs - if (is_array($val)) - { - $val = array_change_key_case($val, CASE_LOWER); - if (isset($val[$http_verb])) - { - $val = $val[$http_verb]; - } - else - { - continue; - } - } - - // Convert wildcards to RegEx - $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key); - - // Does the RegEx match? - if (preg_match('#^'.$key.'$#', $uri, $matches)) - { - // Are we using callbacks to process back-references? - if ( ! is_string($val) && is_callable($val)) - { - // Remove the original string from the matches array. - array_shift($matches); - - // Execute the callback using the values in matches as its parameters. - $val = call_user_func_array($val, $matches); - } - // Are we using the default routing method for back-references? - elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE) - { - $val = preg_replace('#^'.$key.'$#', $val, $uri); - } - - $this->_set_request(explode('/', $val)); - return; - } - } - - // If we got this far it means we didn't encounter a - // matching route so we'll set the site default route - $this->_set_request(array_values($this->uri->segments)); - } - - // -------------------------------------------------------------------- - - /** - * Set class name - * - * @param string $class Class name - * @return void - */ - public function set_class($class) - { - $this->class = str_replace(array('/', '.'), '', $class); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current class - * - * @deprecated 3.0.0 Read the 'class' property instead - * @return string - */ - public function fetch_class() - { - return $this->class; - } - - // -------------------------------------------------------------------- - - /** - * Set method name - * - * @param string $method Method name - * @return void - */ - public function set_method($method) - { - $this->method = $method; - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current method - * - * @deprecated 3.0.0 Read the 'method' property instead - * @return string - */ - public function fetch_method() - { - return $this->method; - } - - // -------------------------------------------------------------------- - - /** - * Set directory name - * - * @param string $dir Directory name - * @param bool $append Whether we're appending rather than setting the full value - * @return void - */ - public function set_directory($dir, $append = FALSE) - { - if ($append !== TRUE OR empty($this->directory)) - { - $this->directory = str_replace('.', '', trim($dir, '/')).'/'; - } - else - { - $this->directory .= str_replace('.', '', trim($dir, '/')).'/'; - } - } - - // -------------------------------------------------------------------- - - /** - * Fetch directory - * - * Feches the sub-directory (if any) that contains the requested - * controller class. - * - * @deprecated 3.0.0 Read the 'directory' property instead - * @return string - */ - public function fetch_directory() - { - return $this->directory; - } - -} diff --git a/finecms/finecms/system/core/Security.php b/finecms/finecms/system/core/Security.php deleted file mode 100644 index 082ffa9..0000000 --- a/finecms/finecms/system/core/Security.php +++ /dev/null @@ -1,1080 +0,0 @@ -', '<', '>', - "'", '"', '&', '$', '#', - '{', '}', '[', ']', '=', - ';', '?', '%20', '%22', - '%3c', // < - '%253c', // < - '%3e', // > - '%0e', // > - '%28', // ( - '%29', // ) - '%2528', // ( - '%26', // & - '%24', // $ - '%3f', // ? - '%3b', // ; - '%3d' // = - ); - - /** - * Character set - * - * Will be overridden by the constructor. - * - * @var string - */ - public $charset = 'UTF-8'; - - /** - * XSS Hash - * - * Random Hash for protecting URLs. - * - * @var string - */ - protected $_xss_hash; - - /** - * CSRF Hash - * - * Random hash for Cross Site Request Forgery protection cookie - * - * @var string - */ - protected $_csrf_hash; - - /** - * CSRF Expire time - * - * Expiration time for Cross Site Request Forgery protection cookie. - * Defaults to two hours (in seconds). - * - * @var int - */ - protected $_csrf_expire = 7200; - - /** - * CSRF Token name - * - * Token name for Cross Site Request Forgery protection cookie. - * - * @var string - */ - protected $_csrf_token_name = 'ci_csrf_token'; - - /** - * CSRF Cookie name - * - * Cookie name for Cross Site Request Forgery protection cookie. - * - * @var string - */ - protected $_csrf_cookie_name = 'ci_csrf_token'; - - /** - * List of never allowed strings - * - * @var array - */ - protected $_never_allowed_str = array( - 'document.cookie' => '[removed]', - 'document.write' => '[removed]', - '.parentNode' => '[removed]', - '.innerHTML' => '[removed]', - '-moz-binding' => '[removed]', - '' => '-->', - ' '<![CDATA[', - '' => '<comment>', - '<%' => '<%' - ); - - /** - * List of never allowed regex replacements - * - * @var array - */ - protected $_never_allowed_regex = array( - 'javascript\s*:', - '(document|(document\.)?window)\.(location|on\w*)', - 'expression\s*(\(|&\#40;)', // CSS and IE - 'vbscript\s*:', // IE, surprise! - 'wscript\s*:', // IE - 'jscript\s*:', // IE - 'vbs\s*:', // IE - 'Redirect\s+30\d', - "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" - ); - - /** - * Class constructor - * - * @return void - */ - public function __construct() - { - // Is CSRF protection enabled? - if (config_item('csrf_protection')) - { - // CSRF config - foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) - { - if (NULL !== ($val = config_item($key))) - { - $this->{'_'.$key} = $val; - } - } - - // Append application specific cookie prefix - if ($cookie_prefix = config_item('cookie_prefix')) - { - $this->_csrf_cookie_name = $cookie_prefix.$this->_csrf_cookie_name; - } - - // Set the CSRF hash - $this->_csrf_set_hash(); - } - - $this->charset = strtoupper(config_item('charset')); - - log_message('info', 'Security Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * CSRF Verify - * - * @return CI_Security - */ - public function csrf_verify() - { - // If it's not a POST request we will set the CSRF cookie - if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') - { - return $this->csrf_set_cookie(); - } - - // Check if URI has been whitelisted from CSRF checks - if ($exclude_uris = config_item('csrf_exclude_uris')) - { - $uri = load_class('URI', 'core'); - foreach ($exclude_uris as $excluded) - { - if (preg_match('#^'.$excluded.'$#i'.(UTF8_ENABLED ? 'u' : ''), $uri->uri_string())) - { - return $this; - } - } - } - - // Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate - $valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) - && hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]); - - // We kill this since we're done and we don't want to pollute the _POST array - unset($_POST[$this->_csrf_token_name]); - - // Regenerate on every submission? - if (config_item('csrf_regenerate')) - { - // Nothing should last forever - unset($_COOKIE[$this->_csrf_cookie_name]); - $this->_csrf_hash = NULL; - } - - $this->_csrf_set_hash(); - $this->csrf_set_cookie(); - - if ($valid !== TRUE) - { - $this->csrf_show_error(); - } - - log_message('info', 'CSRF token verified'); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * CSRF Set Cookie - * - * @codeCoverageIgnore - * @return CI_Security - */ - public function csrf_set_cookie() - { - $expire = time() + $this->_csrf_expire; - $secure_cookie = (bool) config_item('cookie_secure'); - - if ($secure_cookie && ! is_https()) - { - return FALSE; - } - - setcookie( - $this->_csrf_cookie_name, - $this->_csrf_hash, - $expire, - config_item('cookie_path'), - config_item('cookie_domain'), - $secure_cookie, - config_item('cookie_httponly') - ); - log_message('info', 'CSRF cookie sent'); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Show CSRF Error - * - * @return void - */ - public function csrf_show_error() - { - show_error('The action you have requested is not allowed.', 403); - } - - // -------------------------------------------------------------------- - - /** - * Get CSRF Hash - * - * @see CI_Security::$_csrf_hash - * @return string CSRF hash - */ - public function get_csrf_hash() - { - return $this->_csrf_hash; - } - - // -------------------------------------------------------------------- - - /** - * Get CSRF Token Name - * - * @see CI_Security::$_csrf_token_name - * @return string CSRF token name - */ - public function get_csrf_token_name() - { - return $this->_csrf_token_name; - } - - // -------------------------------------------------------------------- - - /** - * XSS Clean - * - * Sanitizes data so that Cross Site Scripting Hacks can be - * prevented. This method does a fair amount of work but - * it is extremely thorough, designed to prevent even the - * most obscure XSS attempts. Nothing is ever 100% foolproof, - * of course, but I haven't been able to get anything passed - * the filter. - * - * Note: Should only be used to deal with data upon submission. - * It's not something that should be used for general - * runtime processing. - * - * @link http://channel.bitflux.ch/wiki/XSS_Prevention - * Based in part on some code and ideas from Bitflux. - * - * @link http://ha.ckers.org/xss.html - * To help develop this script I used this great list of - * vulnerabilities along with a few other hacks I've - * harvested from examining vulnerabilities in other programs. - * - * @param string|string[] $str Input data - * @param bool $is_image Whether the input is an image - * @return string - */ - public function xss_clean($str, $is_image = FALSE) - { - // Is the string an array? - if (is_array($str)) - { - foreach ($str as $key => &$value) - { - $str[$key] = $this->xss_clean($value); - } - - return $str; - } - - // Remove Invisible Characters - $str = remove_invisible_characters($str); - - /* - * URL Decode - * - * Just in case stuff like this is submitted: - * - * Google - * - * Note: Use rawurldecode() so it does not remove plus signs - */ - if (stripos($str, '%') !== false) - { - do - { - $oldstr = $str; - $str = rawurldecode($str); - $str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str); - } - while ($oldstr !== $str); - unset($oldstr); - } - - /* - * Convert character entities to ASCII - * - * This permits our tests below to work reliably. - * We only convert entities that are within tags since - * these are the ones that will pose security problems. - */ - $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); - $str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str); - - // Remove Invisible Characters Again! - $str = remove_invisible_characters($str); - - /* - * Convert all tabs to spaces - * - * This prevents strings like this: ja vascript - * NOTE: we deal with spaces between characters later. - * NOTE: preg_replace was found to be amazingly slow here on - * large blocks of data, so we use str_replace. - */ - $str = str_replace("\t", ' ', $str); - - // Capture converted string for later comparison - $converted_string = $str; - - // Remove Strings that are never allowed - $str = $this->_do_never_allowed($str); - - /* - * Makes PHP tags safe - * - * Note: XML tags are inadvertently replaced too: - * - * '), array('<?', '?>'), $str); - } - - /* - * Compact any exploded words - * - * This corrects words like: j a v a s c r i p t - * These words are compacted back to their correct state. - */ - $words = array( - 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', - 'vbs', 'script', 'base64', 'applet', 'alert', 'document', - 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval' - ); - - foreach ($words as $word) - { - $word = implode('\s*', str_split($word)).'\s*'; - - // We only want to do this when it is followed by a non-word character - // That way valid stuff like "dealer to" does not become "dealerto" - $str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); - } - - /* - * Remove disallowed Javascript in links or img tags - * We used to do some version comparisons and use of stripos(), - * but it is dog slow compared to these simplified non-capturing - * preg_match(), especially if the pattern exists in the string - * - * Note: It was reported that not only space characters, but all in - * the following pattern can be parsed as separators between a tag name - * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] - * ... however, remove_invisible_characters() above already strips the - * hex-encoded ones, so we'll skip them below. - */ - do - { - $original = $str; - - if (preg_match('/]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); - } - - if (preg_match('/]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str); - } - - if (preg_match('/script|xss/i', $str)) - { - $str = preg_replace('##si', '[removed]', $str); - } - } - while ($original !== $str); - unset($original); - - /* - * Sanitize naughty HTML elements - * - * If a tag containing any of the words in the list - * below is found, the tag gets converted to entities. - * - * So this: - * Becomes: <blink> - */ - $pattern = '#' - .'<((?/*\s*)((?[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character - .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator - // optional attributes - .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons - .'[^\s\042\047>/=]+' // attribute characters - // optional attribute-value - .'(?:\s*=' // attribute-value separator - .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value - .')?' // end optional attribute-value group - .')*)' // end optional attributes group - .'[^>]*)(?\>)?#isS'; - - // Note: It would be nice to optimize this for speed, BUT - // only matching the naughty elements here results in - // false positives and in turn - vulnerabilities! - do - { - $old_str = $str; - $str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str); - } - while ($old_str !== $str); - unset($old_str); - - /* - * Sanitize naughty scripting elements - * - * Similar to above, only instead of looking for - * tags it looks for PHP and JavaScript commands - * that are disallowed. Rather than removing the - * code, it simply converts the parenthesis to entities - * rendering the code un-executable. - * - * For example: eval('some code') - * Becomes: eval('some code') - */ - $str = preg_replace( - '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', - '\\1\\2(\\3)', - $str - ); - - // Final clean up - // This adds a bit of extra precaution in case - // something got through the above filters - $str = $this->_do_never_allowed($str); - - /* - * Images are Handled in a Special Way - * - Essentially, we want to know that after all of the character - * conversion is done whether any unwanted, likely XSS, code was found. - * If not, we return TRUE, as the image is clean. - * However, if the string post-conversion does not matched the - * string post-removal of XSS, then it fails, as there was unwanted XSS - * code found and removed/changed during processing. - */ - if ($is_image === TRUE) - { - return ($str === $converted_string); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * XSS Hash - * - * Generates the XSS hash if needed and returns it. - * - * @see CI_Security::$_xss_hash - * @return string XSS hash - */ - public function xss_hash() - { - if ($this->_xss_hash === NULL) - { - $rand = $this->get_random_bytes(16); - $this->_xss_hash = ($rand === FALSE) - ? md5(uniqid(mt_rand(), TRUE)) - : bin2hex($rand); - } - - return $this->_xss_hash; - } - - // -------------------------------------------------------------------- - - /** - * Get random bytes - * - * @param int $length Output length - * @return string - */ - public function get_random_bytes($length) - { - if (empty($length) OR ! ctype_digit((string) $length)) - { - return FALSE; - } - - if (function_exists('random_bytes')) - { - try - { - // The cast is required to avoid TypeError - return random_bytes((int) $length); - } - catch (Exception $e) - { - // If random_bytes() can't do the job, we can't either ... - // There's no point in using fallbacks. - log_message('error', $e->getMessage()); - return FALSE; - } - } - - // Unfortunately, none of the following PRNGs is guaranteed to exist ... - if (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE) - { - return $output; - } - - - if (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE) - { - // Try not to waste entropy ... - is_php('5.4') && stream_set_chunk_size($fp, $length); - $output = fread($fp, $length); - fclose($fp); - if ($output !== FALSE) - { - return $output; - } - } - - if (function_exists('openssl_random_pseudo_bytes')) - { - return openssl_random_pseudo_bytes($length); - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * HTML Entities Decode - * - * A replacement for html_entity_decode() - * - * The reason we are not using html_entity_decode() by itself is because - * while it is not technically correct to leave out the semicolon - * at the end of an entity most browsers will still interpret the entity - * correctly. html_entity_decode() does not convert entities without - * semicolons, so we are left with our own little solution here. Bummer. - * - * @link http://php.net/html-entity-decode - * - * @param string $str Input - * @param string $charset Character set - * @return string - */ - public function entity_decode($str, $charset = NULL) - { - if (strpos($str, '&') === FALSE) - { - return $str; - } - - static $_entities; - - isset($charset) OR $charset = $this->charset; - $flag = is_php('5.4') - ? ENT_COMPAT | ENT_HTML5 - : ENT_COMPAT; - - if ( ! isset($_entities)) - { - $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); - - // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 - // entities to the array manually - if ($flag === ENT_COMPAT) - { - $_entities[':'] = ':'; - $_entities['('] = '('; - $_entities[')'] = ')'; - $_entities["\n"] = ' '; - $_entities["\t"] = ' '; - } - } - - do - { - $str_compare = $str; - - // Decode standard entities, avoiding false positives - if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) - { - $replace = array(); - $matches = array_unique(array_map('strtolower', $matches[0])); - foreach ($matches as &$match) - { - if (($char = array_search($match.';', $_entities, TRUE)) !== FALSE) - { - $replace[$match] = $char; - } - } - - $str = str_replace(array_keys($replace), array_values($replace), $str); - } - - // Decode numeric & UTF16 two byte entities - $str = html_entity_decode( - preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), - $flag, - $charset - ); - - if ($flag === ENT_COMPAT) - { - $str = str_replace(array_values($_entities), array_keys($_entities), $str); - } - } - while ($str_compare !== $str); - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Filename - * - * @param string $str Input file name - * @param bool $relative_path Whether to preserve paths - * @return string - */ - public function sanitize_filename($str, $relative_path = FALSE) - { - $bad = $this->filename_bad_chars; - - if ( ! $relative_path) - { - $bad[] = './'; - $bad[] = '/'; - } - - $str = remove_invisible_characters($str, FALSE); - - do - { - $old = $str; - $str = str_replace($bad, '', $str); - } - while ($old !== $str); - - return stripslashes($str); - } - - // ---------------------------------------------------------------- - - /** - * Strip Image Tags - * - * @param string $str - * @return string - */ - public function strip_image_tags($str) - { - return preg_replace( - array( - '##i', - '#`]+)).*?\>#i' - ), - '\\2', - $str - ); - } - - // ---------------------------------------------------------------- - - /** - * URL-decode taking spaces into account - * - * @see https://github.com/bcit-ci/CodeIgniter/issues/4877 - * @param array $matches - * @return string - */ - protected function _urldecodespaces($matches) - { - $input = $matches[0]; - $nospaces = preg_replace('#\s+#', '', $input); - return ($nospaces === $input) - ? $input - : rawurldecode($nospaces); - } - - // ---------------------------------------------------------------- - - /** - * Compact Exploded Words - * - * Callback method for xss_clean() to remove whitespace from - * things like 'j a v a s c r i p t'. - * - * @used-by CI_Security::xss_clean() - * @param array $matches - * @return string - */ - protected function _compact_exploded_words($matches) - { - return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Naughty HTML - * - * Callback method for xss_clean() to remove naughty HTML elements. - * - * @used-by CI_Security::xss_clean() - * @param array $matches - * @return string - */ - protected function _sanitize_naughty_html($matches) - { - static $naughty_tags = array( - 'alert', 'area', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', - 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', - 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', - 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' - ); - - static $evil_attributes = array( - 'on\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime' - ); - - // First, escape unclosed tags - if (empty($matches['closeTag'])) - { - return '<'.$matches[1]; - } - // Is the element that we caught naughty? If so, escape it - elseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE)) - { - return '<'.$matches[1].'>'; - } - // For other tags, see if their attributes are "evil" and strip those - elseif (isset($matches['attributes'])) - { - // We'll store the already fitlered attributes here - $attributes = array(); - - // Attribute-catching pattern - $attributes_pattern = '#' - .'(?[^\s\042\047>/=]+)' // attribute characters - // optional attribute-value - .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator - .'#i'; - - // Blacklist pattern for evil attribute names - $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; - - // Each iteration filters a single attribute - do - { - // Strip any non-alpha characters that may precede an attribute. - // Browsers often parse these incorrectly and that has been a - // of numerous XSS issues we've had. - $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); - - if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) - { - // No (valid) attribute found? Discard everything else inside the tag - break; - } - - if ( - // Is it indeed an "evil" attribute? - preg_match($is_evil_pattern, $attribute['name'][0]) - // Or does it have an equals sign, but no value and not quoted? Strip that too! - OR (trim($attribute['value'][0]) === '') - ) - { - $attributes[] = 'xss=removed'; - } - else - { - $attributes[] = $attribute[0][0]; - } - - $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); - } - while ($matches['attributes'] !== ''); - - $attributes = empty($attributes) - ? '' - : ' '.implode(' ', $attributes); - return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; - } - - return $matches[0]; - } - - // -------------------------------------------------------------------- - - /** - * JS Link Removal - * - * Callback method for xss_clean() to sanitize links. - * - * This limits the PCRE backtracks, making it more performance friendly - * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in - * PHP 5.2+ on link-heavy strings. - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _js_link_removal($match) - { - return str_replace( - $match[1], - preg_replace( - '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) - ), - $match[0] - ); - } - - // -------------------------------------------------------------------- - - /** - * JS Image Removal - * - * Callback method for xss_clean() to sanitize image tags. - * - * This limits the PCRE backtracks, making it more performance friendly - * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in - * PHP 5.2+ on image tag heavy strings. - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _js_img_removal($match) - { - return str_replace( - $match[1], - preg_replace( - '#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) - ), - $match[0] - ); - } - - // -------------------------------------------------------------------- - - /** - * Attribute Conversion - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _convert_attribute($match) - { - return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); - } - - // -------------------------------------------------------------------- - - /** - * Filter Attributes - * - * Filters tag attributes for consistency and safety. - * - * @used-by CI_Security::_js_img_removal() - * @used-by CI_Security::_js_link_removal() - * @param string $str - * @return string - */ - protected function _filter_attributes($str) - { - $out = ''; - if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) - { - foreach ($matches[0] as $match) - { - $out .= preg_replace('#/\*.*?\*/#s', '', $match); - } - } - - return $out; - } - - // -------------------------------------------------------------------- - - /** - * HTML Entity Decode Callback - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _decode_entity($match) - { - // Protect GET variables in URLs - // 901119URL5918AMP18930PROTECT8198 - $match = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-/]+)|i', $this->xss_hash().'\\1=\\2', $match[0]); - - // Decode, then un-protect URL GET vars - return str_replace( - $this->xss_hash(), - '&', - $this->entity_decode($match, $this->charset) - ); - } - - // -------------------------------------------------------------------- - - /** - * Do Never Allowed - * - * @used-by CI_Security::xss_clean() - * @param string - * @return string - */ - protected function _do_never_allowed($str) - { - $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); - - foreach ($this->_never_allowed_regex as $regex) - { - $str = preg_replace('#'.$regex.'#is', '[removed]', $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Set CSRF Hash and Cookie - * - * @return string - */ - protected function _csrf_set_hash() - { - if ($this->_csrf_hash === NULL) - { - // If the cookie exists we will use its value. - // We don't necessarily want to regenerate it with - // each page load since a page could contain embedded - // sub-pages causing this feature to fail - if (isset($_COOKIE[$this->_csrf_cookie_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) - && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) - { - return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; - } - - $rand = $this->get_random_bytes(16); - $this->_csrf_hash = ($rand === FALSE) - ? md5(uniqid(mt_rand(), TRUE)) - : bin2hex($rand); - } - - return $this->_csrf_hash; - } - -} diff --git a/finecms/finecms/system/core/URI.php b/finecms/finecms/system/core/URI.php deleted file mode 100644 index 3ccdfa7..0000000 --- a/finecms/finecms/system/core/URI.php +++ /dev/null @@ -1,643 +0,0 @@ -config =& load_class('Config', 'core'); - - // If query strings are enabled, we don't need to parse any segments. - // However, they don't make sense under CLI. - if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE) - { - $this->_permitted_uri_chars = $this->config->item('permitted_uri_chars'); - - // If it's a CLI request, ignore the configuration - if (is_cli()) - { - $uri = $this->_parse_argv(); - } - else - { - $protocol = $this->config->item('uri_protocol'); - empty($protocol) && $protocol = 'REQUEST_URI'; - - switch ($protocol) - { - case 'AUTO': // For BC purposes only - case 'REQUEST_URI': - $uri = $this->_parse_request_uri(); - break; - case 'QUERY_STRING': - $uri = $this->_parse_query_string(); - break; - case 'PATH_INFO': - default: - $uri = isset($_SERVER[$protocol]) - ? $_SERVER[$protocol] - : $this->_parse_request_uri(); - break; - } - } - - $this->_set_uri_string($uri); - } - - log_message('info', 'URI Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Set URI String - * - * @param string $str - * @return void - */ - protected function _set_uri_string($str) - { - // Filter out control characters and trim slashes - $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); - - if ($this->uri_string !== '') - { - // Remove the URL suffix, if present - if (($suffix = (string) $this->config->item('url_suffix')) !== '') - { - $slen = strlen($suffix); - - if (substr($this->uri_string, -$slen) === $suffix) - { - $this->uri_string = substr($this->uri_string, 0, -$slen); - } - } - - $this->segments[0] = NULL; - // Populate the segments array - foreach (explode('/', trim($this->uri_string, '/')) as $val) - { - $val = trim($val); - // Filter segments for security - $this->filter_uri($val); - - if ($val !== '') - { - $this->segments[] = $val; - } - } - - unset($this->segments[0]); - } - } - - // -------------------------------------------------------------------- - - /** - * Parse REQUEST_URI - * - * Will parse REQUEST_URI and automatically detect the URI from it, - * while fixing the query string if necessary. - * - * @return string - */ - protected function _parse_request_uri() - { - if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'])) - { - return ''; - } - - // parse_url() returns false if no host is present, but the path or query string - // contains a colon followed by a number - $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); - $query = isset($uri['query']) ? $uri['query'] : ''; - $uri = isset($uri['path']) ? $uri['path'] : ''; - - if (isset($_SERVER['SCRIPT_NAME'][0])) - { - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) - { - $uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME'])); - } - elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) - { - $uri = (string) substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); - } - } - - // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct - // URI is found, and also fixes the QUERY_STRING server var and $_GET array. - if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0) - { - $query = explode('?', $query, 2); - $uri = $query[0]; - $_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : ''; - } - else - { - $_SERVER['QUERY_STRING'] = $query; - } - - parse_str($_SERVER['QUERY_STRING'], $_GET); - - if ($uri === '/' OR $uri === '') - { - return '/'; - } - - // Do some final cleaning of the URI and return it - return $this->_remove_relative_directory($uri); - } - - // -------------------------------------------------------------------- - - /** - * Parse QUERY_STRING - * - * Will parse QUERY_STRING and automatically detect the URI from it. - * - * @return string - */ - protected function _parse_query_string() - { - $uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); - - if (trim($uri, '/') === '') - { - return ''; - } - elseif (strncmp($uri, '/', 1) === 0) - { - $uri = explode('?', $uri, 2); - $_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : ''; - $uri = $uri[0]; - } - - parse_str($_SERVER['QUERY_STRING'], $_GET); - - return $this->_remove_relative_directory($uri); - } - - // -------------------------------------------------------------------- - - /** - * Parse CLI arguments - * - * Take each command line argument and assume it is a URI segment. - * - * @return string - */ - protected function _parse_argv() - { - $args = array_slice($_SERVER['argv'], 1); - return $args ? implode('/', $args) : ''; - } - - // -------------------------------------------------------------------- - - /** - * Remove relative directory (../) and multi slashes (///) - * - * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() - * - * @param string $uri - * @return string - */ - protected function _remove_relative_directory($uri) - { - $uris = array(); - $tok = strtok($uri, '/'); - while ($tok !== FALSE) - { - if (( ! empty($tok) OR $tok === '0') && $tok !== '..') - { - $uris[] = $tok; - } - $tok = strtok('/'); - } - - return implode('/', $uris); - } - - // -------------------------------------------------------------------- - - /** - * Filter URI - * - * Filters segments for malicious characters. - * - * @param string $str - * @return void - */ - public function filter_uri(&$str) - { - if ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str)) - { - show_error('The URI you submitted has disallowed characters.', 400); - } - } - - // -------------------------------------------------------------------- - - /** - * Fetch URI Segment - * - * @see CI_URI::$segments - * @param int $n Index - * @param mixed $no_result What to return if the segment index is not found - * @return mixed - */ - public function segment($n, $no_result = NULL) - { - return isset($this->segments[$n]) ? $this->segments[$n] : $no_result; - } - - // -------------------------------------------------------------------- - - /** - * Fetch URI "routed" Segment - * - * Returns the re-routed URI segment (assuming routing rules are used) - * based on the index provided. If there is no routing, will return - * the same result as CI_URI::segment(). - * - * @see CI_URI::$rsegments - * @see CI_URI::segment() - * @param int $n Index - * @param mixed $no_result What to return if the segment index is not found - * @return mixed - */ - public function rsegment($n, $no_result = NULL) - { - return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result; - } - - // -------------------------------------------------------------------- - - /** - * URI to assoc - * - * Generates an associative array of URI data starting at the supplied - * segment index. For example, if this is your URI: - * - * example.com/user/search/name/joe/location/UK/gender/male - * - * You can use this method to generate an array with this prototype: - * - * array ( - * name => joe - * location => UK - * gender => male - * ) - * - * @param int $n Index (default: 3) - * @param array $default Default values - * @return array - */ - public function uri_to_assoc($n = 3, $default = array()) - { - return $this->_uri_to_assoc($n, $default, 'segment'); - } - - // -------------------------------------------------------------------- - - /** - * Routed URI to assoc - * - * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed - * segment array. - * - * @see CI_URI::uri_to_assoc() - * @param int $n Index (default: 3) - * @param array $default Default values - * @return array - */ - public function ruri_to_assoc($n = 3, $default = array()) - { - return $this->_uri_to_assoc($n, $default, 'rsegment'); - } - - // -------------------------------------------------------------------- - - /** - * Internal URI-to-assoc - * - * Generates a key/value pair from the URI string or re-routed URI string. - * - * @used-by CI_URI::uri_to_assoc() - * @used-by CI_URI::ruri_to_assoc() - * @param int $n Index (default: 3) - * @param array $default Default values - * @param string $which Array name ('segment' or 'rsegment') - * @return array - */ - protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') - { - if ( ! is_numeric($n)) - { - return $default; - } - - if (isset($this->keyval[$which], $this->keyval[$which][$n])) - { - return $this->keyval[$which][$n]; - } - - $total_segments = "total_{$which}s"; - $segment_array = "{$which}_array"; - - if ($this->$total_segments() < $n) - { - return (count($default) === 0) - ? array() - : array_fill_keys($default, NULL); - } - - $segments = array_slice($this->$segment_array(), ($n - 1)); - $i = 0; - $lastval = ''; - $retval = array(); - foreach ($segments as $seg) - { - if ($i % 2) - { - $retval[$lastval] = $seg; - } - else - { - $retval[$seg] = NULL; - $lastval = $seg; - } - - $i++; - } - - if (count($default) > 0) - { - foreach ($default as $val) - { - if ( ! array_key_exists($val, $retval)) - { - $retval[$val] = NULL; - } - } - } - - // Cache the array for reuse - isset($this->keyval[$which]) OR $this->keyval[$which] = array(); - $this->keyval[$which][$n] = $retval; - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Assoc to URI - * - * Generates a URI string from an associative array. - * - * @param array $array Input array of key/value pairs - * @return string URI string - */ - public function assoc_to_uri($array) - { - $temp = array(); - foreach ((array) $array as $key => $val) - { - $temp[] = $key; - $temp[] = $val; - } - - return implode('/', $temp); - } - - // -------------------------------------------------------------------- - - /** - * Slash segment - * - * Fetches an URI segment with a slash. - * - * @param int $n Index - * @param string $where Where to add the slash ('trailing' or 'leading') - * @return string - */ - public function slash_segment($n, $where = 'trailing') - { - return $this->_slash_segment($n, $where, 'segment'); - } - - // -------------------------------------------------------------------- - - /** - * Slash routed segment - * - * Fetches an URI routed segment with a slash. - * - * @param int $n Index - * @param string $where Where to add the slash ('trailing' or 'leading') - * @return string - */ - public function slash_rsegment($n, $where = 'trailing') - { - return $this->_slash_segment($n, $where, 'rsegment'); - } - - // -------------------------------------------------------------------- - - /** - * Internal Slash segment - * - * Fetches an URI Segment and adds a slash to it. - * - * @used-by CI_URI::slash_segment() - * @used-by CI_URI::slash_rsegment() - * - * @param int $n Index - * @param string $where Where to add the slash ('trailing' or 'leading') - * @param string $which Array name ('segment' or 'rsegment') - * @return string - */ - protected function _slash_segment($n, $where = 'trailing', $which = 'segment') - { - $leading = $trailing = '/'; - - if ($where === 'trailing') - { - $leading = ''; - } - elseif ($where === 'leading') - { - $trailing = ''; - } - - return $leading.$this->$which($n).$trailing; - } - - // -------------------------------------------------------------------- - - /** - * Segment Array - * - * @return array CI_URI::$segments - */ - public function segment_array() - { - return $this->segments; - } - - // -------------------------------------------------------------------- - - /** - * Routed Segment Array - * - * @return array CI_URI::$rsegments - */ - public function rsegment_array() - { - return $this->rsegments; - } - - // -------------------------------------------------------------------- - - /** - * Total number of segments - * - * @return int - */ - public function total_segments() - { - return count($this->segments); - } - - // -------------------------------------------------------------------- - - /** - * Total number of routed segments - * - * @return int - */ - public function total_rsegments() - { - return count($this->rsegments); - } - - // -------------------------------------------------------------------- - - /** - * Fetch URI string - * - * @return string CI_URI::$uri_string - */ - public function uri_string() - { - return $this->uri_string; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Re-routed URI string - * - * @return string - */ - public function ruri_string() - { - return ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments); - } - -} diff --git a/finecms/finecms/system/core/Utf8.php b/finecms/finecms/system/core/Utf8.php deleted file mode 100644 index dfbbfff..0000000 --- a/finecms/finecms/system/core/Utf8.php +++ /dev/null @@ -1,164 +0,0 @@ -is_ascii($str) === FALSE) - { - if (MB_ENABLED) - { - $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); - } - elseif (ICONV_ENABLED) - { - $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); - } - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Remove ASCII control characters - * - * Removes all ASCII control characters except horizontal tabs, - * line feeds, and carriage returns, as all others can cause - * problems in XML. - * - * @param string $str String to clean - * @return string - */ - public function safe_ascii_for_xml($str) - { - return remove_invisible_characters($str, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Convert to UTF-8 - * - * Attempts to convert a string to UTF-8. - * - * @param string $str Input string - * @param string $encoding Input encoding - * @return string $str encoded in UTF-8 or FALSE on failure - */ - public function convert_to_utf8($str, $encoding) - { - if (MB_ENABLED) - { - return mb_convert_encoding($str, 'UTF-8', $encoding); - } - elseif (ICONV_ENABLED) - { - return @iconv($encoding, 'UTF-8', $str); - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Is ASCII? - * - * Tests if a string is standard 7-bit ASCII or not. - * - * @param string $str String to check - * @return bool - */ - public function is_ascii($str) - { - return (preg_match('/[^\x00-\x7F]/S', $str) === 0); - } - -} diff --git a/finecms/finecms/system/core/compat/hash.php b/finecms/finecms/system/core/compat/hash.php deleted file mode 100644 index c65203a..0000000 --- a/finecms/finecms/system/core/compat/hash.php +++ /dev/null @@ -1,254 +0,0 @@ - 32, - 'haval128,3' => 128, - 'haval160,3' => 128, - 'haval192,3' => 128, - 'haval224,3' => 128, - 'haval256,3' => 128, - 'haval128,4' => 128, - 'haval160,4' => 128, - 'haval192,4' => 128, - 'haval224,4' => 128, - 'haval256,4' => 128, - 'haval128,5' => 128, - 'haval160,5' => 128, - 'haval192,5' => 128, - 'haval224,5' => 128, - 'haval256,5' => 128, - 'md2' => 16, - 'md4' => 64, - 'md5' => 64, - 'ripemd128' => 64, - 'ripemd160' => 64, - 'ripemd256' => 64, - 'ripemd320' => 64, - 'salsa10' => 64, - 'salsa20' => 64, - 'sha1' => 64, - 'sha224' => 64, - 'sha256' => 64, - 'sha384' => 128, - 'sha512' => 128, - 'snefru' => 32, - 'snefru256' => 32, - 'tiger128,3' => 64, - 'tiger160,3' => 64, - 'tiger192,3' => 64, - 'tiger128,4' => 64, - 'tiger160,4' => 64, - 'tiger192,4' => 64, - 'whirlpool' => 64 - ); - - if (isset($block_sizes[$algo], $password[$block_sizes[$algo]])) - { - $password = hash($algo, $password, TRUE); - } - - $hash = ''; - // Note: Blocks are NOT 0-indexed - for ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++) - { - $key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE); - for ($i = 1; $i < $iterations; $i++) - { - $derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE); - } - - $hash .= $derived_key; - } - - // This is not RFC-compatible, but we're aiming for natural PHP compatibility - if ( ! $raw_output) - { - $hash = bin2hex($hash); - } - - return defined('MB_OVERLOAD_STRING') - ? mb_substr($hash, 0, $length, '8bit') - : substr($hash, 0, $length); - } -} diff --git a/finecms/finecms/system/core/compat/index.html b/finecms/finecms/system/core/compat/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/core/compat/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/core/compat/mbstring.php b/finecms/finecms/system/core/compat/mbstring.php deleted file mode 100644 index 1b2f2c6..0000000 --- a/finecms/finecms/system/core/compat/mbstring.php +++ /dev/null @@ -1,149 +0,0 @@ - 0, 'algoName' => 'unknown', 'options' => array()) - : array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash)); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('password_hash')) -{ - /** - * password_hash() - * - * @link http://php.net/password_hash - * @param string $password - * @param int $algo - * @param array $options - * @return mixed - */ - function password_hash($password, $algo, array $options = array()) - { - static $func_overload; - isset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - - if ($algo !== 1) - { - trigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING); - return NULL; - } - - if (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31)) - { - trigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING); - return NULL; - } - - if (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22) - { - trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING); - return NULL; - } - elseif ( ! isset($options['salt'])) - { - if (function_exists('random_bytes')) - { - try - { - $options['salt'] = random_bytes(16); - } - catch (Exception $e) - { - log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage()); - return FALSE; - } - } - elseif (defined('MCRYPT_DEV_URANDOM')) - { - $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); - } - elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) - { - if (($fp = fopen($dev, 'rb')) === FALSE) - { - log_message('error', 'compat/password: Unable to open '.$dev.' for reading.'); - return FALSE; - } - - // Try not to waste entropy ... - is_php('5.4') && stream_set_chunk_size($fp, 16); - - $options['salt'] = ''; - for ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) - { - if (($read = fread($fp, 16 - $read)) === FALSE) - { - log_message('error', 'compat/password: Error while reading from '.$dev.'.'); - return FALSE; - } - $options['salt'] .= $read; - } - - fclose($fp); - } - elseif (function_exists('openssl_random_pseudo_bytes')) - { - $is_secure = NULL; - $options['salt'] = openssl_random_pseudo_bytes(16, $is_secure); - if ($is_secure !== TRUE) - { - log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE'); - return FALSE; - } - } - else - { - log_message('error', 'compat/password: No CSPRNG available.'); - return FALSE; - } - - $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); - } - elseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt'])) - { - $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); - } - - isset($options['cost']) OR $options['cost'] = 10; - - return (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60) - ? $password - : FALSE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('password_needs_rehash')) -{ - /** - * password_needs_rehash() - * - * @link http://php.net/password_needs_rehash - * @param string $hash - * @param int $algo - * @param array $options - * @return bool - */ - function password_needs_rehash($hash, $algo, array $options = array()) - { - $info = password_get_info($hash); - - if ($algo !== $info['algo']) - { - return TRUE; - } - elseif ($algo === 1) - { - $options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10; - return ($info['options']['cost'] !== $options['cost']); - } - - // Odd at first glance, but according to a comment in PHP's own unit tests, - // because it is an unknown algorithm - it's valid and therefore doesn't - // need rehashing. - return FALSE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('password_verify')) -{ - /** - * password_verify() - * - * @link http://php.net/password_verify - * @param string $password - * @param string $hash - * @return bool - */ - function password_verify($password, $hash) - { - if (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60) - { - return FALSE; - } - - $compare = 0; - for ($i = 0; $i < 60; $i++) - { - $compare |= (ord($password[$i]) ^ ord($hash[$i])); - } - - return ($compare === 0); - } -} diff --git a/finecms/finecms/system/core/compat/standard.php b/finecms/finecms/system/core/compat/standard.php deleted file mode 100644 index 7db2efb..0000000 --- a/finecms/finecms/system/core/compat/standard.php +++ /dev/null @@ -1,182 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/DB.php b/finecms/finecms/system/database/DB.php deleted file mode 100644 index c19eef7..0000000 --- a/finecms/finecms/system/database/DB.php +++ /dev/null @@ -1,218 +0,0 @@ -load->get_package_paths() as $path) - { - if ($path !== APPPATH) - { - if (file_exists($file_path = $path.'config/'.ENVIRONMENT.'/database.php')) - { - include($file_path); - } - elseif (file_exists($file_path = $path.'config/database.php')) - { - include($file_path); - } - } - } - } - - if ( ! isset($db) OR count($db) === 0) - { - show_error('No database connection settings were found in the database config file.'); - } - - if ($params !== '') - { - $active_group = $params; - } - - if ( ! isset($active_group)) - { - show_error('You have not specified a database connection group via $active_group in your config/database.php file.'); - } - elseif ( ! isset($db[$active_group])) - { - show_error('You have specified an invalid database connection group ('.$active_group.') in your config/database.php file.'); - } - - $params = $db[$active_group]; - } - elseif (is_string($params)) - { - /** - * Parse the URL from the DSN string - * Database settings can be passed as discreet - * parameters or as a data source name in the first - * parameter. DSNs must have this prototype: - * $dsn = 'driver://username:password@hostname/database'; - */ - if (($dsn = @parse_url($params)) === FALSE) - { - show_error('Invalid DB Connection String'); - } - - $params = array( - 'dbdriver' => $dsn['scheme'], - 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', - 'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '', - 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', - 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', - 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '' - ); - - // Were additional config items set? - if (isset($dsn['query'])) - { - parse_str($dsn['query'], $extra); - - foreach ($extra as $key => $val) - { - if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) - { - $val = var_export($val, TRUE); - } - - $params[$key] = $val; - } - } - } - - // No DB specified yet? Beat them senseless... - if (empty($params['dbdriver'])) - { - show_error('You have not selected a database type to connect to.'); - } - - // Load the DB classes. Note: Since the query builder class is optional - // we need to dynamically create a class that extends proper parent class - // based on whether we're using the query builder class or not. - if ($query_builder_override !== NULL) - { - $query_builder = $query_builder_override; - } - // Backwards compatibility work-around for keeping the - // $active_record config variable working. Should be - // removed in v3.1 - elseif ( ! isset($query_builder) && isset($active_record)) - { - $query_builder = $active_record; - } - - require_once(BASEPATH.'database/DB_driver.php'); - - if ( ! isset($query_builder) OR $query_builder === TRUE) - { - require_once(BASEPATH.'database/DB_query_builder.php'); - if ( ! class_exists('CI_DB', FALSE)) - { - /** - * CI_DB - * - * Acts as an alias for both CI_DB_driver and CI_DB_query_builder. - * - * @see CI_DB_query_builder - * @see CI_DB_driver - */ - class CI_DB extends CI_DB_query_builder { } - } - } - elseif ( ! class_exists('CI_DB', FALSE)) - { - /** - * @ignore - */ - class CI_DB extends CI_DB_driver { } - } - - // Load the DB driver - $driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'; - - file_exists($driver_file) OR show_error('Invalid DB driver'); - require_once($driver_file); - - // Instantiate the DB adapter - $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; - $DB = new $driver($params); - - // Check for a subdriver - if ( ! empty($DB->subdriver)) - { - $driver_file = BASEPATH.'database/drivers/'.$DB->dbdriver.'/subdrivers/'.$DB->dbdriver.'_'.$DB->subdriver.'_driver.php'; - - if (file_exists($driver_file)) - { - require_once($driver_file); - $driver = 'CI_DB_'.$DB->dbdriver.'_'.$DB->subdriver.'_driver'; - $DB = new $driver($params); - } - } - - $DB->initialize(); - return $DB; -} diff --git a/finecms/finecms/system/database/DB_cache.php b/finecms/finecms/system/database/DB_cache.php deleted file mode 100644 index 7c8ee5f..0000000 --- a/finecms/finecms/system/database/DB_cache.php +++ /dev/null @@ -1,221 +0,0 @@ -CI and load the file helper since we use it a lot - $this->CI =& get_instance(); - $this->db =& $db; - $this->CI->load->helper('file'); - - $this->check_path(); - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Directory Path - * - * @param string $path Path to the cache directory - * @return bool - */ - public function check_path($path = '') - { - if ($path === '') - { - if ($this->db->cachedir === '') - { - return $this->db->cache_off(); - } - - $path = $this->db->cachedir; - } - - // Add a trailing slash to the path if needed - $path = realpath($path) - ? rtrim(realpath($path), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR - : rtrim($path, '/').'/'; - - if ( ! is_dir($path)) - { - log_message('debug', 'DB cache path error: '.$path); - - // If the path is wrong we'll turn off caching - return $this->db->cache_off(); - } - - if ( ! is_really_writable($path)) - { - log_message('debug', 'DB cache dir not writable: '.$path); - - // If the path is not really writable we'll turn off caching - return $this->db->cache_off(); - } - - $this->db->cachedir = $path; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Retrieve a cached query - * - * The URI being requested will become the name of the cache sub-folder. - * An MD5 hash of the SQL statement will become the cache file name. - * - * @param string $sql - * @return string - */ - public function read($sql) - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); - - if ( ! is_file($filepath) OR FALSE === ($cachedata = file_get_contents($filepath))) - { - return FALSE; - } - - return unserialize($cachedata); - } - - // -------------------------------------------------------------------- - - /** - * Write a query to a cache file - * - * @param string $sql - * @param object $object - * @return bool - */ - public function write($sql, $object) - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - $filename = md5($sql); - - if ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750)) - { - return FALSE; - } - - if (write_file($dir_path.$filename, serialize($object)) === FALSE) - { - return FALSE; - } - - chmod($dir_path.$filename, 0640); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Delete cache files within a particular directory - * - * @param string $segment_one - * @param string $segment_two - * @return void - */ - public function delete($segment_one = '', $segment_two = '') - { - if ($segment_one === '') - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - } - - if ($segment_two === '') - { - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - } - - $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - delete_files($dir_path, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Delete all existing cache files - * - * @return void - */ - public function delete_all() - { - delete_files($this->db->cachedir, TRUE, TRUE); - } - -} diff --git a/finecms/finecms/system/database/DB_driver.php b/finecms/finecms/system/database/DB_driver.php deleted file mode 100644 index 3eb51f7..0000000 --- a/finecms/finecms/system/database/DB_driver.php +++ /dev/null @@ -1,1986 +0,0 @@ - $val) - { - $this->$key = $val; - } - } - - log_message('info', 'Database Driver Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Initialize Database Settings - * - * @return bool - */ - public function initialize() - { - /* If an established connection is available, then there's - * no need to connect and select the database. - * - * Depending on the database driver, conn_id can be either - * boolean TRUE, a resource or an object. - */ - if ($this->conn_id) - { - return TRUE; - } - - // ---------------------------------------------------------------- - - // Connect to the database and set the connection ID - $this->conn_id = $this->db_connect($this->pconnect); - - // No connection resource? Check if there is a failover else throw an error - if ( ! $this->conn_id) - { - // Check if there is a failover set - if ( ! empty($this->failover) && is_array($this->failover)) - { - // Go over all the failovers - foreach ($this->failover as $failover) - { - // Replace the current settings with those of the failover - foreach ($failover as $key => $val) - { - $this->$key = $val; - } - - // Try to connect - $this->conn_id = $this->db_connect($this->pconnect); - - // If a connection is made break the foreach loop - if ($this->conn_id) - { - break; - } - } - } - - // We still don't have a connection? - if ( ! $this->conn_id) - { - log_message('error', 'Unable to connect to the database'); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_connect'); - } - - return FALSE; - } - } - - // Now we set the character set and that's all - return $this->db_set_charset($this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * DB connect - * - * This is just a dummy method that all drivers will override. - * - * @return mixed - */ - public function db_connect() - { - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @return mixed - */ - public function db_pconnect() - { - return $this->db_connect(TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout. - * - * This is just a dummy method to allow drivers without such - * functionality to not declare it, while others will override it. - * - * @return void - */ - public function reconnect() - { - } - - // -------------------------------------------------------------------- - - /** - * Select database - * - * This is just a dummy method to allow drivers without such - * functionality to not declare it, while others will override it. - * - * @return bool - */ - public function db_select() - { - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Last error - * - * @return array - */ - public function error() - { - return array('code' => NULL, 'message' => NULL); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string - * @return bool - */ - public function db_set_charset($charset) - { - if (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset)) - { - log_message('error', 'Unable to set database connection charset: '.$charset); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_set_charset', $charset); - } - - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * The name of the platform in use (mysql, mssql, etc...) - * - * @return string - */ - public function platform() - { - return $this->dbdriver; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * Returns a string containing the version of the database being used. - * Most drivers will override this method. - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if (FALSE === ($sql = $this->_version())) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - $query = $this->query($sql)->row(); - return $this->data_cache['version'] = $query->ver; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @return string - */ - protected function _version() - { - return 'SELECT VERSION() AS ver'; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * Accepts an SQL string as input and returns a result object upon - * successful execution of a "read" type query. Returns boolean TRUE - * upon successful execution of a "write" type query. Returns boolean - * FALSE upon failure, and if the $db_debug variable is set to TRUE - * will raise an error. - * - * @param string $sql - * @param array $binds = FALSE An array of binding data - * @param bool $return_object = NULL - * @return mixed - */ - public function query($sql, $binds = FALSE, $return_object = NULL) - { - if ($sql === '') - { - log_message('error', 'Invalid query: '.$sql); - return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; - } - elseif ( ! is_bool($return_object)) - { - $return_object = ! $this->is_write_type($sql); - } - - // Verify table prefix and replace if necessary - if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre) - { - $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); - } - - // Compile binds if needed - if ($binds !== FALSE) - { - $sql = $this->compile_binds($sql, $binds); - } - - // Is query caching enabled? If the query is a "read type" - // we will load the caching class and return the previously - // cached query if it exists - if ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init()) - { - $this->load_rdriver(); - if (FALSE !== ($cache = $this->CACHE->read($sql))) - { - return $cache; - } - } - - // Save the query for debugging - if ($this->save_queries === TRUE) - { - $this->queries[] = $sql; - } - - // Start the Query Timer - $time_start = microtime(TRUE); - - // Run the Query - if (FALSE === ($this->result_id = $this->simple_query($sql))) - { - if ($this->save_queries === TRUE) - { - $this->query_times[] = 0; - } - - // This will trigger a rollback if transactions are being used - if ($this->_trans_depth !== 0) - { - $this->_trans_status = FALSE; - } - - // Grab the error now, as we might run some additional queries before displaying the error - $error = $this->error(); - - // Log errors - log_message('error', 'Query error: '.$error['message'].' - Invalid query: '.$sql); - - if ($this->db_debug) - { - // We call this function in order to roll-back queries - // if transactions are enabled. If we don't call this here - // the error message will trigger an exit, causing the - // transactions to remain in limbo. - while ($this->_trans_depth !== 0) - { - $trans_depth = $this->_trans_depth; - $this->trans_complete(); - if ($trans_depth === $this->_trans_depth) - { - log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); - break; - } - } - - // Display errors - return $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql)); - } - - return FALSE; - } - - // Stop and aggregate the query time results - $time_end = microtime(TRUE); - $this->benchmark += $time_end - $time_start; - - if ($this->save_queries === TRUE) - { - $this->query_times[] = $time_end - $time_start; - } - - // Increment the query counter - $this->query_count++; - - // Will we have a result object instantiated? If not - we'll simply return TRUE - if ($return_object !== TRUE) - { - // If caching is enabled we'll auto-cleanup any existing files related to this particular URI - if ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init()) - { - $this->CACHE->delete(); - } - - return TRUE; - } - - // Load and instantiate the result driver - $driver = $this->load_rdriver(); - $RES = new $driver($this); - - // Is query caching enabled? If so, we'll serialize the - // result object and save it to a cache file. - if ($this->cache_on === TRUE && $this->_cache_init()) - { - // We'll create a new instance of the result object - // only without the platform specific driver since - // we can't use it with cached data (the query result - // resource ID won't be any good once we've cached the - // result object, so we'll have to compile the data - // and save it) - $CR = new CI_DB_result($this); - $CR->result_object = $RES->result_object(); - $CR->result_array = $RES->result_array(); - $CR->num_rows = $RES->num_rows(); - - // Reset these since cached objects can not utilize resource IDs. - $CR->conn_id = NULL; - $CR->result_id = NULL; - - $this->CACHE->write($sql, $CR); - } - - return $RES; - } - - // -------------------------------------------------------------------- - - /** - * Load the result drivers - * - * @return string the name of the result class - */ - public function load_rdriver() - { - $driver = 'CI_DB_'.$this->dbdriver.'_result'; - - if ( ! class_exists($driver, FALSE)) - { - require_once(BASEPATH.'database/DB_result.php'); - require_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); - } - - return $driver; - } - - // -------------------------------------------------------------------- - - /** - * Simple Query - * This is a simplified version of the query() function. Internally - * we only use it when running transaction commands since they do - * not require all the features of the main query() function. - * - * @param string the sql query - * @return mixed - */ - public function simple_query($sql) - { - if ( ! $this->conn_id) - { - if ( ! $this->initialize()) - { - return FALSE; - } - } - - return $this->_execute($sql); - } - - // -------------------------------------------------------------------- - - /** - * Disable Transactions - * This permits transactions to be disabled at run-time. - * - * @return void - */ - public function trans_off() - { - $this->trans_enabled = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Enable/disable Transaction Strict Mode - * - * When strict mode is enabled, if you are running multiple groups of - * transactions, if one group fails all subsequent groups will be - * rolled back. - * - * If strict mode is disabled, each group is treated autonomously, - * meaning a failure of one group will not affect any others - * - * @param bool $mode = TRUE - * @return void - */ - public function trans_strict($mode = TRUE) - { - $this->trans_strict = is_bool($mode) ? $mode : TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Start Transaction - * - * @param bool $test_mode = FALSE - * @return bool - */ - public function trans_start($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - - return $this->trans_begin($test_mode); - } - - // -------------------------------------------------------------------- - - /** - * Complete Transaction - * - * @return bool - */ - public function trans_complete() - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - - // The query() function will set this flag to FALSE in the event that a query failed - if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) - { - $this->trans_rollback(); - - // If we are NOT running in strict mode, we will reset - // the _trans_status flag so that subsequent groups of - // transactions will be permitted. - if ($this->trans_strict === FALSE) - { - $this->_trans_status = TRUE; - } - - log_message('debug', 'DB Transaction Failure'); - return FALSE; - } - - return $this->trans_commit(); - } - - // -------------------------------------------------------------------- - - /** - * Lets you retrieve the transaction flag to determine if it has failed - * - * @return bool - */ - public function trans_status() - { - return $this->_trans_status; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @param bool $test_mode - * @return bool - */ - public function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->_trans_depth > 0) - { - $this->_trans_depth++; - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE); - - if ($this->_trans_begin()) - { - $this->_trans_depth++; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - public function trans_commit() - { - if ( ! $this->trans_enabled OR $this->_trans_depth === 0) - { - return FALSE; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->_trans_depth > 1 OR $this->_trans_commit()) - { - $this->_trans_depth--; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - public function trans_rollback() - { - if ( ! $this->trans_enabled OR $this->_trans_depth === 0) - { - return FALSE; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->_trans_depth > 1 OR $this->_trans_rollback()) - { - $this->_trans_depth--; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Compile Bindings - * - * @param string the sql statement - * @param array an array of bind data - * @return string - */ - public function compile_binds($sql, $binds) - { - if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) - { - return $sql; - } - elseif ( ! is_array($binds)) - { - $binds = array($binds); - $bind_count = 1; - } - else - { - // Make sure we're using numeric keys - $binds = array_values($binds); - $bind_count = count($binds); - } - - // We'll need the marker length later - $ml = strlen($this->bind_marker); - - // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) - { - $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', - str_replace($matches[0], - str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), - $sql, $c), - $matches, PREG_OFFSET_CAPTURE); - - // Bind values' count must match the count of markers in the query - if ($bind_count !== $c) - { - return $sql; - } - } - elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) - { - return $sql; - } - - do - { - $c--; - $escaped_value = $this->escape($binds[$c]); - if (is_array($escaped_value)) - { - $escaped_value = '('.implode(',', $escaped_value).')'; - } - $sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml); - } - while ($c !== 0); - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Calculate the aggregate query elapsed time - * - * @param int The number of decimal places - * @return string - */ - public function elapsed_time($decimals = 6) - { - return number_format($this->benchmark, $decimals); - } - - // -------------------------------------------------------------------- - - /** - * Returns the total number of queries - * - * @return int - */ - public function total_queries() - { - return $this->query_count; - } - - // -------------------------------------------------------------------- - - /** - * Returns the last query that was executed - * - * @return string - */ - public function last_query() - { - return end($this->queries); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * Sets boolean and null types - * - * @param string - * @return mixed - */ - public function escape($str) - { - if (is_array($str)) - { - $str = array_map(array(&$this, 'escape'), $str); - return $str; - } - elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))) - { - return "'".$this->escape_str($str)."'"; - } - elseif (is_bool($str)) - { - return ($str === FALSE) ? 0 : 1; - } - elseif ($str === NULL) - { - return 'NULL'; - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @param string|string[] $str Input string - * @param bool $like Whether or not the string will be used in a LIKE condition - * @return string - */ - public function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - $str = $this->_escape_str($str); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - return str_replace( - array($this->_like_escape_chr, '%', '_'), - array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), - $str - ); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Escape LIKE String - * - * Calls the individual driver for platform - * specific escaping for LIKE conditions - * - * @param string|string[] - * @return mixed - */ - public function escape_like_str($str) - { - return $this->escape_str($str, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return str_replace("'", "''", remove_invisible_characters($str, FALSE)); - } - - // -------------------------------------------------------------------- - - /** - * Primary - * - * Retrieves the primary key. It assumes that the row in the first - * position is the primary key - * - * @param string $table Table name - * @return string - */ - public function primary($table) - { - $fields = $this->list_fields($table); - return is_array($fields) ? current($fields) : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param string - * @return int - */ - public function count_all($table = '') - { - if ($table === '') - { - return 0; - } - - $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); - if ($query->num_rows() === 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Returns an array of table names - * - * @param string $constrain_by_prefix = FALSE - * @return array - */ - public function list_tables($constrain_by_prefix = FALSE) - { - // Is there a cached result? - if (isset($this->data_cache['table_names'])) - { - return $this->data_cache['table_names']; - } - - if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - $this->data_cache['table_names'] = array(); - $query = $this->query($sql); - - foreach ($query->result_array() as $row) - { - // Do we know from which column to get the table name? - if ( ! isset($key)) - { - if (isset($row['table_name'])) - { - $key = 'table_name'; - } - elseif (isset($row['TABLE_NAME'])) - { - $key = 'TABLE_NAME'; - } - else - { - /* We have no other choice but to just get the first element's key. - * Due to array_shift() accepting its argument by reference, if - * E_STRICT is on, this would trigger a warning. So we'll have to - * assign it first. - */ - $key = array_keys($row); - $key = array_shift($key); - } - } - - $this->data_cache['table_names'][] = $row[$key]; - } - - return $this->data_cache['table_names']; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular table exists - * - * @param string $table_name - * @return bool - */ - public function table_exists($table_name) - { - return in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables()); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * @return array - */ - public function list_fields($table) - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if (FALSE === ($sql = $this->_list_columns($table))) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - $query = $this->query($sql); - $this->data_cache['field_names'][$table] = array(); - - foreach ($query->result_array() as $row) - { - // Do we know from where to get the column's name? - if ( ! isset($key)) - { - if (isset($row['column_name'])) - { - $key = 'column_name'; - } - elseif (isset($row['COLUMN_NAME'])) - { - $key = 'COLUMN_NAME'; - } - else - { - // We have no other choice but to just get the first element's key. - $key = key($row); - } - } - - $this->data_cache['field_names'][$table][] = $row[$key]; - } - - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular field exists - * - * @param string - * @param string - * @return bool - */ - public function field_exists($field_name, $table_name) - { - return in_array($field_name, $this->list_fields($table_name)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table the table name - * @return array - */ - public function field_data($table) - { - $query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE))); - return ($query) ? $query->field_data() : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @param mixed - * @return mixed - */ - public function escape_identifiers($item) - { - if ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers)) - { - return $item; - } - elseif (is_array($item)) - { - foreach ($item as $key => $value) - { - $item[$key] = $this->escape_identifiers($value); - } - - return $item; - } - // Avoid breaking functions and literal values inside queries - elseif (ctype_digit($item) OR $item[0] === "'" OR ($this->_escape_char !== '"' && $item[0] === '"') OR strpos($item, '(') !== FALSE) - { - return $item; - } - - static $preg_ec = array(); - - if (empty($preg_ec)) - { - if (is_array($this->_escape_char)) - { - $preg_ec = array( - preg_quote($this->_escape_char[0], '/'), - preg_quote($this->_escape_char[1], '/'), - $this->_escape_char[0], - $this->_escape_char[1] - ); - } - else - { - $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/'); - $preg_ec[2] = $preg_ec[3] = $this->_escape_char; - } - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item); - } - } - - return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?(\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item); - } - - // -------------------------------------------------------------------- - - /** - * Generate an insert string - * - * @param string the table upon which the query will be performed - * @param array an associative array data of key/values - * @return string - */ - public function insert_string($table, $data) - { - $fields = $values = array(); - - foreach ($data as $key => $val) - { - $fields[] = $this->escape_identifiers($key); - $values[] = $this->escape($val); - } - - return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - protected function _insert($table, $keys, $values) - { - return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; - } - - // -------------------------------------------------------------------- - - /** - * Generate an update string - * - * @param string the table upon which the query will be performed - * @param array an associative array data of key/values - * @param mixed the "where" statement - * @return string - */ - public function update_string($table, $data, $where) - { - if (empty($where)) - { - return FALSE; - } - - $this->where($where); - - $fields = array(); - foreach ($data as $key => $val) - { - $fields[$this->protect_identifiers($key)] = $this->escape($val); - } - - $sql = $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields); - $this->_reset_write(); - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string the table name - * @param array the update data - * @return string - */ - protected function _update($table, $values) - { - foreach ($values as $key => $val) - { - $valstr[] = $key.' = '.$val; - } - - return 'UPDATE '.$table.' SET '.implode(', ', $valstr) - .$this->_compile_wh('qb_where') - .$this->_compile_order_by() - .($this->qb_limit ? ' LIMIT '.$this->qb_limit : ''); - } - - // -------------------------------------------------------------------- - - /** - * Tests whether the string has an SQL operator - * - * @param string - * @return bool - */ - protected function _has_operator($str) - { - return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str)); - } - - // -------------------------------------------------------------------- - - /** - * Returns the SQL string operator - * - * @param string - * @return string - */ - protected function _get_operator($str) - { - static $_operators; - - if (empty($_operators)) - { - $_les = ($this->_like_escape_str !== '') - ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') - : ''; - $_operators = array( - '\s*(?:<|>|!)?=\s*', // =, <=, >=, != - '\s*<>?\s*', // <, <> - '\s*>\s*', // > - '\s+IS NULL', // IS NULL - '\s+IS NOT NULL', // IS NOT NULL - '\s+EXISTS\s*\(.*\)', // EXISTS(sql) - '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) - '\s+BETWEEN\s+', // BETWEEN value AND value - '\s+IN\s*\(.*\)', // IN(list) - '\s+NOT IN\s*\(.*\)', // NOT IN (list) - '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] - '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] - ); - - } - - return preg_match('/'.implode('|', $_operators).'/i', $str, $match) - ? $match[0] : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Enables a native PHP function to be run, using a platform agnostic wrapper. - * - * @param string $function Function name - * @return mixed - */ - public function call_function($function) - { - $driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_'; - - if (FALSE === strpos($driver, $function)) - { - $function = $driver.$function; - } - - if ( ! function_exists($function)) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - return (func_num_args() > 1) - ? call_user_func_array($function, array_slice(func_get_args(), 1)) - : call_user_func($function); - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Directory Path - * - * @param string the path to the cache directory - * @return void - */ - public function cache_set_path($path = '') - { - $this->cachedir = $path; - } - - // -------------------------------------------------------------------- - - /** - * Enable Query Caching - * - * @return bool cache_on value - */ - public function cache_on() - { - return $this->cache_on = TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Disable Query Caching - * - * @return bool cache_on value - */ - public function cache_off() - { - return $this->cache_on = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Delete the cache files associated with a particular URI - * - * @param string $segment_one = '' - * @param string $segment_two = '' - * @return bool - */ - public function cache_delete($segment_one = '', $segment_two = '') - { - return $this->_cache_init() - ? $this->CACHE->delete($segment_one, $segment_two) - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Delete All cache files - * - * @return bool - */ - public function cache_delete_all() - { - return $this->_cache_init() - ? $this->CACHE->delete_all() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Initialize the Cache Class - * - * @return bool - */ - protected function _cache_init() - { - if ( ! class_exists('CI_DB_Cache', FALSE)) - { - require_once(BASEPATH.'database/DB_cache.php'); - } - elseif (is_object($this->CACHE)) - { - return TRUE; - } - - $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - public function close() - { - if ($this->conn_id) - { - $this->_close(); - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * This method would be overridden by most of the drivers. - * - * @return void - */ - protected function _close() - { - $this->conn_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Display an error message - * - * @param string the error message - * @param string any "swap" values - * @param bool whether to localize the message - * @return string sends the application/views/errors/error_db.php template - */ - public function display_error($error = '', $swap = '', $native = FALSE) - { - $LANG =& load_class('Lang', 'core'); - $LANG->load('db'); - - $heading = $LANG->line('db_error_heading'); - - if ($native === TRUE) - { - $message = (array) $error; - } - else - { - $message = is_array($error) ? $error : array(str_replace('%s', $swap, $LANG->line($error))); - } - - // Find the most likely culprit of the error by going through - // the backtrace until the source file is no longer in the - // database folder. - $trace = debug_backtrace(); - foreach ($trace as $call) - { - if (isset($call['file'], $call['class'])) - { - // We'll need this on Windows, as APPPATH and BASEPATH will always use forward slashes - if (DIRECTORY_SEPARATOR !== '/') - { - $call['file'] = str_replace('\\', '/', $call['file']); - } - - if (strpos($call['file'], BASEPATH.'database') === FALSE && strpos($call['class'], 'Loader') === FALSE) - { - // Found it - use a relative path for safety - $message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']); - $message[] = 'Line Number: '.$call['line']; - break; - } - } - } - - $error =& load_class('Exceptions', 'core'); - echo $error->show_error($heading, $message, 'error_db'); - exit(8); // EXIT_DATABASE - } - - // -------------------------------------------------------------------- - - /** - * Protect Identifiers - * - * This function is used extensively by the Query Builder class, and by - * a couple functions in this class. - * It takes a column or table name (optionally with an alias) and inserts - * the table prefix onto it. Some logic is necessary in order to deal with - * column names that include the path. Consider a query like this: - * - * SELECT hostname.database.table.column AS c FROM hostname.database.table - * - * Or a query with aliasing: - * - * SELECT m.member_id, m.member_name FROM members AS m - * - * Since the column name can include up to four segments (host, DB, table, column) - * or also have an alias prefix, we need to do a bit of work to figure this out and - * insert the table prefix (if it exists) in the proper position, and escape only - * the correct identifiers. - * - * @param string - * @param bool - * @param mixed - * @param bool - * @return string - */ - public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) - { - if ( ! is_bool($protect_identifiers)) - { - $protect_identifiers = $this->_protect_identifiers; - } - - if (is_array($item)) - { - $escaped_array = array(); - foreach ($item as $k => $v) - { - $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists); - } - - return $escaped_array; - } - - // This is basically a bug fix for queries that use MAX, MIN, etc. - // If a parenthesis is found we know that we do not need to - // escape the data or add a prefix. There's probably a more graceful - // way to deal with this, but I'm not thinking of it -- Rick - // - // Added exception for single quotes as well, we don't want to alter - // literal strings. -- Narf - if (strcspn($item, "()'") !== strlen($item)) - { - return $item; - } - - // Convert tabs or multiple spaces into single spaces - $item = preg_replace('/\s+/', ' ', trim($item)); - - // If the item has an alias declaration we remove it and set it aside. - // Note: strripos() is used in order to support spaces in table names - if ($offset = strripos($item, ' AS ')) - { - $alias = ($protect_identifiers) - ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4)) - : substr($item, $offset); - $item = substr($item, 0, $offset); - } - elseif ($offset = strrpos($item, ' ')) - { - $alias = ($protect_identifiers) - ? ' '.$this->escape_identifiers(substr($item, $offset + 1)) - : substr($item, $offset); - $item = substr($item, 0, $offset); - } - else - { - $alias = ''; - } - - // Break the string apart if it contains periods, then insert the table prefix - // in the correct location, assuming the period doesn't indicate that we're dealing - // with an alias. While we're at it, we will escape the components - if (strpos($item, '.') !== FALSE) - { - $parts = explode('.', $item); - - // Does the first segment of the exploded item match - // one of the aliases previously identified? If so, - // we have nothing more to do other than escape the item - // - // NOTE: The ! empty() condition prevents this method - // from breaking when QB isn't enabled. - if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables)) - { - if ($protect_identifiers === TRUE) - { - foreach ($parts as $key => $val) - { - if ( ! in_array($val, $this->_reserved_identifiers)) - { - $parts[$key] = $this->escape_identifiers($val); - } - } - - $item = implode('.', $parts); - } - - return $item.$alias; - } - - // Is there a table prefix defined in the config file? If not, no need to do anything - if ($this->dbprefix !== '') - { - // We now add the table prefix based on some logic. - // Do we have 4 segments (hostname.database.table.column)? - // If so, we add the table prefix to the column name in the 3rd segment. - if (isset($parts[3])) - { - $i = 2; - } - // Do we have 3 segments (database.table.column)? - // If so, we add the table prefix to the column name in 2nd position - elseif (isset($parts[2])) - { - $i = 1; - } - // Do we have 2 segments (table.column)? - // If so, we add the table prefix to the column name in 1st segment - else - { - $i = 0; - } - - // This flag is set when the supplied $item does not contain a field name. - // This can happen when this function is being called from a JOIN. - if ($field_exists === FALSE) - { - $i++; - } - - // Verify table prefix and replace if necessary - if ($this->swap_pre !== '' && strpos($parts[$i], $this->swap_pre) === 0) - { - $parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]); - } - // We only add the table prefix if it does not already exist - elseif (strpos($parts[$i], $this->dbprefix) !== 0) - { - $parts[$i] = $this->dbprefix.$parts[$i]; - } - - // Put the parts back together - $item = implode('.', $parts); - } - - if ($protect_identifiers === TRUE) - { - $item = $this->escape_identifiers($item); - } - - return $item.$alias; - } - - // Is there a table prefix? If not, no need to insert it - if ($this->dbprefix !== '') - { - // Verify table prefix and replace if necessary - if ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0) - { - $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); - } - // Do we prefix an item with no segments? - elseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0) - { - $item = $this->dbprefix.$item; - } - } - - if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers)) - { - $item = $this->escape_identifiers($item); - } - - return $item.$alias; - } - - // -------------------------------------------------------------------- - - /** - * Dummy method that allows Query Builder class to be disabled - * and keep count_all() working. - * - * @return void - */ - protected function _reset_select() - { - } - -} diff --git a/finecms/finecms/system/database/DB_forge.php b/finecms/finecms/system/database/DB_forge.php deleted file mode 100644 index 3cb02ca..0000000 --- a/finecms/finecms/system/database/DB_forge.php +++ /dev/null @@ -1,1032 +0,0 @@ -db =& $db; - log_message('info', 'Database Forge Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return bool - */ - public function create_database($db_name) - { - if ($this->_create_database === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat))) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - if ( ! empty($this->db->data_cache['db_names'])) - { - $this->db->data_cache['db_names'][] = $db_name; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name - * @return bool - */ - public function drop_database($db_name) - { - if ($this->_drop_database === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name)))) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - if ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Add Key - * - * @param string $key - * @param bool $primary - * @return CI_DB_forge - */ - public function add_key($key, $primary = FALSE) - { - // DO NOT change this! This condition is only applicable - // for PRIMARY keys because you can only have one such, - // and therefore all fields you add to it will be included - // in the same, composite PRIMARY KEY. - // - // It's not the same for regular indexes. - if ($primary === TRUE && is_array($key)) - { - foreach ($key as $one) - { - $this->add_key($one, $primary); - } - - return $this; - } - - if ($primary === TRUE) - { - $this->primary_keys[] = $key; - } - else - { - $this->keys[] = $key; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Add Field - * - * @param array $field - * @return CI_DB_forge - */ - public function add_field($field) - { - if (is_string($field)) - { - if ($field === 'id') - { - $this->add_field(array( - 'id' => array( - 'type' => 'INT', - 'constraint' => 9, - 'auto_increment' => TRUE - ) - )); - $this->add_key('id', TRUE); - } - else - { - if (strpos($field, ' ') === FALSE) - { - show_error('Field information is required for that operation.'); - } - - $this->fields[] = $field; - } - } - - if (is_array($field)) - { - $this->fields = array_merge($this->fields, $field); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @param string $table Table name - * @param bool $if_not_exists Whether to add IF NOT EXISTS condition - * @param array $attributes Associative array of table attributes - * @return bool - */ - public function create_table($table, $if_not_exists = FALSE, array $attributes = array()) - { - if ($table === '') - { - show_error('A table name is required for that operation.'); - } - else - { - $table = $this->db->dbprefix.$table; - } - - if (count($this->fields) === 0) - { - show_error('Field information is required.'); - } - - $sql = $this->_create_table($table, $if_not_exists, $attributes); - - if (is_bool($sql)) - { - $this->_reset(); - if ($sql === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - } - - if (($result = $this->db->query($sql)) !== FALSE) - { - isset($this->db->data_cache['table_names']) && $this->db->data_cache['table_names'][] = $table; - - // Most databases don't support creating indexes from within the CREATE TABLE statement - if ( ! empty($this->keys)) - { - for ($i = 0, $sqls = $this->_process_indexes($table), $c = count($sqls); $i < $c; $i++) - { - $this->db->query($sqls[$i]); - } - } - } - - $this->_reset(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @param string $table Table name - * @param bool $if_not_exists Whether to add 'IF NOT EXISTS' condition - * @param array $attributes Associative array of table attributes - * @return mixed - */ - protected function _create_table($table, $if_not_exists, $attributes) - { - if ($if_not_exists === TRUE && $this->_create_table_if === FALSE) - { - if ($this->db->table_exists($table)) - { - return TRUE; - } - else - { - $if_not_exists = FALSE; - } - } - - $sql = ($if_not_exists) - ? sprintf($this->_create_table_if, $this->db->escape_identifiers($table)) - : 'CREATE TABLE'; - - $columns = $this->_process_fields(TRUE); - for ($i = 0, $c = count($columns); $i < $c; $i++) - { - $columns[$i] = ($columns[$i]['_literal'] !== FALSE) - ? "\n\t".$columns[$i]['_literal'] - : "\n\t".$this->_process_column($columns[$i]); - } - - $columns = implode(',', $columns) - .$this->_process_primary_keys($table); - - // Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL) - if ($this->_create_table_keys === TRUE) - { - $columns .= $this->_process_indexes($table); - } - - // _create_table will usually have the following format: "%s %s (%s\n)" - $sql = sprintf($this->_create_table.'%s', - $sql, - $this->db->escape_identifiers($table), - $columns, - $this->_create_table_attr($attributes) - ); - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * CREATE TABLE attributes - * - * @param array $attributes Associative array of table attributes - * @return string - */ - protected function _create_table_attr($attributes) - { - $sql = ''; - - foreach (array_keys($attributes) as $key) - { - if (is_string($key)) - { - $sql .= ' '.strtoupper($key).' '.$attributes[$key]; - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @param string $table_name Table name - * @param bool $if_exists Whether to add an IF EXISTS condition - * @return bool - */ - public function drop_table($table_name, $if_exists = FALSE) - { - if ($table_name === '') - { - return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE; - } - - if (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE) - { - return TRUE; - } - - $query = $this->db->query($query); - - // Update table list cache - if ($query && ! empty($this->db->data_cache['table_names'])) - { - $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['table_names'][$key]); - } - } - - return $query; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * Generates a platform-specific DROP TABLE string - * - * @param string $table Table name - * @param bool $if_exists Whether to add an IF EXISTS condition - * @return mixed (Returns a platform-specific DROP table string, or TRUE to indicate there's nothing to do) - */ - protected function _drop_table($table, $if_exists) - { - $sql = 'DROP TABLE'; - - if ($if_exists) - { - if ($this->_drop_table_if === FALSE) - { - if ( ! $this->db->table_exists($table)) - { - return TRUE; - } - } - else - { - $sql = sprintf($this->_drop_table_if, $this->db->escape_identifiers($table)); - } - } - - return $sql.' '.$this->db->escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Rename Table - * - * @param string $table_name Old table name - * @param string $new_table_name New table name - * @return bool - */ - public function rename_table($table_name, $new_table_name) - { - if ($table_name === '' OR $new_table_name === '') - { - show_error('A table name is required for that operation.'); - return FALSE; - } - elseif ($this->_rename_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $result = $this->db->query(sprintf($this->_rename_table, - $this->db->escape_identifiers($this->db->dbprefix.$table_name), - $this->db->escape_identifiers($this->db->dbprefix.$new_table_name)) - ); - - if ($result && ! empty($this->db->data_cache['table_names'])) - { - $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); - if ($key !== FALSE) - { - $this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name; - } - } - - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Column Add - * - * @todo Remove deprecated $_after option in 3.1+ - * @param string $table Table name - * @param array $field Column definition - * @param string $_after Column for AFTER clause (deprecated) - * @return bool - */ - public function add_column($table, $field, $_after = NULL) - { - // Work-around for literal column definitions - is_array($field) OR $field = array($field); - - foreach (array_keys($field) as $k) - { - // Backwards-compatibility work-around for MySQL/CUBRID AFTER clause (remove in 3.1+) - if ($_after !== NULL && is_array($field[$k]) && ! isset($field[$k]['after'])) - { - $field[$k]['after'] = $_after; - } - - $this->add_field(array($k => $field[$k])); - } - - $sqls = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->_process_fields()); - $this->_reset(); - if ($sqls === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - for ($i = 0, $c = count($sqls); $i < $c; $i++) - { - if ($this->db->query($sqls[$i]) === FALSE) - { - return FALSE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Column Drop - * - * @param string $table Table name - * @param string $column_name Column name - * @return bool - */ - public function drop_column($table, $column_name) - { - $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); - if ($sql === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Column Modify - * - * @param string $table Table name - * @param string $field Column definition - * @return bool - */ - public function modify_column($table, $field) - { - // Work-around for literal column definitions - is_array($field) OR $field = array($field); - - foreach (array_keys($field) as $k) - { - $this->add_field(array($k => $field[$k])); - } - - if (count($this->fields) === 0) - { - show_error('Field information is required.'); - } - - $sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields()); - $this->_reset(); - if ($sqls === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - for ($i = 0, $c = count($sqls); $i < $c; $i++) - { - if ($this->db->query($sqls[$i]) === FALSE) - { - return FALSE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' '; - - // DROP has everything it needs now. - if ($alter_type === 'DROP') - { - return $sql.'DROP COLUMN '.$this->db->escape_identifiers($field); - } - - $sql .= ($alter_type === 'ADD') - ? 'ADD ' - : $alter_type.' COLUMN '; - - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql - .($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i])); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process fields - * - * @param bool $create_table - * @return array - */ - protected function _process_fields($create_table = FALSE) - { - $fields = array(); - - foreach ($this->fields as $key => $attributes) - { - if (is_int($key) && ! is_array($attributes)) - { - $fields[] = array('_literal' => $attributes); - continue; - } - - $attributes = array_change_key_case($attributes, CASE_UPPER); - - if ($create_table === TRUE && empty($attributes['TYPE'])) - { - continue; - } - - isset($attributes['TYPE']) && $this->_attr_type($attributes); - - $field = array( - 'name' => $key, - 'new_name' => isset($attributes['NAME']) ? $attributes['NAME'] : NULL, - 'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL, - 'length' => '', - 'unsigned' => '', - 'null' => '', - 'unique' => '', - 'default' => '', - 'auto_increment' => '', - '_literal' => FALSE - ); - - isset($attributes['TYPE']) && $this->_attr_unsigned($attributes, $field); - - if ($create_table === FALSE) - { - if (isset($attributes['AFTER'])) - { - $field['after'] = $attributes['AFTER']; - } - elseif (isset($attributes['FIRST'])) - { - $field['first'] = (bool) $attributes['FIRST']; - } - } - - $this->_attr_default($attributes, $field); - - if (isset($attributes['NULL'])) - { - if ($attributes['NULL'] === TRUE) - { - $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; - } - else - { - $field['null'] = ' NOT NULL'; - } - } - elseif ($create_table === TRUE) - { - $field['null'] = ' NOT NULL'; - } - - $this->_attr_auto_increment($attributes, $field); - $this->_attr_unique($attributes, $field); - - if (isset($attributes['COMMENT'])) - { - $field['comment'] = $this->db->escape($attributes['COMMENT']); - } - - if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); - default: - $field['length'] = is_array($attributes['CONSTRAINT']) - ? '('.implode(',', $attributes['CONSTRAINT']).')' - : '('.$attributes['CONSTRAINT'].')'; - break; - } - } - - $fields[] = $field; - } - - return $fields; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['default'] - .$field['null'] - .$field['auto_increment'] - .$field['unique']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - // Usually overridden by drivers - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNSIGNED - * - * Depending on the _unsigned property value: - * - * - TRUE will always set $field['unsigned'] to 'UNSIGNED' - * - FALSE will always set $field['unsigned'] to '' - * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', - * if $attributes['TYPE'] is found in the array - * - array(TYPE => UTYPE) will change $field['type'], - * from TYPE to UTYPE in case of a match - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unsigned(&$attributes, &$field) - { - if (empty($attributes['UNSIGNED']) OR $attributes['UNSIGNED'] !== TRUE) - { - return; - } - - // Reset the attribute in order to avoid issues if we do type conversion - $attributes['UNSIGNED'] = FALSE; - - if (is_array($this->_unsigned)) - { - foreach (array_keys($this->_unsigned) as $key) - { - if (is_int($key) && strcasecmp($attributes['TYPE'], $this->_unsigned[$key]) === 0) - { - $field['unsigned'] = ' UNSIGNED'; - return; - } - elseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) - { - $field['type'] = $key; - return; - } - } - - return; - } - - $field['unsigned'] = ($this->_unsigned === TRUE) ? ' UNSIGNED' : ''; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute DEFAULT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_default(&$attributes, &$field) - { - if ($this->_default === FALSE) - { - return; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - if ($attributes['DEFAULT'] === NULL) - { - $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; - - // Override the NULL attribute if that's our default - $attributes['NULL'] = TRUE; - $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; - } - else - { - $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); - } - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE'; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' AUTO_INCREMENT'; - } - } - - // -------------------------------------------------------------------- - - /** - * Process primary keys - * - * @param string $table Table name - * @return string - */ - protected function _process_primary_keys($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->primary_keys); $i < $c; $i++) - { - if ( ! isset($this->fields[$this->primary_keys[$i]])) - { - unset($this->primary_keys[$i]); - } - } - - if (count($this->primary_keys) > 0) - { - $sql .= ",\n\tCONSTRAINT ".$this->db->escape_identifiers('pk_'.$table) - .' PRIMARY KEY('.implode(', ', $this->db->escape_identifiers($this->primary_keys)).')'; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table Table name - * @return string[] list of SQL statements - */ - protected function _process_indexes($table) - { - $sqls = array(); - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sqls[] = 'CREATE INDEX '.$this->db->escape_identifiers($table.'_'.implode('_', $this->keys[$i])) - .' ON '.$this->db->escape_identifiers($table) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).');'; - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Reset - * - * Resets table creation vars - * - * @return void - */ - protected function _reset() - { - $this->fields = $this->keys = $this->primary_keys = array(); - } - -} diff --git a/finecms/finecms/system/database/DB_query_builder.php b/finecms/finecms/system/database/DB_query_builder.php deleted file mode 100644 index 9216651..0000000 --- a/finecms/finecms/system/database/DB_query_builder.php +++ /dev/null @@ -1,2805 +0,0 @@ -_protect_identifiers; - - foreach ($select as $val) - { - $val = trim($val); - - if ($val !== '') - { - $this->qb_select[] = $val; - $this->qb_no_escape[] = $escape; - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_select[] = $val; - $this->qb_cache_exists[] = 'select'; - $this->qb_cache_no_escape[] = $escape; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Select Max - * - * Generates a SELECT MAX(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_max($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'MAX'); - } - - // -------------------------------------------------------------------- - - /** - * Select Min - * - * Generates a SELECT MIN(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_min($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'MIN'); - } - - // -------------------------------------------------------------------- - - /** - * Select Average - * - * Generates a SELECT AVG(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_avg($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'AVG'); - } - - // -------------------------------------------------------------------- - - /** - * Select Sum - * - * Generates a SELECT SUM(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_sum($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'SUM'); - } - - // -------------------------------------------------------------------- - - /** - * SELECT [MAX|MIN|AVG|SUM]() - * - * @used-by select_max() - * @used-by select_min() - * @used-by select_avg() - * @used-by select_sum() - * - * @param string $select Field name - * @param string $alias - * @param string $type - * @return CI_DB_query_builder - */ - protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') - { - if ( ! is_string($select) OR $select === '') - { - $this->display_error('db_invalid_query'); - } - - $type = strtoupper($type); - - if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) - { - show_error('Invalid function type: '.$type); - } - - if ($alias === '') - { - $alias = $this->_create_alias_from_table(trim($select)); - } - - $sql = $type.'('.$this->protect_identifiers(trim($select)).') AS '.$this->escape_identifiers(trim($alias)); - - $this->qb_select[] = $sql; - $this->qb_no_escape[] = NULL; - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_select[] = $sql; - $this->qb_cache_exists[] = 'select'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Determines the alias name based on the table - * - * @param string $item - * @return string - */ - protected function _create_alias_from_table($item) - { - if (strpos($item, '.') !== FALSE) - { - $item = explode('.', $item); - return end($item); - } - - return $item; - } - - // -------------------------------------------------------------------- - - /** - * DISTINCT - * - * Sets a flag which tells the query string compiler to add DISTINCT - * - * @param bool $val - * @return CI_DB_query_builder - */ - public function distinct($val = TRUE) - { - $this->qb_distinct = is_bool($val) ? $val : TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * From - * - * Generates the FROM portion of the query - * - * @param mixed $from can be a string or array - * @return CI_DB_query_builder - */ - public function from($from) - { - foreach ((array) $from as $val) - { - if (strpos($val, ',') !== FALSE) - { - foreach (explode(',', $val) as $v) - { - $v = trim($v); - $this->_track_aliases($v); - - $this->qb_from[] = $v = $this->protect_identifiers($v, TRUE, NULL, FALSE); - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_from[] = $v; - $this->qb_cache_exists[] = 'from'; - } - } - } - else - { - $val = trim($val); - - // Extract any aliases that might exist. We use this information - // in the protect_identifiers to know whether to add a table prefix - $this->_track_aliases($val); - - $this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_from[] = $val; - $this->qb_cache_exists[] = 'from'; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * JOIN - * - * Generates the JOIN portion of the query - * - * @param string - * @param string the join condition - * @param string the type of join - * @param string whether not to try to escape identifiers - * @return CI_DB_query_builder - */ - public function join($table, $cond, $type = '', $escape = NULL) - { - if ($type !== '') - { - $type = strtoupper(trim($type)); - - if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) - { - $type = ''; - } - else - { - $type .= ' '; - } - } - - // Extract any aliases that might exist. We use this information - // in the protect_identifiers to know whether to add a table prefix - $this->_track_aliases($table); - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - if ( ! $this->_has_operator($cond)) - { - $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; - } - elseif ($escape === FALSE) - { - $cond = ' ON '.$cond; - } - else - { - // Split multiple conditions - if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) - { - $conditions = array(); - $joints = $joints[0]; - array_unshift($joints, array('', 0)); - - for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) - { - $joints[$i][1] += strlen($joints[$i][0]); // offset - $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); - $pos = $joints[$i][1] - strlen($joints[$i][0]); - $joints[$i] = $joints[$i][0]; - } - } - else - { - $conditions = array($cond); - $joints = array(''); - } - - $cond = ' ON '; - for ($i = 0, $c = count($conditions); $i < $c; $i++) - { - $operator = $this->_get_operator($conditions[$i]); - $cond .= $joints[$i]; - $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match) - ? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3]) - : $conditions[$i]; - } - } - - // Do we want to escape the table name? - if ($escape === TRUE) - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // Assemble the JOIN statement - $this->qb_join[] = $join = $type.'JOIN '.$table.$cond; - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_join[] = $join; - $this->qb_cache_exists[] = 'join'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * WHERE - * - * Generates the WHERE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed - * @param mixed - * @param bool - * @return CI_DB_query_builder - */ - public function where($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_where', $key, $value, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR WHERE - * - * Generates the WHERE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed - * @param mixed - * @param bool - * @return CI_DB_query_builder - */ - public function or_where($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_where', $key, $value, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * WHERE, HAVING - * - * @used-by where() - * @used-by or_where() - * @used-by having() - * @used-by or_having() - * - * @param string $qb_key 'qb_where' or 'qb_having' - * @param mixed $key - * @param mixed $value - * @param string $type - * @param bool $escape - * @return CI_DB_query_builder - */ - protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = NULL) - { - $qb_cache_key = ($qb_key === 'qb_having') ? 'qb_cache_having' : 'qb_cache_where'; - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - // If the escape value was not set will base it on the global setting - is_bool($escape) OR $escape = $this->_protect_identifiers; - - foreach ($key as $k => $v) - { - $prefix = (count($this->$qb_key) === 0 && count($this->$qb_cache_key) === 0) - ? $this->_group_get_type('') - : $this->_group_get_type($type); - - if ($v !== NULL) - { - if ($escape === TRUE) - { - $v = ' '.$this->escape($v); - } - - if ( ! $this->_has_operator($k)) - { - $k .= ' = '; - } - } - elseif ( ! $this->_has_operator($k)) - { - // value appears not to have been set, assign the test to IS NULL - $k .= ' IS NULL'; - } - elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) - { - $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); - } - - $this->{$qb_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); - if ($this->qb_caching === TRUE) - { - $this->{$qb_cache_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); - $this->qb_cache_exists[] = substr($qb_key, 3); - } - - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * WHERE IN - * - * Generates a WHERE field IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function where_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, FALSE, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR WHERE IN - * - * Generates a WHERE field IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_where_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, FALSE, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * WHERE NOT IN - * - * Generates a WHERE field NOT IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function where_not_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, TRUE, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR WHERE NOT IN - * - * Generates a WHERE field NOT IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_where_not_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, TRUE, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Internal WHERE IN - * - * @used-by where_in() - * @used-by or_where_in() - * @used-by where_not_in() - * @used-by or_where_not_in() - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $not If the statement would be IN or NOT IN - * @param string $type - * @param bool $escape - * @return CI_DB_query_builder - */ - protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL) - { - if ($key === NULL OR $values === NULL) - { - return $this; - } - - if ( ! is_array($values)) - { - $values = array($values); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - $not = ($not) ? ' NOT' : ''; - - if ($escape === TRUE) - { - $where_in = array(); - foreach ($values as $value) - { - $where_in[] = $this->escape($value); - } - } - else - { - $where_in = array_values($values); - } - - $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) - ? $this->_group_get_type('') - : $this->_group_get_type($type); - - $where_in = array( - 'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')', - 'escape' => $escape - ); - - $this->qb_where[] = $where_in; - if ($this->qb_caching === TRUE) - { - $this->qb_cache_where[] = $where_in; - $this->qb_cache_exists[] = 'where'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * LIKE - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'AND ', $side, '', $escape); - } - - // -------------------------------------------------------------------- - - /** - * NOT LIKE - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function not_like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR LIKE - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'OR ', $side, '', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR NOT LIKE - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_not_like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Internal LIKE - * - * @used-by like() - * @used-by or_like() - * @used-by not_like() - * @used-by or_not_like() - * - * @param mixed $field - * @param string $match - * @param string $type - * @param string $side - * @param string $not - * @param bool $escape - * @return CI_DB_query_builder - */ - protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '', $escape = NULL) - { - if ( ! is_array($field)) - { - $field = array($field => $match); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - // lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh) - $side = strtolower($side); - - foreach ($field as $k => $v) - { - $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) - ? $this->_group_get_type('') : $this->_group_get_type($type); - - if ($escape === TRUE) - { - $v = $this->escape_like_str($v); - } - - if ($side === 'none') - { - $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}'"; - } - elseif ($side === 'before') - { - $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}'"; - } - elseif ($side === 'after') - { - $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}%'"; - } - else - { - $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}%'"; - } - - // some platforms require an escape sequence definition for LIKE wildcards - if ($escape === TRUE && $this->_like_escape_str !== '') - { - $like_statement .= sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - $this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape); - if ($this->qb_caching === TRUE) - { - $this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape); - $this->qb_cache_exists[] = 'where'; - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group. - * - * @param string $not (Internal use only) - * @param string $type (Internal use only) - * @return CI_DB_query_builder - */ - public function group_start($not = '', $type = 'AND ') - { - $type = $this->_group_get_type($type); - - $this->qb_where_group_started = TRUE; - $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; - $where = array( - 'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (', - 'escape' => FALSE - ); - - $this->qb_where[] = $where; - if ($this->qb_caching) - { - $this->qb_cache_where[] = $where; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group, but ORs the group - * - * @return CI_DB_query_builder - */ - public function or_group_start() - { - return $this->group_start('', 'OR '); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group, but NOTs the group - * - * @return CI_DB_query_builder - */ - public function not_group_start() - { - return $this->group_start('NOT ', 'AND '); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group, but OR NOTs the group - * - * @return CI_DB_query_builder - */ - public function or_not_group_start() - { - return $this->group_start('NOT ', 'OR '); - } - - // -------------------------------------------------------------------- - - /** - * Ends a query group - * - * @return CI_DB_query_builder - */ - public function group_end() - { - $this->qb_where_group_started = FALSE; - $where = array( - 'condition' => str_repeat(' ', $this->qb_where_group_count--).')', - 'escape' => FALSE - ); - - $this->qb_where[] = $where; - if ($this->qb_caching) - { - $this->qb_cache_where[] = $where; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Group_get_type - * - * @used-by group_start() - * @used-by _like() - * @used-by _wh() - * @used-by _where_in() - * - * @param string $type - * @return string - */ - protected function _group_get_type($type) - { - if ($this->qb_where_group_started) - { - $type = ''; - $this->qb_where_group_started = FALSE; - } - - return $type; - } - - // -------------------------------------------------------------------- - - /** - * GROUP BY - * - * @param string $by - * @param bool $escape - * @return CI_DB_query_builder - */ - public function group_by($by, $escape = NULL) - { - is_bool($escape) OR $escape = $this->_protect_identifiers; - - if (is_string($by)) - { - $by = ($escape === TRUE) - ? explode(',', $by) - : array($by); - } - - foreach ($by as $val) - { - $val = trim($val); - - if ($val !== '') - { - $val = array('field' => $val, 'escape' => $escape); - - $this->qb_groupby[] = $val; - if ($this->qb_caching === TRUE) - { - $this->qb_cache_groupby[] = $val; - $this->qb_cache_exists[] = 'groupby'; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * HAVING - * - * Separates multiple calls with 'AND'. - * - * @param string $key - * @param string $value - * @param bool $escape - * @return CI_DB_query_builder - */ - public function having($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_having', $key, $value, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR HAVING - * - * Separates multiple calls with 'OR'. - * - * @param string $key - * @param string $value - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_having($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_having', $key, $value, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderby - * @param string $direction ASC, DESC or RANDOM - * @param bool $escape - * @return CI_DB_query_builder - */ - public function order_by($orderby, $direction = '', $escape = NULL) - { - $direction = strtoupper(trim($direction)); - - if ($direction === 'RANDOM') - { - $direction = ''; - - // Do we have a seed value? - $orderby = ctype_digit((string) $orderby) - ? sprintf($this->_random_keyword[1], $orderby) - : $this->_random_keyword[0]; - } - elseif (empty($orderby)) - { - return $this; - } - elseif ($direction !== '') - { - $direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : ''; - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - if ($escape === FALSE) - { - $qb_orderby[] = array('field' => $orderby, 'direction' => $direction, 'escape' => FALSE); - } - else - { - $qb_orderby = array(); - foreach (explode(',', $orderby) as $field) - { - $qb_orderby[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) - ? array('field' => ltrim(substr($field, 0, $match[0][1])), 'direction' => ' '.$match[1][0], 'escape' => TRUE) - : array('field' => trim($field), 'direction' => $direction, 'escape' => TRUE); - } - } - - $this->qb_orderby = array_merge($this->qb_orderby, $qb_orderby); - if ($this->qb_caching === TRUE) - { - $this->qb_cache_orderby = array_merge($this->qb_cache_orderby, $qb_orderby); - $this->qb_cache_exists[] = 'orderby'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * @param int $value LIMIT value - * @param int $offset OFFSET value - * @return CI_DB_query_builder - */ - public function limit($value, $offset = 0) - { - is_null($value) OR $this->qb_limit = (int) $value; - empty($offset) OR $this->qb_offset = (int) $offset; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Sets the OFFSET value - * - * @param int $offset OFFSET value - * @return CI_DB_query_builder - */ - public function offset($offset) - { - empty($offset) OR $this->qb_offset = (int) $offset; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * LIMIT string - * - * Generates a platform-specific LIMIT clause. - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit; - } - - // -------------------------------------------------------------------- - - /** - * The "set" function. - * - * Allows key/value pairs to be set for inserting or updating - * - * @param mixed - * @param string - * @param bool - * @return CI_DB_query_builder - */ - public function set($key, $value = '', $escape = NULL) - { - $key = $this->_object_to_array($key); - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - foreach ($key as $k => $v) - { - $this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape) - ? $this->escape($v) : $v; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get SELECT query string - * - * Compiles a SELECT query string and returns the sql. - * - * @param string the table name to select from (optional) - * @param bool TRUE: resets QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_select($table = '', $reset = TRUE) - { - if ($table !== '') - { - $this->_track_aliases($table); - $this->from($table); - } - - $select = $this->_compile_select(); - - if ($reset === TRUE) - { - $this->_reset_select(); - } - - return $select; - } - - // -------------------------------------------------------------------- - - /** - * Get - * - * Compiles the select statement based on the other functions called - * and runs the query - * - * @param string the table - * @param string the limit clause - * @param string the offset clause - * @return CI_DB_result - */ - public function get($table = '', $limit = NULL, $offset = NULL) - { - if ($table !== '') - { - $this->_track_aliases($table); - $this->from($table); - } - - if ( ! empty($limit)) - { - $this->limit($limit, $offset); - } - - $result = $this->query($this->_compile_select()); - $this->_reset_select(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * "Count All Results" query - * - * Generates a platform-specific query string that counts all records - * returned by an Query Builder query. - * - * @param string - * @param bool the reset clause - * @return int - */ - public function count_all_results($table = '', $reset = TRUE) - { - if ($table !== '') - { - $this->_track_aliases($table); - $this->from($table); - } - - // ORDER BY usage is often problematic here (most notably - // on Microsoft SQL Server) and ultimately unnecessary - // for selecting COUNT(*) ... - if ( ! empty($this->qb_orderby)) - { - $orderby = $this->qb_orderby; - $this->qb_orderby = NULL; - } - - $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby) OR $this->qb_limit OR $this->qb_offset) - ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") - : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); - - if ($reset === TRUE) - { - $this->_reset_select(); - } - // If we've previously reset the qb_orderby values, get them back - elseif ( ! isset($this->qb_orderby)) - { - $this->qb_orderby = $orderby; - } - - if ($result->num_rows() === 0) - { - return 0; - } - - $row = $result->row(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Get_Where - * - * Allows the where clause, limit and offset to be added directly - * - * @param string $table - * @param string $where - * @param int $limit - * @param int $offset - * @return CI_DB_result - */ - public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) - { - if ($table !== '') - { - $this->from($table); - } - - if ($where !== NULL) - { - $this->where($where); - } - - if ( ! empty($limit)) - { - $this->limit($limit, $offset); - } - - $result = $this->query($this->_compile_select()); - $this->_reset_select(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Insert_Batch - * - * Compiles batch insert strings and runs the queries - * - * @param string $table Table to insert into - * @param array $set An associative array of insert values - * @param bool $escape Whether to escape values and identifiers - * @return int Number of rows inserted or FALSE on failure - */ - public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100) - { - if ($set === NULL) - { - if (empty($this->qb_set)) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - } - else - { - if (empty($set)) - { - return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE; - } - - $this->set_insert_batch($set, '', $escape); - } - - if (strlen($table) === 0) - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - - // Batch this baby - $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) - { - if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size)))) - { - $affected_rows += $this->affected_rows(); - } - } - - $this->_reset_write(); - return $affected_rows; - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values); - } - - // -------------------------------------------------------------------- - - /** - * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts - * - * @param mixed - * @param string - * @param bool - * @return CI_DB_query_builder - */ - public function set_insert_batch($key, $value = '', $escape = NULL) - { - $key = $this->_object_to_array_batch($key); - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - $keys = array_keys($this->_object_to_array(reset($key))); - sort($keys); - - foreach ($key as $row) - { - $row = $this->_object_to_array($row); - if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) - { - // batch function above returns an error on an empty array - $this->qb_set[] = array(); - return; - } - - ksort($row); // puts $row in the same order as our keys - - if ($escape !== FALSE) - { - $clean = array(); - foreach ($row as $value) - { - $clean[] = $this->escape($value); - } - - $row = $clean; - } - - $this->qb_set[] = '('.implode(',', $row).')'; - } - - foreach ($keys as $k) - { - $this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get INSERT query string - * - * Compiles an insert query and returns the sql - * - * @param string the table to insert into - * @param bool TRUE: reset QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_insert($table = '', $reset = TRUE) - { - if ($this->_validate_insert($table) === FALSE) - { - return FALSE; - } - - $sql = $this->_insert( - $this->protect_identifiers( - $this->qb_from[0], TRUE, NULL, FALSE - ), - array_keys($this->qb_set), - array_values($this->qb_set) - ); - - if ($reset === TRUE) - { - $this->_reset_write(); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Insert - * - * Compiles an insert string and runs the query - * - * @param string the table to insert data into - * @param array an associative array of insert values - * @param bool $escape Whether to escape values and identifiers - * @return bool TRUE on success, FALSE on failure - */ - public function insert($table = '', $set = NULL, $escape = NULL) - { - if ($set !== NULL) - { - $this->set($set, '', $escape); - } - - if ($this->_validate_insert($table) === FALSE) - { - return FALSE; - } - - $sql = $this->_insert( - $this->protect_identifiers( - $this->qb_from[0], TRUE, $escape, FALSE - ), - array_keys($this->qb_set), - array_values($this->qb_set) - ); - - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Validate Insert - * - * This method is used by both insert() and get_compiled_insert() to - * validate that the there data is actually being set and that table - * has been chosen to be inserted into. - * - * @param string the table to insert data into - * @return string - */ - protected function _validate_insert($table = '') - { - if (count($this->qb_set) === 0) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - - if ($table !== '') - { - $this->qb_from[0] = $table; - } - elseif ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Replace - * - * Compiles an replace into string and runs the query - * - * @param string the table to replace data into - * @param array an associative array of insert values - * @return bool TRUE on success, FALSE on failure - */ - public function replace($table = '', $set = NULL) - { - if ($set !== NULL) - { - $this->set($set); - } - - if (count($this->qb_set) === 0) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - - $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); - - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * Note: This is only used (and overridden) by MySQL and CUBRID. - * - * @return string - */ - protected function _from_tables() - { - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Get UPDATE query string - * - * Compiles an update query and returns the sql - * - * @param string the table to update - * @param bool TRUE: reset QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_update($table = '', $reset = TRUE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($this->_validate_update($table) === FALSE) - { - return FALSE; - } - - $sql = $this->_update($this->qb_from[0], $this->qb_set); - - if ($reset === TRUE) - { - $this->_reset_write(); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * UPDATE - * - * Compiles an update string and runs the query. - * - * @param string $table - * @param array $set An associative array of update values - * @param mixed $where - * @param int $limit - * @return bool TRUE on success, FALSE on failure - */ - public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($set !== NULL) - { - $this->set($set); - } - - if ($this->_validate_update($table) === FALSE) - { - return FALSE; - } - - if ($where !== NULL) - { - $this->where($where); - } - - if ( ! empty($limit)) - { - $this->limit($limit); - } - - $sql = $this->_update($this->qb_from[0], $this->qb_set); - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Validate Update - * - * This method is used by both update() and get_compiled_update() to - * validate that data is actually being set and that a table has been - * chosen to be update. - * - * @param string the table to update data on - * @return bool - */ - protected function _validate_update($table) - { - if (count($this->qb_set) === 0) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - - if ($table !== '') - { - $this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE)); - } - elseif ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch - * - * Compiles an update string and runs the query - * - * @param string the table to retrieve the results from - * @param array an associative array of update values - * @param string the where key - * @return int number of rows affected or FALSE on failure - */ - public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($index === NULL) - { - return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; - } - - if ($set === NULL) - { - if (empty($this->qb_set_ub)) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - } - else - { - if (empty($set)) - { - return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE; - } - - $this->set_update_batch($set, $index); - } - - if (strlen($table) === 0) - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - - // Batch this baby - $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size) - { - if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index))) - { - $affected_rows += $this->affected_rows(); - } - - $this->qb_where = array(); - } - - $this->_reset_write(); - return $affected_rows; - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]['value']; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value']; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k." = CASE \n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END, '; - } - - $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - - /** - * The "set_update_batch" function. Allows key/value pairs to be set for batch updating - * - * @param array - * @param string - * @param bool - * @return CI_DB_query_builder - */ - public function set_update_batch($key, $index = '', $escape = NULL) - { - $key = $this->_object_to_array_batch($key); - - if ( ! is_array($key)) - { - // @todo error - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - foreach ($key as $k => $v) - { - $index_set = FALSE; - $clean = array(); - foreach ($v as $k2 => $v2) - { - if ($k2 === $index) - { - $index_set = TRUE; - } - - $clean[$k2] = array( - 'field' => $this->protect_identifiers($k2, FALSE, $escape), - 'value' => ($escape === FALSE ? $v2 : $this->escape($v2)) - ); - } - - if ($index_set === FALSE) - { - return $this->display_error('db_batch_missing_index'); - } - - $this->qb_set_ub[] = $clean; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Empty Table - * - * Compiles a delete string and runs "DELETE FROM table" - * - * @param string the table to empty - * @return bool TRUE on success, FALSE on failure - */ - public function empty_table($table = '') - { - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - else - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - $sql = $this->_delete($table); - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Truncate - * - * Compiles a truncate string and runs the query - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @param string the table to truncate - * @return bool TRUE on success, FALSE on failure - */ - public function truncate($table = '') - { - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - else - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - $sql = $this->_truncate($table); - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the truncate() command, - * then this method maps to 'DELETE FROM table' - * - * @param string the table name - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Get DELETE query string - * - * Compiles a delete query string and returns the sql - * - * @param string the table to delete from - * @param bool TRUE: reset QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_delete($table = '', $reset = TRUE) - { - $this->return_delete_sql = TRUE; - $sql = $this->delete($table, '', NULL, $reset); - $this->return_delete_sql = FALSE; - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Delete - * - * Compiles a delete string and runs the query - * - * @param mixed the table(s) to delete from. String or array - * @param mixed the where clause - * @param mixed the limit clause - * @param bool - * @return mixed - */ - public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - elseif (is_array($table)) - { - empty($where) && $reset_data = FALSE; - - foreach ($table as $single_table) - { - $this->delete($single_table, $where, $limit, $reset_data); - } - - return; - } - else - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - if ($where !== '') - { - $this->where($where); - } - - if ( ! empty($limit)) - { - $this->limit($limit); - } - - if (count($this->qb_where) === 0) - { - return ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE; - } - - $sql = $this->_delete($table); - if ($reset_data) - { - $this->_reset_write(); - } - - return ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string the table name - * @return string - */ - protected function _delete($table) - { - return 'DELETE FROM '.$table.$this->_compile_wh('qb_where') - .($this->qb_limit ? ' LIMIT '.$this->qb_limit : ''); - } - - // -------------------------------------------------------------------- - - /** - * DB Prefix - * - * Prepends a database prefix if one exists in configuration - * - * @param string the table - * @return string - */ - public function dbprefix($table = '') - { - if ($table === '') - { - $this->display_error('db_table_name_required'); - } - - return $this->dbprefix.$table; - } - - // -------------------------------------------------------------------- - - /** - * Set DB Prefix - * - * Set's the DB Prefix to something new without needing to reconnect - * - * @param string the prefix - * @return string - */ - public function set_dbprefix($prefix = '') - { - return $this->dbprefix = $prefix; - } - - // -------------------------------------------------------------------- - - /** - * Track Aliases - * - * Used to track SQL statements written with aliased tables. - * - * @param string The table to inspect - * @return string - */ - protected function _track_aliases($table) - { - if (is_array($table)) - { - foreach ($table as $t) - { - $this->_track_aliases($t); - } - return; - } - - // Does the string contain a comma? If so, we need to separate - // the string into discreet statements - if (strpos($table, ',') !== FALSE) - { - return $this->_track_aliases(explode(',', $table)); - } - - // if a table alias is used we can recognize it by a space - if (strpos($table, ' ') !== FALSE) - { - // if the alias is written with the AS keyword, remove it - $table = preg_replace('/\s+AS\s+/i', ' ', $table); - - // Grab the alias - $table = trim(strrchr($table, ' ')); - - // Store the alias, if it doesn't already exist - if ( ! in_array($table, $this->qb_aliased_tables, TRUE)) - { - $this->qb_aliased_tables[] = $table; - if ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE)) - { - $this->qb_cache_aliased_tables[] = $table; - $this->qb_cache_exists[] = 'aliased_tables'; - } - } - } - } - - // -------------------------------------------------------------------- - - /** - * Compile the SELECT statement - * - * Generates a query string based on which functions were used. - * Should not be called directly. - * - * @param bool $select_override - * @return string - */ - protected function _compile_select($select_override = FALSE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - // Write the "select" portion of the query - if ($select_override !== FALSE) - { - $sql = $select_override; - } - else - { - $sql = ( ! $this->qb_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; - - if (count($this->qb_select) === 0) - { - $sql .= '*'; - } - else - { - // Cycle through the "select" portion of the query and prep each column name. - // The reason we protect identifiers here rather than in the select() function - // is because until the user calls the from() function we don't know if there are aliases - foreach ($this->qb_select as $key => $val) - { - $no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL; - $this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); - } - - $sql .= implode(', ', $this->qb_select); - } - } - - // Write the "FROM" portion of the query - if (count($this->qb_from) > 0) - { - $sql .= "\nFROM ".$this->_from_tables(); - } - - // Write the "JOIN" portion of the query - if (count($this->qb_join) > 0) - { - $sql .= "\n".implode("\n", $this->qb_join); - } - - $sql .= $this->_compile_wh('qb_where') - .$this->_compile_group_by() - .$this->_compile_wh('qb_having') - .$this->_compile_order_by(); // ORDER BY - - // LIMIT - if ($this->qb_limit OR $this->qb_offset) - { - return $this->_limit($sql."\n"); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Compile WHERE, HAVING statements - * - * Escapes identifiers in WHERE and HAVING statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * where(), or_where(), having(), or_having are called prior to from(), - * join() and dbprefix is added only if needed. - * - * @param string $qb_key 'qb_where' or 'qb_having' - * @return string SQL statement - */ - protected function _compile_wh($qb_key) - { - if (count($this->$qb_key) > 0) - { - for ($i = 0, $c = count($this->$qb_key); $i < $c; $i++) - { - // Is this condition already compiled? - if (is_string($this->{$qb_key}[$i])) - { - continue; - } - elseif ($this->{$qb_key}[$i]['escape'] === FALSE) - { - $this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition']; - continue; - } - - // Split multiple conditions - $conditions = preg_split( - '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', - $this->{$qb_key}[$i]['condition'], - -1, - PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY - ); - - for ($ci = 0, $cc = count($conditions); $ci < $cc; $ci++) - { - if (($op = $this->_get_operator($conditions[$ci])) === FALSE - OR ! preg_match('/^(\(?)(.*)('.preg_quote($op, '/').')\s*(.*(? '(test <= foo)', /* the whole thing */ - // 1 => '(', /* optional */ - // 2 => 'test', /* the field name */ - // 3 => ' <= ', /* $op */ - // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ - // 5 => ')' /* optional */ - // ); - - if ( ! empty($matches[4])) - { - $this->_is_literal($matches[4]) OR $matches[4] = $this->protect_identifiers(trim($matches[4])); - $matches[4] = ' '.$matches[4]; - } - - $conditions[$ci] = $matches[1].$this->protect_identifiers(trim($matches[2])) - .' '.trim($matches[3]).$matches[4].$matches[5]; - } - - $this->{$qb_key}[$i] = implode('', $conditions); - } - - return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ") - .implode("\n", $this->$qb_key); - } - - return ''; - } - - // -------------------------------------------------------------------- - - /** - * Compile GROUP BY - * - * Escapes identifiers in GROUP BY statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * group_by() is called prior to from(), join() and dbprefix is added - * only if needed. - * - * @return string SQL statement - */ - protected function _compile_group_by() - { - if (count($this->qb_groupby) > 0) - { - for ($i = 0, $c = count($this->qb_groupby); $i < $c; $i++) - { - // Is it already compiled? - if (is_string($this->qb_groupby[$i])) - { - continue; - } - - $this->qb_groupby[$i] = ($this->qb_groupby[$i]['escape'] === FALSE OR $this->_is_literal($this->qb_groupby[$i]['field'])) - ? $this->qb_groupby[$i]['field'] - : $this->protect_identifiers($this->qb_groupby[$i]['field']); - } - - return "\nGROUP BY ".implode(', ', $this->qb_groupby); - } - - return ''; - } - - // -------------------------------------------------------------------- - - /** - * Compile ORDER BY - * - * Escapes identifiers in ORDER BY statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * order_by() is called prior to from(), join() and dbprefix is added - * only if needed. - * - * @return string SQL statement - */ - protected function _compile_order_by() - { - if (empty($this->qb_orderby)) - { - return ''; - } - - for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) - { - if (is_string($this->qb_orderby[$i])) - { - continue; - } - - if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field'])) - { - $this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']); - } - - $this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction']; - } - - return "\nORDER BY ".implode(', ', $this->qb_orderby); - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - protected function _object_to_array($object) - { - if ( ! is_object($object)) - { - return $object; - } - - $array = array(); - foreach (get_object_vars($object) as $key => $val) - { - // There are some built in keys we need to ignore for this conversion - if ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name') - { - $array[$key] = $val; - } - } - - return $array; - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - protected function _object_to_array_batch($object) - { - if ( ! is_object($object)) - { - return $object; - } - - $array = array(); - $out = get_object_vars($object); - $fields = array_keys($out); - - foreach ($fields as $val) - { - // There are some built in keys we need to ignore for this conversion - if ($val !== '_parent_name') - { - $i = 0; - foreach ($out[$val] as $data) - { - $array[$i++][$val] = $data; - } - } - } - - return $array; - } - - // -------------------------------------------------------------------- - - /** - * Start Cache - * - * Starts QB caching - * - * @return CI_DB_query_builder - */ - public function start_cache() - { - $this->qb_caching = TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Stop Cache - * - * Stops QB caching - * - * @return CI_DB_query_builder - */ - public function stop_cache() - { - $this->qb_caching = FALSE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Flush Cache - * - * Empties the QB cache - * - * @return CI_DB_query_builder - */ - public function flush_cache() - { - $this->_reset_run(array( - 'qb_cache_select' => array(), - 'qb_cache_from' => array(), - 'qb_cache_join' => array(), - 'qb_cache_where' => array(), - 'qb_cache_groupby' => array(), - 'qb_cache_having' => array(), - 'qb_cache_orderby' => array(), - 'qb_cache_set' => array(), - 'qb_cache_exists' => array(), - 'qb_cache_no_escape' => array(), - 'qb_cache_aliased_tables' => array() - )); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Merge Cache - * - * When called, this function merges any cached QB arrays with - * locally called ones. - * - * @return void - */ - protected function _merge_cache() - { - if (count($this->qb_cache_exists) === 0) - { - return; - } - elseif (in_array('select', $this->qb_cache_exists, TRUE)) - { - $qb_no_escape = $this->qb_cache_no_escape; - } - - foreach (array_unique($this->qb_cache_exists) as $val) // select, from, etc. - { - $qb_variable = 'qb_'.$val; - $qb_cache_var = 'qb_cache_'.$val; - $qb_new = $this->$qb_cache_var; - - for ($i = 0, $c = count($this->$qb_variable); $i < $c; $i++) - { - if ( ! in_array($this->{$qb_variable}[$i], $qb_new, TRUE)) - { - $qb_new[] = $this->{$qb_variable}[$i]; - if ($val === 'select') - { - $qb_no_escape[] = $this->qb_no_escape[$i]; - } - } - } - - $this->$qb_variable = $qb_new; - if ($val === 'select') - { - $this->qb_no_escape = $qb_no_escape; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Is literal - * - * Determines if a string represents a literal value or a field name - * - * @param string $str - * @return bool - */ - protected function _is_literal($str) - { - $str = trim($str); - - if (empty($str) OR ctype_digit($str) OR (string) (float) $str === $str OR in_array(strtoupper($str), array('TRUE', 'FALSE'), TRUE)) - { - return TRUE; - } - - static $_str; - - if (empty($_str)) - { - $_str = ($this->_escape_char !== '"') - ? array('"', "'") : array("'"); - } - - return in_array($str[0], $_str, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Reset Query Builder values. - * - * Publicly-visible method to reset the QB values. - * - * @return CI_DB_query_builder - */ - public function reset_query() - { - $this->_reset_select(); - $this->_reset_write(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Resets the query builder values. Called by the get() function - * - * @param array An array of fields to reset - * @return void - */ - protected function _reset_run($qb_reset_items) - { - foreach ($qb_reset_items as $item => $default_value) - { - $this->$item = $default_value; - } - } - - // -------------------------------------------------------------------- - - /** - * Resets the query builder values. Called by the get() function - * - * @return void - */ - protected function _reset_select() - { - $this->_reset_run(array( - 'qb_select' => array(), - 'qb_from' => array(), - 'qb_join' => array(), - 'qb_where' => array(), - 'qb_groupby' => array(), - 'qb_having' => array(), - 'qb_orderby' => array(), - 'qb_aliased_tables' => array(), - 'qb_no_escape' => array(), - 'qb_distinct' => FALSE, - 'qb_limit' => FALSE, - 'qb_offset' => FALSE - )); - } - - // -------------------------------------------------------------------- - - /** - * Resets the query builder "write" values. - * - * Called by the insert() update() insert_batch() update_batch() and delete() functions - * - * @return void - */ - protected function _reset_write() - { - $this->_reset_run(array( - 'qb_set' => array(), - 'qb_set_ub' => array(), - 'qb_from' => array(), - 'qb_join' => array(), - 'qb_where' => array(), - 'qb_orderby' => array(), - 'qb_keys' => array(), - 'qb_limit' => FALSE - )); - } - -} diff --git a/finecms/finecms/system/database/DB_result.php b/finecms/finecms/system/database/DB_result.php deleted file mode 100644 index 98d8876..0000000 --- a/finecms/finecms/system/database/DB_result.php +++ /dev/null @@ -1,666 +0,0 @@ -conn_id = $driver_object->conn_id; - $this->result_id = $driver_object->result_id; - } - - // -------------------------------------------------------------------- - - /** - * Number of rows in the result set - * - * @return int - */ - public function num_rows() - { - if (is_int($this->num_rows)) - { - return $this->num_rows; - } - elseif (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - - return $this->num_rows = count($this->result_array()); - } - - // -------------------------------------------------------------------- - - /** - * Query result. Acts as a wrapper function for the following functions. - * - * @param string $type 'object', 'array' or a custom class name - * @return array - */ - public function result($type = 'object') - { - if ($type === 'array') - { - return $this->result_array(); - } - elseif ($type === 'object') - { - return $this->result_object(); - } - else - { - return $this->custom_result_object($type); - } - } - - // -------------------------------------------------------------------- - - /** - * Custom query result. - * - * @param string $class_name - * @return array - */ - public function custom_result_object($class_name) - { - if (isset($this->custom_result_object[$class_name])) - { - return $this->custom_result_object[$class_name]; - } - elseif ( ! $this->result_id OR $this->num_rows === 0) - { - return array(); - } - - // Don't fetch the result set again if we already have it - $_data = NULL; - if (($c = count($this->result_array)) > 0) - { - $_data = 'result_array'; - } - elseif (($c = count($this->result_object)) > 0) - { - $_data = 'result_object'; - } - - if ($_data !== NULL) - { - for ($i = 0; $i < $c; $i++) - { - $this->custom_result_object[$class_name][$i] = new $class_name(); - - foreach ($this->{$_data}[$i] as $key => $value) - { - $this->custom_result_object[$class_name][$i]->$key = $value; - } - } - - return $this->custom_result_object[$class_name]; - } - - is_null($this->row_data) OR $this->data_seek(0); - $this->custom_result_object[$class_name] = array(); - - while ($row = $this->_fetch_object($class_name)) - { - $this->custom_result_object[$class_name][] = $row; - } - - return $this->custom_result_object[$class_name]; - } - - // -------------------------------------------------------------------- - - /** - * Query result. "object" version. - * - * @return array - */ - public function result_object() - { - if (count($this->result_object) > 0) - { - return $this->result_object; - } - - // In the event that query caching is on, the result_id variable - // will not be a valid resource so we'll simply return an empty - // array. - if ( ! $this->result_id OR $this->num_rows === 0) - { - return array(); - } - - if (($c = count($this->result_array)) > 0) - { - for ($i = 0; $i < $c; $i++) - { - $this->result_object[$i] = (object) $this->result_array[$i]; - } - - return $this->result_object; - } - - is_null($this->row_data) OR $this->data_seek(0); - while ($row = $this->_fetch_object()) - { - $this->result_object[] = $row; - } - - return $this->result_object; - } - - // -------------------------------------------------------------------- - - /** - * Query result. "array" version. - * - * @return array - */ - public function result_array() - { - if (count($this->result_array) > 0) - { - return $this->result_array; - } - - // In the event that query caching is on, the result_id variable - // will not be a valid resource so we'll simply return an empty - // array. - if ( ! $this->result_id OR $this->num_rows === 0) - { - return array(); - } - - if (($c = count($this->result_object)) > 0) - { - for ($i = 0; $i < $c; $i++) - { - $this->result_array[$i] = (array) $this->result_object[$i]; - } - - return $this->result_array; - } - - is_null($this->row_data) OR $this->data_seek(0); - while ($row = $this->_fetch_assoc()) - { - $this->result_array[] = $row; - } - - return $this->result_array; - } - - // -------------------------------------------------------------------- - - /** - * Row - * - * A wrapper method. - * - * @param mixed $n - * @param string $type 'object' or 'array' - * @return mixed - */ - public function row($n = 0, $type = 'object') - { - if ( ! is_numeric($n)) - { - // We cache the row data for subsequent uses - is_array($this->row_data) OR $this->row_data = $this->row_array(0); - - // array_key_exists() instead of isset() to allow for NULL values - if (empty($this->row_data) OR ! array_key_exists($n, $this->row_data)) - { - return NULL; - } - - return $this->row_data[$n]; - } - - if ($type === 'object') return $this->row_object($n); - elseif ($type === 'array') return $this->row_array($n); - else return $this->custom_row_object($n, $type); - } - - // -------------------------------------------------------------------- - - /** - * Assigns an item into a particular column slot - * - * @param mixed $key - * @param mixed $value - * @return void - */ - public function set_row($key, $value = NULL) - { - // We cache the row data for subsequent uses - if ( ! is_array($this->row_data)) - { - $this->row_data = $this->row_array(0); - } - - if (is_array($key)) - { - foreach ($key as $k => $v) - { - $this->row_data[$k] = $v; - } - return; - } - - if ($key !== '' && $value !== NULL) - { - $this->row_data[$key] = $value; - } - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - custom object version - * - * @param int $n - * @param string $type - * @return object - */ - public function custom_row_object($n, $type) - { - isset($this->custom_result_object[$type]) OR $this->custom_result_object($type); - - if (count($this->custom_result_object[$type]) === 0) - { - return NULL; - } - - if ($n !== $this->current_row && isset($this->custom_result_object[$type][$n])) - { - $this->current_row = $n; - } - - return $this->custom_result_object[$type][$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - object version - * - * @param int $n - * @return object - */ - public function row_object($n = 0) - { - $result = $this->result_object(); - if (count($result) === 0) - { - return NULL; - } - - if ($n !== $this->current_row && isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - array version - * - * @param int $n - * @return array - */ - public function row_array($n = 0) - { - $result = $this->result_array(); - if (count($result) === 0) - { - return NULL; - } - - if ($n !== $this->current_row && isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "first" row - * - * @param string $type - * @return mixed - */ - public function first_row($type = 'object') - { - $result = $this->result($type); - return (count($result) === 0) ? NULL : $result[0]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "last" row - * - * @param string $type - * @return mixed - */ - public function last_row($type = 'object') - { - $result = $this->result($type); - return (count($result) === 0) ? NULL : $result[count($result) - 1]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "next" row - * - * @param string $type - * @return mixed - */ - public function next_row($type = 'object') - { - $result = $this->result($type); - if (count($result) === 0) - { - return NULL; - } - - return isset($result[$this->current_row + 1]) - ? $result[++$this->current_row] - : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "previous" row - * - * @param string $type - * @return mixed - */ - public function previous_row($type = 'object') - { - $result = $this->result($type); - if (count($result) === 0) - { - return NULL; - } - - if (isset($result[$this->current_row - 1])) - { - --$this->current_row; - } - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns an unbuffered row and move pointer to next row - * - * @param string $type 'array', 'object' or a custom class name - * @return mixed - */ - public function unbuffered_row($type = 'object') - { - if ($type === 'array') - { - return $this->_fetch_assoc(); - } - elseif ($type === 'object') - { - return $this->_fetch_object(); - } - - return $this->_fetch_object($type); - } - - // -------------------------------------------------------------------- - - /** - * The following methods are normally overloaded by the identically named - * methods in the platform-specific driver -- except when query caching - * is used. When caching is enabled we do not load the other driver. - * These functions are primarily here to prevent undefined function errors - * when a cached result object is in use. They are not otherwise fully - * operational due to the unavailability of the database resource IDs with - * cached results. - */ - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * Overridden by driver result classes. - * - * @return int - */ - public function num_fields() - { - return 0; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names. - * - * Overridden by driver result classes. - * - * @return array - */ - public function list_fields() - { - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data. - * - * Overridden by driver result classes. - * - * @return array - */ - public function field_data() - { - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * Overridden by driver result classes. - * - * @return void - */ - public function free_result() - { - $this->result_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * Overridden by driver result classes. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array. - * - * Overridden by driver result classes. - * - * @return array - */ - protected function _fetch_assoc() - { - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object. - * - * Overridden by driver result classes. - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return new $class_name(); - } - -} diff --git a/finecms/finecms/system/database/DB_utility.php b/finecms/finecms/system/database/DB_utility.php deleted file mode 100644 index 25d842c..0000000 --- a/finecms/finecms/system/database/DB_utility.php +++ /dev/null @@ -1,424 +0,0 @@ -db =& $db; - log_message('info', 'Database Utility Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * List databases - * - * @return array - */ - public function list_databases() - { - // Is there a cached result? - if (isset($this->db->data_cache['db_names'])) - { - return $this->db->data_cache['db_names']; - } - elseif ($this->_list_databases === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $this->db->data_cache['db_names'] = array(); - - $query = $this->db->query($this->_list_databases); - if ($query === FALSE) - { - return $this->db->data_cache['db_names']; - } - - for ($i = 0, $query = $query->result_array(), $c = count($query); $i < $c; $i++) - { - $this->db->data_cache['db_names'][] = current($query[$i]); - } - - return $this->db->data_cache['db_names']; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular database exists - * - * @param string $database_name - * @return bool - */ - public function database_exists($database_name) - { - return in_array($database_name, $this->list_databases()); - } - - // -------------------------------------------------------------------- - - /** - * Optimize Table - * - * @param string $table_name - * @return mixed - */ - public function optimize_table($table_name) - { - if ($this->_optimize_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $query = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); - if ($query !== FALSE) - { - $query = $query->result_array(); - return current($query); - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Optimize Database - * - * @return mixed - */ - public function optimize_database() - { - if ($this->_optimize_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $result = array(); - foreach ($this->db->list_tables() as $table_name) - { - $res = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); - if (is_bool($res)) - { - return $res; - } - - // Build the result array... - $res = $res->result_array(); - $res = current($res); - $key = str_replace($this->db->database.'.', '', current($res)); - $keys = array_keys($res); - unset($res[$keys[0]]); - - $result[$key] = $res; - } - - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Repair Table - * - * @param string $table_name - * @return mixed - */ - public function repair_table($table_name) - { - if ($this->_repair_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $query = $this->db->query(sprintf($this->_repair_table, $this->db->escape_identifiers($table_name))); - if (is_bool($query)) - { - return $query; - } - - $query = $query->result_array(); - return current($query); - } - - // -------------------------------------------------------------------- - - /** - * Generate CSV from a query result object - * - * @param object $query Query result object - * @param string $delim Delimiter (default: ,) - * @param string $newline Newline character (default: \n) - * @param string $enclosure Enclosure (default: ") - * @return string - */ - public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') - { - if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) - { - show_error('You must submit a valid result object'); - } - - $out = ''; - // First generate the headings from the table column names - foreach ($query->list_fields() as $name) - { - $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; - } - - $out = substr($out, 0, -strlen($delim)).$newline; - - // Next blast through the result array and build out the rows - while ($row = $query->unbuffered_row('array')) - { - $line = array(); - foreach ($row as $item) - { - $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; - } - $out .= implode($delim, $line).$newline; - } - - return $out; - } - - // -------------------------------------------------------------------- - - /** - * Generate XML data from a query result object - * - * @param object $query Query result object - * @param array $params Any preferences - * @return string - */ - public function xml_from_result($query, $params = array()) - { - if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) - { - show_error('You must submit a valid result object'); - } - - // Set our default values - foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) - { - if ( ! isset($params[$key])) - { - $params[$key] = $val; - } - } - - // Create variables for convenience - extract($params); - - // Load the xml helper - get_instance()->load->helper('xml'); - - // Generate the result - $xml = '<'.$root.'>'.$newline; - while ($row = $query->unbuffered_row()) - { - $xml .= $tab.'<'.$element.'>'.$newline; - foreach ($row as $key => $val) - { - $xml .= $tab.$tab.'<'.$key.'>'.xml_convert($val).''.$newline; - } - $xml .= $tab.''.$newline; - } - - return $xml.''.$newline; - } - - // -------------------------------------------------------------------- - - /** - * Database Backup - * - * @param array $params - * @return string - */ - public function backup($params = array()) - { - // If the parameters have not been submitted as an - // array then we know that it is simply the table - // name, which is a valid short cut. - if (is_string($params)) - { - $params = array('tables' => $params); - } - - // Set up our default preferences - $prefs = array( - 'tables' => array(), - 'ignore' => array(), - 'filename' => '', - 'format' => 'gzip', // gzip, zip, txt - 'add_drop' => TRUE, - 'add_insert' => TRUE, - 'newline' => "\n", - 'foreign_key_checks' => TRUE - ); - - // Did the user submit any preferences? If so set them.... - if (count($params) > 0) - { - foreach ($prefs as $key => $val) - { - if (isset($params[$key])) - { - $prefs[$key] = $params[$key]; - } - } - } - - // Are we backing up a complete database or individual tables? - // If no table names were submitted we'll fetch the entire table list - if (count($prefs['tables']) === 0) - { - $prefs['tables'] = $this->db->list_tables(); - } - - // Validate the format - if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) - { - $prefs['format'] = 'txt'; - } - - // Is the encoder supported? If not, we'll either issue an - // error or use plain text depending on the debug settings - if (($prefs['format'] === 'gzip' && ! function_exists('gzencode')) - OR ($prefs['format'] === 'zip' && ! function_exists('gzcompress'))) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsupported_compression'); - } - - $prefs['format'] = 'txt'; - } - - // Was a Zip file requested? - if ($prefs['format'] === 'zip') - { - // Set the filename if not provided (only needed with Zip files) - if ($prefs['filename'] === '') - { - $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) - .date('Y-m-d_H-i', time()).'.sql'; - } - else - { - // If they included the .zip file extension we'll remove it - if (preg_match('|.+?\.zip$|', $prefs['filename'])) - { - $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); - } - - // Tack on the ".sql" file extension if needed - if ( ! preg_match('|.+?\.sql$|', $prefs['filename'])) - { - $prefs['filename'] .= '.sql'; - } - } - - // Load the Zip class and output it - $CI =& get_instance(); - $CI->load->library('zip'); - $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); - return $CI->zip->get_zip(); - } - elseif ($prefs['format'] === 'txt') // Was a text file requested? - { - return $this->_backup($prefs); - } - elseif ($prefs['format'] === 'gzip') // Was a Gzip file requested? - { - return gzencode($this->_backup($prefs)); - } - - return; - } - -} diff --git a/finecms/finecms/system/database/drivers/cubrid/cubrid_driver.php b/finecms/finecms/system/database/drivers/cubrid/cubrid_driver.php deleted file mode 100644 index 6e8aff7..0000000 --- a/finecms/finecms/system/database/drivers/cubrid/cubrid_driver.php +++ /dev/null @@ -1,405 +0,0 @@ -dsn, $matches)) - { - if (stripos($matches[2], 'autocommit=off') !== FALSE) - { - $this->auto_commit = FALSE; - } - } - else - { - // If no port is defined by the user, use the default value - empty($this->port) OR $this->port = 33000; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches)) - { - $func = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url'; - return ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '') - ? $func($this->dsn, $this->username, $this->password) - : $func($this->dsn); - } - - $func = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect'; - return ($this->username !== '') - ? $func($this->hostname, $this->port, $this->database, $this->username, $this->password) - : $func($this->hostname, $this->port, $this->database); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if (cubrid_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE) - ? FALSE - : $this->data_cache['version'] = $version; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return cubrid_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL) - { - return FALSE; - } - elseif ($autocommit === TRUE) - { - return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ( ! cubrid_commit($this->conn_id)) - { - return FALSE; - } - - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) - { - return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ( ! cubrid_rollback($this->conn_id)) - { - return FALSE; - } - - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) - { - cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return cubrid_real_escape_string($str, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return cubrid_affected_rows(); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return cubrid_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES'; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - cubrid_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/cubrid/cubrid_forge.php b/finecms/finecms/system/database/drivers/cubrid/cubrid_forge.php deleted file mode 100644 index 27bfc14..0000000 --- a/finecms/finecms/system/database/drivers/cubrid/cubrid_forge.php +++ /dev/null @@ -1,230 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'BIGINT' => 'NUMERIC', - 'FLOAT' => 'DOUBLE', - 'REAL' => 'DOUBLE' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; - } - else - { - $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; - $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'LONGTEXT': - $attributes['TYPE'] = 'STRING'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/finecms/finecms/system/database/drivers/cubrid/cubrid_result.php b/finecms/finecms/system/database/drivers/cubrid/cubrid_result.php deleted file mode 100644 index 251b70a..0000000 --- a/finecms/finecms/system/database/drivers/cubrid/cubrid_result.php +++ /dev/null @@ -1,177 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = cubrid_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return cubrid_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - return cubrid_column_names($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = cubrid_field_name($this->result_id, $i); - $retval[$i]->type = cubrid_field_type($this->result_id, $i); - $retval[$i]->max_length = cubrid_field_len($this->result_id, $i); - $retval[$i]->primary_key = (int) (strpos(cubrid_field_flags($this->result_id, $i), 'primary_key') !== FALSE); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id) OR - (get_resource_type($this->result_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->result_id)))) - { - cubrid_close_request($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return cubrid_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return cubrid_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return cubrid_fetch_object($this->result_id, $class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/cubrid/cubrid_utility.php b/finecms/finecms/system/database/drivers/cubrid/cubrid_utility.php deleted file mode 100644 index 555ae7a..0000000 --- a/finecms/finecms/system/database/drivers/cubrid/cubrid_utility.php +++ /dev/null @@ -1,79 +0,0 @@ -db->data_cache['db_names'])) - { - return $this->db->data_cache['db_names']; - } - - return $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * CUBRID Export - * - * @param array Preferences - * @return mixed - */ - protected function _backup($params = array()) - { - // No SQL based support in CUBRID as of version 8.4.0. Database or - // table backup can be performed using CUBRID Manager - // database administration tool. - return $this->db->display_error('db_unsupported_feature'); - } -} diff --git a/finecms/finecms/system/database/drivers/cubrid/index.html b/finecms/finecms/system/database/drivers/cubrid/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/cubrid/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/ibase/ibase_driver.php b/finecms/finecms/system/database/drivers/ibase/ibase_driver.php deleted file mode 100644 index 3069d66..0000000 --- a/finecms/finecms/system/database/drivers/ibase/ibase_driver.php +++ /dev/null @@ -1,413 +0,0 @@ -hostname.':'.$this->database, $this->username, $this->password, $this->char_set) - : ibase_connect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) - { - $this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); - - // Don't keep the service open - ibase_service_detach($service); - return $this->data_cache['version']; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - if (($trans_handle = ibase_trans($this->conn_id)) === FALSE) - { - return FALSE; - } - - $this->_ibase_trans = $trans_handle; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if (ibase_commit($this->_ibase_trans)) - { - $this->_ibase_trans = NULL; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if (ibase_rollback($this->_ibase_trans)) - { - $this->_ibase_trans = NULL; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return ibase_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @param string $generator_name - * @param int $inc_by - * @return int - */ - public function insert_id($generator_name, $inc_by = 0) - { - //If a generator hasn't been used before it will return 0 - return ibase_gen_id('"'.$generator_name.'"', $inc_by); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql.' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", - CASE "fields"."RDB$FIELD_TYPE" - WHEN 7 THEN \'SMALLINT\' - WHEN 8 THEN \'INTEGER\' - WHEN 9 THEN \'QUAD\' - WHEN 10 THEN \'FLOAT\' - WHEN 11 THEN \'DFLOAT\' - WHEN 12 THEN \'DATE\' - WHEN 13 THEN \'TIME\' - WHEN 14 THEN \'CHAR\' - WHEN 16 THEN \'INT64\' - WHEN 27 THEN \'DOUBLE\' - WHEN 35 THEN \'TIMESTAMP\' - WHEN 37 THEN \'VARCHAR\' - WHEN 40 THEN \'CSTRING\' - WHEN 261 THEN \'BLOB\' - ELSE NULL - END AS "type", - "fields"."RDB$FIELD_LENGTH" AS "max_length", - "rfields"."RDB$DEFAULT_VALUE" AS "default" - FROM "RDB$RELATION_FIELDS" "rfields" - JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" - WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' - ORDER BY "rfields"."RDB$FIELD_POSITION"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => ibase_errcode(), 'message' => ibase_errmsg()); - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // Limit clause depends on if Interbase or Firebird - if (stripos($this->version(), 'firebird') !== FALSE) - { - $select = 'FIRST '.$this->qb_limit - .($this->qb_offset ? ' SKIP '.$this->qb_offset : ''); - } - else - { - $select = 'ROWS ' - .($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); - } - - return preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - ibase_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/ibase/ibase_forge.php b/finecms/finecms/system/database/drivers/ibase/ibase_forge.php deleted file mode 100644 index 31352f1..0000000 --- a/finecms/finecms/system/database/drivers/ibase/ibase_forge.php +++ /dev/null @@ -1,251 +0,0 @@ - 'INTEGER', - 'INTEGER' => 'INT64', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return bool - */ - public function create_database($db_name) - { - // Firebird databases are flat files, so a path is required - - // Hostname is needed for remote access - empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; - - return parent::create_database('"'.$db_name.'"'); - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - if ( ! ibase_drop_db($this->conn_id)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' - .($field[$i]['null'] === TRUE ? 'NULL' : '1') - .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) - .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INT': - $attributes['TYPE'] = 'INTEGER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'INT64'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/finecms/finecms/system/database/drivers/ibase/ibase_result.php b/finecms/finecms/system/database/drivers/ibase/ibase_result.php deleted file mode 100644 index 7d7dd79..0000000 --- a/finecms/finecms/system/database/drivers/ibase/ibase_result.php +++ /dev/null @@ -1,161 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $num_fields = $this->num_fields(); $i < $num_fields; $i++) - { - $info = ibase_field_info($this->result_id, $i); - $field_names[] = $info['name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $info = ibase_field_info($this->result_id, $i); - - $retval[$i] = new stdClass(); - $retval[$i]->name = $info['name']; - $retval[$i]->type = $info['type']; - $retval[$i]->max_length = $info['length']; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - ibase_free_result($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return ibase_fetch_assoc($this->result_id, IBASE_FETCH_BLOBS); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = ibase_fetch_object($this->result_id, IBASE_FETCH_BLOBS); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} diff --git a/finecms/finecms/system/database/drivers/ibase/ibase_utility.php b/finecms/finecms/system/database/drivers/ibase/ibase_utility.php deleted file mode 100644 index 3c15210..0000000 --- a/finecms/finecms/system/database/drivers/ibase/ibase_utility.php +++ /dev/null @@ -1,69 +0,0 @@ -db->hostname, $this->db->username, $this->db->password)) - { - $res = ibase_backup($service, $this->db->database, $filename.'.fbk'); - - // Close the service connection - ibase_service_detach($service); - return $res; - } - - return FALSE; - } - -} diff --git a/finecms/finecms/system/database/drivers/ibase/index.html b/finecms/finecms/system/database/drivers/ibase/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/ibase/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/index.html b/finecms/finecms/system/database/drivers/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/mssql/index.html b/finecms/finecms/system/database/drivers/mssql/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/mssql/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/mssql/mssql_driver.php b/finecms/finecms/system/database/drivers/mssql/mssql_driver.php deleted file mode 100644 index a2ccd1c..0000000 --- a/finecms/finecms/system/database/drivers/mssql/mssql_driver.php +++ /dev/null @@ -1,518 +0,0 @@ -port)) - { - $this->hostname .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $this->conn_id = ($persistent) - ? mssql_pconnect($this->hostname, $this->username, $this->password) - : mssql_connect($this->hostname, $this->username, $this->password); - - if ( ! $this->conn_id) - { - return FALSE; - } - - // ---------------------------------------------------------------- - - // Select the DB... assuming a database name is specified in the config file - if ($this->database !== '' && ! $this->db_select()) - { - log_message('error', 'Unable to select database: '.$this->database); - - return ($this->db_debug === TRUE) - ? $this->display_error('db_unable_to_select', $this->database) - : FALSE; - } - - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - // Note: Escaping is required in the event that the DB name - // contains reserved characters. - if (mssql_select_db('['.$database.']', $this->conn_id)) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return mixed resource if rows are returned, bool otherwise - */ - protected function _execute($sql) - { - return mssql_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->simple_query('BEGIN TRAN'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->simple_query('COMMIT TRAN'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->simple_query('ROLLBACK TRAN'); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return mssql_rows_affected($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * Returns the last id created in the Identity column. - * - * @return string - */ - public function insert_id() - { - $query = version_compare($this->version(), '8', '>=') - ? 'SELECT SCOPE_IDENTITY() AS last_id' - : 'SELECT @@IDENTITY AS last_id'; - - $query = $this->query($query); - $query = $query->row(); - return $query->last_id; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return (ini_set('mssql.charset', $charset) !== FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @return string - */ - protected function _version() - { - return "SELECT SERVERPROPERTY('ProductVersion') AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - // We need this because the error info is discarded by the - // server the first time you request it, and query() already - // calls error() once for logging purposes when a query fails. - static $error = array('code' => 0, 'message' => NULL); - - $message = mssql_get_last_message(); - if ( ! empty($message)) - { - $error['code'] = $this->query('SELECT @@ERROR AS code')->row()->code; - $error['message'] = $message; - } - - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - $limit = $this->qb_offset + $this->qb_limit; - - // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, - // however an ORDER BY clause is required for it to work - if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - mssql_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/mssql/mssql_forge.php b/finecms/finecms/system/database/drivers/mssql/mssql_forge.php deleted file mode 100644 index 6b61098..0000000 --- a/finecms/finecms/system/database/drivers/mssql/mssql_forge.php +++ /dev/null @@ -1,151 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/finecms/finecms/system/database/drivers/mssql/mssql_result.php b/finecms/finecms/system/database/drivers/mssql/mssql_result.php deleted file mode 100644 index 38a0a05..0000000 --- a/finecms/finecms/system/database/drivers/mssql/mssql_result.php +++ /dev/null @@ -1,198 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = mssql_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return mssql_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - mssql_field_seek($this->result_id, 0); - while ($field = mssql_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field = mssql_fetch_field($this->result_id, $i); - - $retval[$i] = new stdClass(); - $retval[$i]->name = $field->name; - $retval[$i]->type = $field->type; - $retval[$i]->max_length = $field->max_length; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - mssql_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return mssql_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return mssql_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = mssql_fetch_object($this->result_id); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} diff --git a/finecms/finecms/system/database/drivers/mssql/mssql_utility.php b/finecms/finecms/system/database/drivers/mssql/mssql_utility.php deleted file mode 100644 index 95ce88f..0000000 --- a/finecms/finecms/system/database/drivers/mssql/mssql_utility.php +++ /dev/null @@ -1,77 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/drivers/mysql/index.html b/finecms/finecms/system/database/drivers/mysql/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/mysql/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/mysql/mysql_driver.php b/finecms/finecms/system/database/drivers/mysql/mysql_driver.php deleted file mode 100644 index 71dad67..0000000 --- a/finecms/finecms/system/database/drivers/mysql/mysql_driver.php +++ /dev/null @@ -1,494 +0,0 @@ -port)) - { - $this->hostname .= ':'.$this->port; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $client_flags = ($this->compress === FALSE) ? 0 : MYSQL_CLIENT_COMPRESS; - - if ($this->encrypt === TRUE) - { - $client_flags = $client_flags | MYSQL_CLIENT_SSL; - } - - // Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages - $this->conn_id = ($persistent === TRUE) - ? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags) - : mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags); - - // ---------------------------------------------------------------- - - // Select the DB... assuming a database name is specified in the config file - if ($this->database !== '' && ! $this->db_select()) - { - log_message('error', 'Unable to select database: '.$this->database); - - return ($this->db_debug === TRUE) - ? $this->display_error('db_unable_to_select', $this->database) - : FALSE; - } - - if (isset($this->stricton) && is_resource($this->conn_id)) - { - if ($this->stricton) - { - $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); - } - else - { - $this->simple_query( - 'SET SESSION sql_mode = - REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")' - ); - } - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if (mysql_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if (mysql_select_db($database, $this->conn_id)) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return mysql_set_charset($charset, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE) - { - return FALSE; - } - - return $this->data_cache['version'] = $version; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return mixed - */ - protected function _execute($sql) - { - return mysql_query($this->_prep_query($sql), $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @param string $sql an SQL query - * @return string - */ - protected function _prep_query($sql) - { - // mysql_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack - // modifies the query so that it a proper number of affected rows is returned. - if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - return trim($sql).' WHERE 1=1'; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->simple_query('SET AUTOCOMMIT=0'); - return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ($this->simple_query('COMMIT')) - { - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ($this->simple_query('ROLLBACK')) - { - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return mysql_real_escape_string($str, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return mysql_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return mysql_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - // Error suppression to avoid annoying E_WARNINGs in cases - // where the connection has already been closed for some reason. - @mysql_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/mysql/mysql_forge.php b/finecms/finecms/system/database/drivers/mysql/mysql_forge.php deleted file mode 100644 index 7ed8f8d..0000000 --- a/finecms/finecms/system/database/drivers/mysql/mysql_forge.php +++ /dev/null @@ -1,243 +0,0 @@ -db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; - } - - if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = '.$this->db->dbcollat; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = ($alter_type === 'ADD') - ? "\n\tADD ".$field[$i]['_literal'] - : "\n\tMODIFY ".$field[$i]['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); - } - } - - return array($sql.implode(',', $field)); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/finecms/finecms/system/database/drivers/mysql/mysql_result.php b/finecms/finecms/system/database/drivers/mysql/mysql_result.php deleted file mode 100644 index 7aa265e..0000000 --- a/finecms/finecms/system/database/drivers/mysql/mysql_result.php +++ /dev/null @@ -1,199 +0,0 @@ -num_rows = mysql_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of rows in the result set - * - * @return int - */ - public function num_rows() - { - return $this->num_rows; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return mysql_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - mysql_field_seek($this->result_id, 0); - while ($field = mysql_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = mysql_field_name($this->result_id, $i); - $retval[$i]->type = mysql_field_type($this->result_id, $i); - $retval[$i]->max_length = mysql_field_len($this->result_id, $i); - $retval[$i]->primary_key = (int) (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') !== FALSE); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - mysql_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return $this->num_rows - ? mysql_data_seek($this->result_id, $n) - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return mysql_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return mysql_fetch_object($this->result_id, $class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/mysql/mysql_utility.php b/finecms/finecms/system/database/drivers/mysql/mysql_utility.php deleted file mode 100644 index bc01fc5..0000000 --- a/finecms/finecms/system/database/drivers/mysql/mysql_utility.php +++ /dev/null @@ -1,211 +0,0 @@ -db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); - - // No result means the table name was invalid - if ($query === FALSE) - { - continue; - } - - // Write out the table schema - $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; - - if ($add_drop === TRUE) - { - $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; - } - - $i = 0; - $result = $query->result_array(); - foreach ($result[0] as $val) - { - if ($i++ % 2) - { - $output .= $val.';'.$newline.$newline; - } - } - - // If inserts are not needed we're done... - if ($add_insert === FALSE) - { - continue; - } - - // Grab all the data from the current table - $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); - - if ($query->num_rows() === 0) - { - continue; - } - - // Fetch the field names and determine if the field is an - // integer type. We use this info to decide whether to - // surround the data with quotes or not - - $i = 0; - $field_str = ''; - $is_int = array(); - while ($field = mysql_fetch_field($query->result_id)) - { - // Most versions of MySQL store timestamp as a string - $is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)), - array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), - TRUE); - - // Create a string of field names - $field_str .= $this->db->escape_identifiers($field->name).', '; - $i++; - } - - // Trim off the end comma - $field_str = preg_replace('/, $/' , '', $field_str); - - // Build the insert string - foreach ($query->result_array() as $row) - { - $val_str = ''; - - $i = 0; - foreach ($row as $v) - { - // Is the value NULL? - if ($v === NULL) - { - $val_str .= 'NULL'; - } - else - { - // Escape the data if it's not an integer - $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; - } - - // Append a comma - $val_str .= ', '; - $i++; - } - - // Remove the comma at the end of the string - $val_str = preg_replace('/, $/' , '', $val_str); - - // Build the INSERT string - $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; - } - - $output .= $newline.$newline; - } - - // Do we need to include a statement to re-enable foreign key checks? - if ($foreign_key_checks === FALSE) - { - $output .= 'SET foreign_key_checks = 1;'.$newline; - } - - return $output; - } - -} diff --git a/finecms/finecms/system/database/drivers/mysqli/index.html b/finecms/finecms/system/database/drivers/mysqli/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/mysqli/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/mysqli/mysqli_driver.php b/finecms/finecms/system/database/drivers/mysqli/mysqli_driver.php deleted file mode 100644 index b59e894..0000000 --- a/finecms/finecms/system/database/drivers/mysqli/mysqli_driver.php +++ /dev/null @@ -1,544 +0,0 @@ -hostname[0] === '/') - { - $hostname = NULL; - $port = NULL; - $socket = $this->hostname; - } - else - { - $hostname = ($persistent === TRUE) - ? 'p:'.$this->hostname : $this->hostname; - $port = empty($this->port) ? NULL : $this->port; - $socket = NULL; - } - - $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0; - $this->_mysqli = mysqli_init(); - - $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); - - if (isset($this->stricton)) - { - if ($this->stricton) - { - $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); - } - else - { - $this->_mysqli->options(MYSQLI_INIT_COMMAND, - 'SET SESSION sql_mode = - REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")' - ); - } - } - - if (is_array($this->encrypt)) - { - $ssl = array(); - empty($this->encrypt['ssl_key']) OR $ssl['key'] = $this->encrypt['ssl_key']; - empty($this->encrypt['ssl_cert']) OR $ssl['cert'] = $this->encrypt['ssl_cert']; - empty($this->encrypt['ssl_ca']) OR $ssl['ca'] = $this->encrypt['ssl_ca']; - empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath']; - empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher']; - - if ( ! empty($ssl)) - { - if (isset($this->encrypt['ssl_verify'])) - { - if ($this->encrypt['ssl_verify']) - { - defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); - } - // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT - // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another - // constant ... - // - // https://secure.php.net/ChangeLog-5.php#5.6.16 - // https://bugs.php.net/bug.php?id=68344 - elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) - { - $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; - } - } - - $client_flags |= MYSQLI_CLIENT_SSL; - $this->_mysqli->ssl_set( - isset($ssl['key']) ? $ssl['key'] : NULL, - isset($ssl['cert']) ? $ssl['cert'] : NULL, - isset($ssl['ca']) ? $ssl['ca'] : NULL, - isset($ssl['capath']) ? $ssl['capath'] : NULL, - isset($ssl['cipher']) ? $ssl['cipher'] : NULL - ); - } - } - - if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) - { - // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails - if ( - ($client_flags & MYSQLI_CLIENT_SSL) - && version_compare($this->_mysqli->client_info, '5.7.3', '<=') - && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) - ) - { - $this->_mysqli->close(); - $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; - log_message('error', $message); - return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; - } - - return $this->_mysqli; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if ($this->conn_id->select_db($database)) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return $this->conn_id->set_charset($charset); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - return $this->data_cache['version'] = $this->conn_id->server_info; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return mixed - */ - protected function _execute($sql) - { - return $this->conn_id->query($this->_prep_query($sql)); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @param string $sql an SQL query - * @return string - */ - protected function _prep_query($sql) - { - // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack - // modifies the query so that it a proper number of affected rows is returned. - if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - return trim($sql).' WHERE 1=1'; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->conn_id->autocommit(FALSE); - return is_php('5.5') - ? $this->conn_id->begin_transaction() - : $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ($this->conn_id->commit()) - { - $this->conn_id->autocommit(TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ($this->conn_id->rollback()) - { - $this->conn_id->autocommit(TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return $this->conn_id->real_escape_string($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return $this->conn_id->affected_rows; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return $this->conn_id->insert_id; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - if ( ! empty($this->_mysqli->connect_errno)) - { - return array( - 'code' => $this->_mysqli->connect_errno, - 'message' => $this->_mysqli->connect_error - ); - } - - return array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error); - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - $this->conn_id->close(); - } - -} diff --git a/finecms/finecms/system/database/drivers/mysqli/mysqli_forge.php b/finecms/finecms/system/database/drivers/mysqli/mysqli_forge.php deleted file mode 100644 index c5b23b6..0000000 --- a/finecms/finecms/system/database/drivers/mysqli/mysqli_forge.php +++ /dev/null @@ -1,244 +0,0 @@ -db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; - } - - if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = '.$this->db->dbcollat; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = ($alter_type === 'ADD') - ? "\n\tADD ".$field[$i]['_literal'] - : "\n\tMODIFY ".$field[$i]['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); - } - } - - return array($sql.implode(',', $field)); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/finecms/finecms/system/database/drivers/mysqli/mysqli_result.php b/finecms/finecms/system/database/drivers/mysqli/mysqli_result.php deleted file mode 100644 index 929c2b4..0000000 --- a/finecms/finecms/system/database/drivers/mysqli/mysqli_result.php +++ /dev/null @@ -1,186 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = $this->result_id->num_rows; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return $this->result_id->field_count; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - $this->result_id->field_seek(0); - while ($field = $this->result_id->fetch_field()) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - $field_data = $this->result_id->fetch_fields(); - for ($i = 0, $c = count($field_data); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $field_data[$i]->name; - $retval[$i]->type = $field_data[$i]->type; - $retval[$i]->max_length = $field_data[$i]->max_length; - $retval[$i]->primary_key = (int) ($field_data[$i]->flags & 2); - $retval[$i]->default = $field_data[$i]->def; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id->free(); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return $this->result_id->data_seek($n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return $this->result_id->fetch_assoc(); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return $this->result_id->fetch_object($class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/mysqli/mysqli_utility.php b/finecms/finecms/system/database/drivers/mysqli/mysqli_utility.php deleted file mode 100644 index 4a3dad4..0000000 --- a/finecms/finecms/system/database/drivers/mysqli/mysqli_utility.php +++ /dev/null @@ -1,213 +0,0 @@ -db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); - - // No result means the table name was invalid - if ($query === FALSE) - { - continue; - } - - // Write out the table schema - $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; - - if ($add_drop === TRUE) - { - $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; - } - - $i = 0; - $result = $query->result_array(); - foreach ($result[0] as $val) - { - if ($i++ % 2) - { - $output .= $val.';'.$newline.$newline; - } - } - - // If inserts are not needed we're done... - if ($add_insert === FALSE) - { - continue; - } - - // Grab all the data from the current table - $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); - - if ($query->num_rows() === 0) - { - continue; - } - - // Fetch the field names and determine if the field is an - // integer type. We use this info to decide whether to - // surround the data with quotes or not - - $i = 0; - $field_str = ''; - $is_int = array(); - while ($field = $query->result_id->fetch_field()) - { - // Most versions of MySQL store timestamp as a string - $is_int[$i] = in_array(strtolower($field->type), - array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), - TRUE); - - // Create a string of field names - $field_str .= $this->db->escape_identifiers($field->name).', '; - $i++; - } - - // Trim off the end comma - $field_str = preg_replace('/, $/' , '', $field_str); - - // Build the insert string - foreach ($query->result_array() as $row) - { - $val_str = ''; - - $i = 0; - foreach ($row as $v) - { - // Is the value NULL? - if ($v === NULL) - { - $val_str .= 'NULL'; - } - else - { - // Escape the data if it's not an integer - $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; - } - - // Append a comma - $val_str .= ', '; - $i++; - } - - // Remove the comma at the end of the string - $val_str = preg_replace('/, $/' , '', $val_str); - - // Build the INSERT string - $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; - } - - $output .= $newline.$newline; - } - - // Do we need to include a statement to re-enable foreign key checks? - if ($foreign_key_checks === FALSE) - { - $output .= 'SET foreign_key_checks = 1;'.$newline; - } - - return $output; - } - -} diff --git a/finecms/finecms/system/database/drivers/oci8/index.html b/finecms/finecms/system/database/drivers/oci8/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/oci8/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/oci8/oci8_driver.php b/finecms/finecms/system/database/drivers/oci8/oci8_driver.php deleted file mode 100644 index fb2f6b3..0000000 --- a/finecms/finecms/system/database/drivers/oci8/oci8_driver.php +++ /dev/null @@ -1,688 +0,0 @@ - '/^\(DESCRIPTION=(\(.+\)){2,}\)$/', // TNS - // Easy Connect string (Oracle 10g+) - 'ec' => '/^(\/\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\/[a-z0-9$_]+)?(:[^\/])?(\/[a-z0-9$_]+)?$/i', - 'in' => '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora) - ); - - /* Space characters don't have any effect when actually - * connecting, but can be a hassle while validating the DSN. - */ - $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn); - - if ($this->dsn !== '') - { - foreach ($valid_dsns as $regexp) - { - if (preg_match($regexp, $this->dsn)) - { - return; - } - } - } - - // Legacy support for TNS in the hostname configuration field - $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname); - if (preg_match($valid_dsns['tns'], $this->hostname)) - { - $this->dsn = $this->hostname; - return; - } - elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE - && (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== '')) - { - /* If the hostname field isn't empty, doesn't contain - * ':' and/or '/' and if port and/or database aren't - * empty, then the hostname field is most likely indeed - * just a hostname. Therefore we'll try and build an - * Easy Connect string from these 3 settings, assuming - * that the database field is a service name. - */ - $this->dsn = $this->hostname - .(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '') - .($this->database !== '' ? '/'.ltrim($this->database, '/') : ''); - - if (preg_match($valid_dsns['ec'], $this->dsn)) - { - return; - } - } - - /* At this point, we can only try and validate the hostname and - * database fields separately as DSNs. - */ - if (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname)) - { - $this->dsn = $this->hostname; - return; - } - - $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database); - foreach ($valid_dsns as $regexp) - { - if (preg_match($regexp, $this->database)) - { - return; - } - } - - /* Well - OK, an empty string should work as well. - * PHP will try to use environment variables to - * determine which Oracle instance to connect to. - */ - $this->dsn = ''; - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $func = ($persistent === TRUE) ? 'oci_pconnect' : 'oci_connect'; - return empty($this->char_set) - ? $func($this->username, $this->password, $this->dsn) - : $func($this->username, $this->password, $this->dsn, $this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE) - { - return FALSE; - } - elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match)) - { - return $this->data_cache['version'] = $match[1]; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - /* Oracle must parse the query before it is run. All of the actions with - * the query are based on the statement id returned by oci_parse(). - */ - if ($this->_reset_stmt_id === TRUE) - { - $this->stmt_id = oci_parse($this->conn_id, $sql); - } - - oci_set_prefetch($this->stmt_id, 1000); - return oci_execute($this->stmt_id, $this->commit_mode); - } - - // -------------------------------------------------------------------- - - /** - * Get cursor. Returns a cursor from the database - * - * @return resource - */ - public function get_cursor() - { - return $this->curs_id = oci_new_cursor($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Stored Procedure. Executes a stored procedure - * - * @param string package name in which the stored procedure is in - * @param string stored procedure name to execute - * @param array parameters - * @return mixed - * - * params array keys - * - * KEY OPTIONAL NOTES - * name no the name of the parameter should be in : format - * value no the value of the parameter. If this is an OUT or IN OUT parameter, - * this should be a reference to a variable - * type yes the type of the parameter - * length yes the max size of the parameter - */ - public function stored_procedure($package, $procedure, array $params) - { - if ($package === '' OR $procedure === '') - { - log_message('error', 'Invalid query: '.$package.'.'.$procedure); - return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; - } - - // Build the query string - $sql = 'BEGIN '.$package.'.'.$procedure.'('; - - $have_cursor = FALSE; - foreach ($params as $param) - { - $sql .= $param['name'].','; - - if (isset($param['type']) && $param['type'] === OCI_B_CURSOR) - { - $have_cursor = TRUE; - } - } - $sql = trim($sql, ',').'); END;'; - - $this->_reset_stmt_id = FALSE; - $this->stmt_id = oci_parse($this->conn_id, $sql); - $this->_bind_params($params); - $result = $this->query($sql, FALSE, $have_cursor); - $this->_reset_stmt_id = TRUE; - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Bind parameters - * - * @param array $params - * @return void - */ - protected function _bind_params($params) - { - if ( ! is_array($params) OR ! is_resource($this->stmt_id)) - { - return; - } - - foreach ($params as $param) - { - foreach (array('name', 'value', 'type', 'length') as $val) - { - if ( ! isset($param[$val])) - { - $param[$val] = ''; - } - } - - oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); - } - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->commit_mode = OCI_NO_AUTO_COMMIT; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - $this->commit_mode = OCI_COMMIT_ON_SUCCESS; - - return oci_commit($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - $this->commit_mode = OCI_COMMIT_ON_SUCCESS; - return oci_rollback($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return oci_num_rows($this->stmt_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - // not supported in oracle - return $this->display_error('db_unsupported_function'); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE - FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - - $length = ($query[$i]->CHAR_LENGTH > 0) - ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; - if ($length === NULL) - { - $length = $query[$i]->DATA_LENGTH; - } - $retval[$i]->max_length = $length; - - $default = $query[$i]->DATA_DEFAULT; - if ($default === NULL && $query[$i]->NULLABLE === 'N') - { - $default = ''; - } - $retval[$i]->default = $default; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - // oci_error() returns an array that already contains - // 'code' and 'message' keys, but it can return false - // if there was no error .... - if (is_resource($this->curs_id)) - { - $error = oci_error($this->curs_id); - } - elseif (is_resource($this->stmt_id)) - { - $error = oci_error($this->stmt_id); - } - elseif (is_resource($this->conn_id)) - { - $error = oci_error($this->conn_id); - } - else - { - $error = oci_error(); - } - - return is_array($error) - ? $error - : array('code' => '', 'message' => ''); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - $keys = implode(', ', $keys); - $sql = "INSERT ALL\n"; - - for ($i = 0, $c = count($values); $i < $c; $i++) - { - $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; - } - - return $sql.'SELECT * FROM dual'; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - $this->where('rownum <= ',$this->qb_limit, FALSE); - $this->qb_limit = FALSE; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - if (version_compare($this->version(), '12.1', '>=')) - { - // OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - $this->limit_used = TRUE; - return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' - .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : ''); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - oci_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/oci8/oci8_forge.php b/finecms/finecms/system/database/drivers/oci8/oci8_forge.php deleted file mode 100644 index 724a76d..0000000 --- a/finecms/finecms/system/database/drivers/oci8/oci8_forge.php +++ /dev/null @@ -1,187 +0,0 @@ -db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = "\n\t".$field[$i]['_literal']; - } - else - { - $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - - if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - - $field[$i] = "\n\t".$field[$i]['_literal']; - } - } - - $sql .= ' '.$alter_type.' '; - $sql .= (count($field) === 1) - ? $field[0] - : '('.implode(',', $field).')'; - - // RENAME COLUMN must be executed after MODIFY - array_unshift($sqls, $sql); - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - sequences and triggers must be used instead - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'INT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'NUMBER'; - return; - default: return; - } - } -} diff --git a/finecms/finecms/system/database/drivers/oci8/oci8_result.php b/finecms/finecms/system/database/drivers/oci8/oci8_result.php deleted file mode 100644 index 0c35433..0000000 --- a/finecms/finecms/system/database/drivers/oci8/oci8_result.php +++ /dev/null @@ -1,229 +0,0 @@ -stmt_id = $driver_object->stmt_id; - $this->curs_id = $driver_object->curs_id; - $this->limit_used = $driver_object->limit_used; - $this->commit_mode =& $driver_object->commit_mode; - $driver_object->stmt_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - $count = oci_num_fields($this->stmt_id); - - // if we used a limit we subtract it - return ($this->limit_used) ? $count - 1 : $count; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) - { - $field_names[] = oci_field_name($this->stmt_id, $c); - } - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) - { - $F = new stdClass(); - $F->name = oci_field_name($this->stmt_id, $c); - $F->type = oci_field_type($this->stmt_id, $c); - $F->max_length = oci_field_size($this->stmt_id, $c); - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - oci_free_statement($this->result_id); - $this->result_id = FALSE; - } - - if (is_resource($this->stmt_id)) - { - oci_free_statement($this->stmt_id); - } - - if (is_resource($this->curs_id)) - { - oci_cancel($this->curs_id); - $this->curs_id = NULL; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; - return oci_fetch_assoc($id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = ($this->curs_id) - ? oci_fetch_object($this->curs_id) - : oci_fetch_object($this->stmt_id); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} diff --git a/finecms/finecms/system/database/drivers/oci8/oci8_utility.php b/finecms/finecms/system/database/drivers/oci8/oci8_utility.php deleted file mode 100644 index ce0dfc5..0000000 --- a/finecms/finecms/system/database/drivers/oci8/oci8_utility.php +++ /dev/null @@ -1,68 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/drivers/odbc/index.html b/finecms/finecms/system/database/drivers/odbc/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/odbc/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/odbc/odbc_driver.php b/finecms/finecms/system/database/drivers/odbc/odbc_driver.php deleted file mode 100644 index ef982fc..0000000 --- a/finecms/finecms/system/database/drivers/odbc/odbc_driver.php +++ /dev/null @@ -1,425 +0,0 @@ -dsn)) - { - $this->dsn = $this->hostname; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - return ($persistent === TRUE) - ? odbc_pconnect($this->dsn, $this->username, $this->password) - : odbc_connect($this->dsn, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Compile Bindings - * - * @param string $sql SQL statement - * @param array $binds An array of values to bind - * @return string - */ - public function compile_binds($sql, $binds) - { - if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) - { - return $sql; - } - elseif ( ! is_array($binds)) - { - $binds = array($binds); - $bind_count = 1; - } - else - { - // Make sure we're using numeric keys - $binds = array_values($binds); - $bind_count = count($binds); - } - - // We'll need the marker length later - $ml = strlen($this->bind_marker); - - // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) - { - $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', - str_replace($matches[0], - str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), - $sql, $c), - $matches, PREG_OFFSET_CAPTURE); - - // Bind values' count must match the count of markers in the query - if ($bind_count !== $c) - { - return $sql; - } - } - elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) - { - return $sql; - } - - if ($this->bind_marker !== '?') - { - do - { - $c--; - $sql = substr_replace($sql, '?', $matches[0][$c][1], $ml); - } - while ($c !== 0); - } - - if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql))) - { - $this->binds = array_values($binds); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - if ( ! isset($this->odbc_result)) - { - return odbc_exec($this->conn_id, $sql); - } - elseif ($this->odbc_result === FALSE) - { - return FALSE; - } - - if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds))) - { - // For queries that return result sets, return the result_id resource on success - $this->is_write_type($sql) OR $success = $this->odbc_result; - } - - $this->odbc_result = NULL; - $this->binds = array(); - - return $success; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return odbc_autocommit($this->conn_id, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if (odbc_commit($this->conn_id)) - { - odbc_autocommit($this->conn_id, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if (odbc_rollback($this->conn_id)) - { - odbc_autocommit($this->conn_id, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - $this->display_error('db_unsupported_feature'); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return odbc_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return bool - */ - public function insert_id() - { - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @param string $table - * @return string - */ - protected function _field_data($table) - { - return 'SELECT TOP 1 FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - odbc_close($this->conn_id); - } -} diff --git a/finecms/finecms/system/database/drivers/odbc/odbc_forge.php b/finecms/finecms/system/database/drivers/odbc/odbc_forge.php deleted file mode 100644 index 77b2fdf..0000000 --- a/finecms/finecms/system/database/drivers/odbc/odbc_forge.php +++ /dev/null @@ -1,86 +0,0 @@ -num_rows)) - { - return $this->num_rows; - } - elseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1) - { - return $this->num_rows; - } - - // Work-around for ODBC subdrivers that don't support num_rows() - if (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - - return $this->num_rows = count($this->result_array()); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return odbc_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - $num_fields = $this->num_fields(); - - if ($num_fields > 0) - { - for ($i = 1; $i <= $num_fields; $i++) - { - $field_names[] = odbc_field_name($this->result_id, $i); - } - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = odbc_field_name($this->result_id, $odbc_index); - $retval[$i]->type = odbc_field_type($this->result_id, $odbc_index); - $retval[$i]->max_length = odbc_field_len($this->result_id, $odbc_index); - $retval[$i]->primary_key = 0; - $retval[$i]->default = ''; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - odbc_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return odbc_fetch_array($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = odbc_fetch_object($this->result_id); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('odbc_fetch_array')) -{ - /** - * ODBC Fetch array - * - * Emulates the native odbc_fetch_array() function when - * it is not available (odbc_fetch_array() requires unixODBC) - * - * @param resource &$result - * @param int $rownumber - * @return array - */ - function odbc_fetch_array(&$result, $rownumber = 1) - { - $rs = array(); - if ( ! odbc_fetch_into($result, $rs, $rownumber)) - { - return FALSE; - } - - $rs_assoc = array(); - foreach ($rs as $k => $v) - { - $field_name = odbc_field_name($result, $k+1); - $rs_assoc[$field_name] = $v; - } - - return $rs_assoc; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('odbc_fetch_object')) -{ - /** - * ODBC Fetch object - * - * Emulates the native odbc_fetch_object() function when - * it is not available. - * - * @param resource &$result - * @param int $rownumber - * @return object - */ - function odbc_fetch_object(&$result, $rownumber = 1) - { - $rs = array(); - if ( ! odbc_fetch_into($result, $rs, $rownumber)) - { - return FALSE; - } - - $rs_object = new stdClass(); - foreach ($rs as $k => $v) - { - $field_name = odbc_field_name($result, $k+1); - $rs_object->$field_name = $v; - } - - return $rs_object; - } -} diff --git a/finecms/finecms/system/database/drivers/odbc/odbc_utility.php b/finecms/finecms/system/database/drivers/odbc/odbc_utility.php deleted file mode 100644 index 643f6ec..0000000 --- a/finecms/finecms/system/database/drivers/odbc/odbc_utility.php +++ /dev/null @@ -1,63 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/index.html b/finecms/finecms/system/database/drivers/pdo/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/pdo/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/pdo/pdo_driver.php b/finecms/finecms/system/database/drivers/pdo/pdo_driver.php deleted file mode 100644 index 6afc999..0000000 --- a/finecms/finecms/system/database/drivers/pdo/pdo_driver.php +++ /dev/null @@ -1,329 +0,0 @@ -dsn, $match) && count($match) === 2) - { - // If there is a minimum valid dsn string pattern found, we're done - // This is for general PDO users, who tend to have a full DSN string. - $this->subdriver = $match[1]; - return; - } - // Legacy support for DSN specified in the hostname field - elseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2) - { - $this->dsn = $this->hostname; - $this->hostname = NULL; - $this->subdriver = $match[1]; - return; - } - elseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE)) - { - $this->subdriver = 'dblib'; - } - elseif ($this->subdriver === '4D') - { - $this->subdriver = '4d'; - } - elseif ( ! in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE)) - { - log_message('error', 'PDO: Invalid or non-existent subdriver'); - - if ($this->db_debug) - { - show_error('Invalid or non-existent PDO subdriver'); - } - } - - $this->dsn = NULL; - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if ($persistent === TRUE) - { - $this->options[PDO::ATTR_PERSISTENT] = TRUE; - } - - try - { - return new PDO($this->dsn, $this->username, $this->password, $this->options); - } - catch (PDOException $e) - { - if ($this->db_debug && empty($this->failover)) - { - $this->display_error($e->getMessage(), '', TRUE); - } - - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - // Not all subdrivers support the getAttribute() method - try - { - return $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); - } - catch (PDOException $e) - { - return parent::version(); - } - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql SQL query - * @return mixed - */ - protected function _execute($sql) - { - return $this->conn_id->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->conn_id->beginTransaction(); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->conn_id->commit(); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->conn_id->rollBack(); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - // Escape the string - $str = $this->conn_id->quote($str); - - // If there are duplicated quotes, trim them away - return ($str[0] === "'") - ? substr($str, 1, -1) - : $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return is_object($this->result_id) ? $this->result_id->rowCount() : 0; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @param string $name - * @return int - */ - public function insert_id($name = NULL) - { - return $this->conn_id->lastInsertId($name); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @param string $table - * @return string - */ - protected function _field_data($table) - { - return 'SELECT TOP 1 * FROM '.$this->protect_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - $error = array('code' => '00000', 'message' => ''); - $pdo_error = $this->conn_id->errorInfo(); - - if (empty($pdo_error[0])) - { - return $error; - } - - $error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0]; - if (isset($pdo_error[2])) - { - $error['message'] = $pdo_error[2]; - } - - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/pdo_forge.php b/finecms/finecms/system/database/drivers/pdo/pdo_forge.php deleted file mode 100644 index 685b677..0000000 --- a/finecms/finecms/system/database/drivers/pdo/pdo_forge.php +++ /dev/null @@ -1,65 +0,0 @@ -num_rows)) - { - return $this->num_rows; - } - elseif (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - elseif (($num_rows = $this->result_id->rowCount()) > 0) - { - return $this->num_rows = $num_rows; - } - - return $this->num_rows = count($this->result_array()); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return $this->result_id->columnCount(); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return bool - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - // Might trigger an E_WARNING due to not all subdrivers - // supporting getColumnMeta() - $field_names[$i] = @$this->result_id->getColumnMeta($i); - $field_names[$i] = $field_names[$i]['name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - try - { - $retval = array(); - - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field = $this->result_id->getColumnMeta($i); - - $retval[$i] = new stdClass(); - $retval[$i]->name = $field['name']; - $retval[$i]->type = $field['native_type']; - $retval[$i]->max_length = ($field['len'] > 0) ? $field['len'] : NULL; - $retval[$i]->primary_key = (int) ( ! empty($field['flags']) && in_array('primary_key', $field['flags'], TRUE)); - } - - return $retval; - } - catch (Exception $e) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsupported_feature'); - } - - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return $this->result_id->fetch(PDO::FETCH_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return $this->result_id->fetchObject($class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/pdo_utility.php b/finecms/finecms/system/database/drivers/pdo/pdo_utility.php deleted file mode 100644 index 5029cac..0000000 --- a/finecms/finecms/system/database/drivers/pdo/pdo_utility.php +++ /dev/null @@ -1,63 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/index.html b/finecms/finecms/system/database/drivers/pdo/subdrivers/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php deleted file mode 100644 index 7eaeaa1..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ /dev/null @@ -1,200 +0,0 @@ -dsn)) - { - $this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES'); - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS') - .' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @param string $table - * @return string - */ - protected function _field_data($table) - { - return 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1'; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php deleted file mode 100644 index 3f636d3..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ /dev/null @@ -1,217 +0,0 @@ - 'INT', - 'SMALLINT' => 'INT', - 'INT' => 'INT64', - 'INT32' => 'INT64' - ); - - /** - * DEFAULT value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_default = FALSE; - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - // No method of modifying columns is supported - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['null'] - .$field['unique'] - .$field['auto_increment']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'INT64'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE'; - - // UNIQUE must be used with NOT NULL - $field['null'] = ' NOT NULL'; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) - { - if (stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' AUTO_INCREMENT'; - } - elseif (strcasecmp($field['type'], 'UUID') === 0) - { - $field['auto_increment'] = ' AUTO_GENERATE'; - } - } - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php deleted file mode 100644 index fc49e0d..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ /dev/null @@ -1,209 +0,0 @@ -dsn)) - { - $this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES'; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php deleted file mode 100644 index 276cbb6..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ /dev/null @@ -1,230 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'BIGINT' => 'NUMERIC', - 'FLOAT' => 'DOUBLE', - 'REAL' => 'DOUBLE' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; - } - else - { - $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; - $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'LONGTEXT': - $attributes['TYPE'] = 'STRING'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php deleted file mode 100644 index 0824323..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ /dev/null @@ -1,337 +0,0 @@ -dsn)) - { - $this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - if ( ! empty($this->port)) - { - $this->dsn .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; - } - - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - empty($this->appname) OR $this->dsn .= ';appname='.$this->appname; - } - else - { - if ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - - $this->subdriver = 'dblib'; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if ($persistent === TRUE) - { - log_message('debug', "dblib driver doesn't support persistent connections"); - } - - $this->conn_id = parent::db_connect(FALSE); - - if ( ! is_object($this->conn_id)) - { - return $this->conn_id; - } - - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - $limit = $this->qb_offset + $this->qb_limit; - - // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, - // however an ORDER BY clause is required for it to work - if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php deleted file mode 100644 index d0cca38..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ /dev/null @@ -1,149 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php deleted file mode 100644 index cb93f19..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ /dev/null @@ -1,279 +0,0 @@ -dsn)) - { - $this->dsn = 'firebird:'; - - if ( ! empty($this->database)) - { - $this->dsn .= 'dbname='.$this->database; - } - elseif ( ! empty($this->hostname)) - { - $this->dsn .= 'dbname='.$this->hostname; - } - - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - empty($this->role) OR $this->dsn .= ';role='.$this->role; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", - CASE "fields"."RDB$FIELD_TYPE" - WHEN 7 THEN \'SMALLINT\' - WHEN 8 THEN \'INTEGER\' - WHEN 9 THEN \'QUAD\' - WHEN 10 THEN \'FLOAT\' - WHEN 11 THEN \'DFLOAT\' - WHEN 12 THEN \'DATE\' - WHEN 13 THEN \'TIME\' - WHEN 14 THEN \'CHAR\' - WHEN 16 THEN \'INT64\' - WHEN 27 THEN \'DOUBLE\' - WHEN 35 THEN \'TIMESTAMP\' - WHEN 37 THEN \'VARCHAR\' - WHEN 40 THEN \'CSTRING\' - WHEN 261 THEN \'BLOB\' - ELSE NULL - END AS "type", - "fields"."RDB$FIELD_LENGTH" AS "max_length", - "rfields"."RDB$DEFAULT_VALUE" AS "default" - FROM "RDB$RELATION_FIELDS" "rfields" - JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" - WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' - ORDER BY "rfields"."RDB$FIELD_POSITION"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // Limit clause depends on if Interbase or Firebird - if (stripos($this->version(), 'firebird') !== FALSE) - { - $select = 'FIRST '.$this->qb_limit - .($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : ''); - } - else - { - $select = 'ROWS ' - .($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); - } - - return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php deleted file mode 100644 index 20c5a68..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ /dev/null @@ -1,237 +0,0 @@ - 'INTEGER', - 'INTEGER' => 'INT64', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return string - */ - public function create_database($db_name) - { - // Firebird databases are flat files, so a path is required - - // Hostname is needed for remote access - empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; - - return parent::create_database('"'.$db_name.'"'); - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - if ( ! ibase_drop_db($this->conn_id)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' - .($field[$i]['null'] === TRUE ? 'NULL' : '1') - .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) - .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INT': - $attributes['TYPE'] = 'INTEGER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'INT64'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php deleted file mode 100644 index 26b556a..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ /dev/null @@ -1,244 +0,0 @@ -dsn)) - { - $this->dsn = 'ibm:'; - - // Pre-defined DSN - if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) - { - if (isset($this->DSN)) - { - $this->dsn .= 'DSN='.$this->DSN; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DSN='.$this->database; - } - - return; - } - - $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; - - if (isset($this->DATABASE)) - { - $this->dsn .= 'DATABASE='.$this->DATABASE.';'; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DATABASE='.$this->database.';'; - } - - if (isset($this->HOSTNAME)) - { - $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; - } - else - { - $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); - } - - if (isset($this->PORT)) - { - $this->dsn .= 'PORT='.$this->port.';'; - } - elseif ( ! empty($this->port)) - { - $this->dsn .= ';PORT='.$this->port.';'; - } - - $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "tabname" FROM "syscat"."tables" - WHERE "type" = \'T\' AND LOWER("tabschema") = '.$this->escape(strtolower($this->database)); - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return array - */ - protected function _list_columns($table = '') - { - return 'SELECT "colname" FROM "syscat"."columns" - WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' - AND LOWER("tabname") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "colname" AS "name", "typename" AS "type", "default" AS "default", "length" AS "max_length", - CASE "keyseq" WHEN NULL THEN 0 ELSE 1 END AS "primary_key" - FROM "syscat"."columns" - WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' - AND LOWER("tabname") = '.$this->escape(strtolower($table)).' - ORDER BY "colno"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - $sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY'; - - return ($this->qb_offset) - ? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset - : $sql; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php deleted file mode 100644 index 4238ca0..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ /dev/null @@ -1,154 +0,0 @@ - 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT' - ); - - /** - * DEFAULT value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_default = FALSE; - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'CHANGE') - { - $alter_type = 'MODIFY'; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE'; - - // UNIQUE must be used with NOT NULL - $field['null'] = ' NOT NULL'; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php deleted file mode 100644 index 050171f..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ /dev/null @@ -1,309 +0,0 @@ -dsn)) - { - $this->dsn = 'informix:'; - - // Pre-defined DSN - if (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service)) - { - if (isset($this->DSN)) - { - $this->dsn .= 'DSN='.$this->DSN; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DSN='.$this->database; - } - - return; - } - - if (isset($this->host)) - { - $this->dsn .= 'host='.$this->host; - } - else - { - $this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - } - - if (isset($this->service)) - { - $this->dsn .= '; service='.$this->service; - } - elseif ( ! empty($this->port)) - { - $this->dsn .= '; service='.$this->port; - } - - empty($this->database) OR $this->dsn .= '; database='.$this->database; - empty($this->server) OR $this->dsn .= '; server='.$this->server; - - $this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp') - .'; EnableScrollableCursors=1'; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "tabname" FROM "systables" - WHERE "tabid" > 99 AND "tabtype" = \'T\' AND LOWER("owner") = '.$this->escape(strtolower($this->username)); - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - return 'SELECT "colname" FROM "systables", "syscolumns" - WHERE "systables"."tabid" = "syscolumns"."tabid" - AND "systables"."tabtype" = \'T\' - AND LOWER("systables"."owner") = '.$this->escape(strtolower($owner)).' - AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "syscolumns"."colname" AS "name", - CASE "syscolumns"."coltype" - WHEN 0 THEN \'CHAR\' - WHEN 1 THEN \'SMALLINT\' - WHEN 2 THEN \'INTEGER\' - WHEN 3 THEN \'FLOAT\' - WHEN 4 THEN \'SMALLFLOAT\' - WHEN 5 THEN \'DECIMAL\' - WHEN 6 THEN \'SERIAL\' - WHEN 7 THEN \'DATE\' - WHEN 8 THEN \'MONEY\' - WHEN 9 THEN \'NULL\' - WHEN 10 THEN \'DATETIME\' - WHEN 11 THEN \'BYTE\' - WHEN 12 THEN \'TEXT\' - WHEN 13 THEN \'VARCHAR\' - WHEN 14 THEN \'INTERVAL\' - WHEN 15 THEN \'NCHAR\' - WHEN 16 THEN \'NVARCHAR\' - WHEN 17 THEN \'INT8\' - WHEN 18 THEN \'SERIAL8\' - WHEN 19 THEN \'SET\' - WHEN 20 THEN \'MULTISET\' - WHEN 21 THEN \'LIST\' - WHEN 22 THEN \'Unnamed ROW\' - WHEN 40 THEN \'LVARCHAR\' - WHEN 41 THEN \'BLOB/CLOB/BOOLEAN\' - WHEN 4118 THEN \'Named ROW\' - ELSE "syscolumns"."coltype" - END AS "type", - "syscolumns"."collength" as "max_length", - CASE "sysdefaults"."type" - WHEN \'L\' THEN "sysdefaults"."default" - ELSE NULL - END AS "default" - FROM "syscolumns", "systables", "sysdefaults" - WHERE "syscolumns"."tabid" = "systables"."tabid" - AND "systables"."tabid" = "sysdefaults"."tabid" - AND "syscolumns"."colno" = "sysdefaults"."colno" - AND "systables"."tabtype" = \'T\' - AND LOWER("systables"."owner") = '.$this->escape(strtolower($this->username)).' - AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)).' - ORDER BY "syscolumns"."colno"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE ONLY '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql $SQL Query - * @return string - */ - protected function _limit($sql) - { - $select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' '; - return preg_replace('/^(SELECT\s)/i', $select, $sql, 1); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php deleted file mode 100644 index 2ddc2a9..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ /dev/null @@ -1,163 +0,0 @@ - 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'REAL' => 'DOUBLE PRECISION', - 'SMALLFLOAT' => 'DOUBLE PRECISION' - ); - - /** - * DEFAULT value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_default = ', '; - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'CHANGE') - { - $alter_type = 'MODIFY'; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'BYTE': - case 'TEXT': - case 'BLOB': - case 'CLOB': - $attributes['UNIQUE'] = FALSE; - if (isset($attributes['DEFAULT'])) - { - unset($attributes['DEFAULT']); - } - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']); - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php deleted file mode 100644 index 64b13d8..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ /dev/null @@ -1,374 +0,0 @@ -dsn)) - { - $this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if (isset($this->stricton)) - { - if ($this->stricton) - { - $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; - } - else - { - $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")'; - } - - if ( ! empty($sql)) - { - if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) - { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; - } - else - { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; - } - } - } - - if ($this->compress === TRUE) - { - $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; - } - - if (is_array($this->encrypt)) - { - $ssl = array(); - empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; - empty($this->encrypt['ssl_cert']) OR $ssl[PDO::MYSQL_ATTR_SSL_CERT] = $this->encrypt['ssl_cert']; - empty($this->encrypt['ssl_ca']) OR $ssl[PDO::MYSQL_ATTR_SSL_CA] = $this->encrypt['ssl_ca']; - empty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath']; - empty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher']; - - // DO NOT use array_merge() here! - // It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers. - empty($ssl) OR $this->options += $ssl; - } - - // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails - if ( - ($pdo = parent::db_connect($persistent)) !== FALSE - && ! empty($ssl) - && version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=') - && empty($pdo->query("SHOW STATUS LIKE 'ssl_cipher'")->fetchObject()->Value) - ) - { - $message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; - log_message('error', $message); - return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; - } - - return $pdo; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); - return $this->conn_id->beginTransaction(); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ($this->conn_id->commit()) - { - $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ($this->conn_id->rollBack()) - { - $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES'; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php deleted file mode 100644 index c7a92b8..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ /dev/null @@ -1,256 +0,0 @@ -db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; - } - - if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = '.$this->db->dbcollat; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = ($alter_type === 'ADD') - ? "\n\tADD ".$field[$i]['_literal'] - : "\n\tMODIFY ".$field[$i]['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); - } - } - - return array($sql.implode(',', $field)); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php deleted file mode 100644 index abf9167..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ /dev/null @@ -1,326 +0,0 @@ -dsn)) - { - $this->dsn = 'oci:dbname='; - - // Oracle has a slightly different PDO DSN format (Easy Connect), - // which also supports pre-defined DSNs. - if (empty($this->hostname) && empty($this->port)) - { - $this->dsn .= $this->database; - } - else - { - $this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname) - .(empty($this->port) ? '' : ':'.$this->port).'/'; - - empty($this->database) OR $this->dsn .= $this->database; - } - - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - $version_string = parent::version(); - if (preg_match('#Release\s(?\d+(?:\.\d+)+)#', $version_string, $match)) - { - return $this->data_cache['version'] = $match[1]; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE - FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - - $length = ($query[$i]->CHAR_LENGTH > 0) - ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; - if ($length === NULL) - { - $length = $query[$i]->DATA_LENGTH; - } - $retval[$i]->max_length = $length; - - $default = $query[$i]->DATA_DEFAULT; - if ($default === NULL && $query[$i]->NULLABLE === 'N') - { - $default = ''; - } - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - $keys = implode(', ', $keys); - $sql = "INSERT ALL\n"; - - for ($i = 0, $c = count($values); $i < $c; $i++) - { - $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; - } - - return $sql.'SELECT * FROM dual'; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - $this->where('rownum <= ',$this->qb_limit, FALSE); - $this->qb_limit = FALSE; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - if (version_compare($this->version(), '12.1', '>=')) - { - // OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' - .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php deleted file mode 100644 index 813207b..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ /dev/null @@ -1,176 +0,0 @@ -db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = "\n\t".$field[$i]['_literal']; - } - else - { - $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - - if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - } - } - - $sql .= ' '.$alter_type.' '; - $sql .= (count($field) === 1) - ? $field[0] - : '('.implode(',', $field).')'; - - // RENAME COLUMN must be executed after MODIFY - array_unshift($sqls, $sql); - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - sequences and triggers must be used instead - } - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'INT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'NUMBER'; - return; - default: return; - } - } -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php deleted file mode 100644 index 066dd96..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ /dev/null @@ -1,229 +0,0 @@ -dsn)) - { - $this->dsn = 'odbc:'; - - // Pre-defined DSN - if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) - { - if (isset($this->DSN)) - { - $this->dsn .= 'DSN='.$this->DSN; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DSN='.$this->database; - } - - return; - } - - // If the DSN is not pre-configured - try to build an IBM DB2 connection string - $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; - - if (isset($this->DATABASE)) - { - $this->dsn .= 'DATABASE='.$this->DATABASE.';'; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DATABASE='.$this->database.';'; - } - - if (isset($this->HOSTNAME)) - { - $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; - } - else - { - $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); - } - - if (isset($this->PORT)) - { - $this->dsn .= 'PORT='.$this->port.';'; - } - elseif ( ! empty($this->port)) - { - $this->dsn .= ';PORT='.$this->port.';'; - } - - $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); - } - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - $this->display_error('db_unsupported_feature'); - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); - } -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php deleted file mode 100644 index a2a3bad..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ /dev/null @@ -1,70 +0,0 @@ -dsn)) - { - $this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - - if ( ! empty($this->username)) - { - $this->dsn .= ';username='.$this->username; - empty($this->password) OR $this->dsn .= ';password='.$this->password; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - $this->conn_id = parent::db_connect($persistent); - - if (is_object($this->conn_id) && ! empty($this->schema)) - { - $this->simple_query('SET search_path TO '.$this->schema.',public'); - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @param string $name - * @return int - */ - public function insert_id($name = NULL) - { - if ($name === NULL && version_compare($this->version(), '8.1', '>=')) - { - $query = $this->query('SELECT LASTVAL() AS ins_id'); - $query = $query->row(); - return $query->ins_id; - } - - return $this->conn_id->lastInsertId($name); - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * - * @param string $str - * @return mixed - */ - public function escape($str) - { - if (is_bool($str)) - { - return ($str) ? 'TRUE' : 'FALSE'; - } - - return parent::escape($str); - } - - // -------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderby - * @param string $direction ASC, DESC or RANDOM - * @param bool $escape - * @return object - */ - public function order_by($orderby, $direction = '', $escape = NULL) - { - $direction = strtoupper(trim($direction)); - if ($direction === 'RANDOM') - { - if ( ! is_float($orderby) && ctype_digit((string) $orderby)) - { - $orderby = ($orderby > 1) - ? (float) '0.'.$orderby - : (float) $orderby; - } - - if (is_float($orderby)) - { - $this->simple_query('SET SEED '.$orderby); - } - - $orderby = $this->_random_keyword[0]; - $direction = ''; - $escape = FALSE; - } - - return parent::order_by($orderby, $direction, $escape); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' AND "table_name" LIKE \'' - .$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT "column_name" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->column_name; - $retval[$i]->type = $query[$i]->data_type; - $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; - $retval[$i]->default = $query[$i]->column_default; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]['value']; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k.' = (CASE '.$val[$index]['field']."\n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END), '; - } - - $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php deleted file mode 100644 index b00af4a..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ /dev/null @@ -1,210 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INT4' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'INT8' => 'NUMERIC', - 'BIGINT' => 'NUMERIC', - 'REAL' => 'DOUBLE PRECISION', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * @param object &$db Database object - * @return void - */ - public function __construct(&$db) - { - parent::__construct($db); - - if (version_compare($this->db->version(), '9.0', '>')) - { - $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; - } - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - // Reset field lengths for data types that don't support it - if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) - { - $attributes['CONSTRAINT'] = NULL; - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $field['type'] = ($field['type'] === 'NUMERIC') - ? 'BIGSERIAL' - : 'SERIAL'; - } - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php deleted file mode 100644 index 9b70f3e..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ /dev/null @@ -1,219 +0,0 @@ -dsn)) - { - $this->dsn = 'sqlite:'; - - if (empty($this->database) && empty($this->hostname)) - { - $this->database = ':memory:'; - } - - $this->database = empty($this->database) ? $this->hostname : $this->database; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * @return array - */ - public function list_fields($table) - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $this->data_cache['field_names'][$table] = array(); - foreach ($result->result_array() as $row) - { - $this->data_cache['field_names'][$table][] = $row['name']; - } - - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php deleted file mode 100644 index 18c475b..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ /dev/null @@ -1,238 +0,0 @@ -db->version(), '3.3', '<')) - { - $this->_create_table_if = FALSE; - $this->_drop_table_if = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name (ignored) - * @return bool - */ - public function create_database($db_name) - { - // In SQLite, a database is created when you connect to the database. - // We'll return TRUE so that an error isn't generated - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - // In SQLite, a database is dropped when we delete a file - if (file_exists($this->db->database)) - { - // We need to close the pseudo-connection first - $this->db->close(); - if ( ! @unlink($this->db->database)) - { - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php deleted file mode 100644 index 07c429e..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ /dev/null @@ -1,369 +0,0 @@ -dsn)) - { - $this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ','.$this->port; - empty($this->database) OR $this->dsn .= ';Database='.$this->database; - - // Some custom options - - if (isset($this->QuotedId)) - { - $this->dsn .= ';QuotedId='.$this->QuotedId; - $this->_quoted_identifier = (bool) $this->QuotedId; - } - - if (isset($this->ConnectionPooling)) - { - $this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling; - } - - if ($this->encrypt === TRUE) - { - $this->dsn .= ';Encrypt=1'; - } - - if (isset($this->TraceOn)) - { - $this->dsn .= ';TraceOn='.$this->TraceOn; - } - - if (isset($this->TrustServerCertificate)) - { - $this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate; - } - - empty($this->APP) OR $this->dsn .= ';APP='.$this->APP; - empty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner; - empty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout; - empty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets; - empty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile; - empty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID; - } - elseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match)) - { - $this->_quoted_identifier = (bool) $match[1]; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set)) - { - $this->options[PDO::SQLSRV_ENCODING_UTF8] = 1; - } - - $this->conn_id = parent::db_connect($persistent); - - if ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier)) - { - return $this->conn_id; - } - - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // As of SQL Server 2012 (11.0.*) OFFSET is supported - if (version_compare($this->version(), '11', '>=')) - { - // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - $limit = $this->qb_offset + $this->qb_limit; - - // An ORDER BY clause is required for ROW_NUMBER() to work - if ($this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - -} diff --git a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php deleted file mode 100644 index 82a0d51..0000000 --- a/finecms/finecms/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ /dev/null @@ -1,149 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/finecms/finecms/system/database/drivers/postgre/index.html b/finecms/finecms/system/database/drivers/postgre/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/postgre/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/postgre/postgre_driver.php b/finecms/finecms/system/database/drivers/postgre/postgre_driver.php deleted file mode 100644 index bcdfc06..0000000 --- a/finecms/finecms/system/database/drivers/postgre/postgre_driver.php +++ /dev/null @@ -1,620 +0,0 @@ -dsn)) - { - return; - } - - $this->dsn === '' OR $this->dsn = ''; - - if (strpos($this->hostname, '/') !== FALSE) - { - // If UNIX sockets are used, we shouldn't set a port - $this->port = ''; - } - - $this->hostname === '' OR $this->dsn = 'host='.$this->hostname.' '; - - if ( ! empty($this->port) && ctype_digit($this->port)) - { - $this->dsn .= 'port='.$this->port.' '; - } - - if ($this->username !== '') - { - $this->dsn .= 'user='.$this->username.' '; - - /* An empty password is valid! - * - * $db['password'] = NULL must be done in order to ignore it. - */ - $this->password === NULL OR $this->dsn .= "password='".$this->password."' "; - } - - $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' '; - - /* We don't have these options as elements in our standard configuration - * array, but they might be set by parse_url() if the configuration was - * provided via string. Example: - * - * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 - */ - foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) - { - if (isset($this->$key) && is_string($this->$key) && $this->$key !== '') - { - $this->dsn .= $key."='".$this->$key."' "; - } - } - - $this->dsn = rtrim($this->dsn); - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $this->conn_id = ($persistent === TRUE) - ? pg_pconnect($this->dsn) - : pg_connect($this->dsn); - - if ($this->conn_id !== FALSE) - { - if ($persistent === TRUE - && pg_connection_status($this->conn_id) === PGSQL_CONNECTION_BAD - && pg_ping($this->conn_id) === FALSE - ) - { - return FALSE; - } - - empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if (pg_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return (pg_set_client_encoding($this->conn_id, $charset) === 0); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($pg_version = pg_version($this->conn_id)) === FALSE) - { - return FALSE; - } - - /* If PHP was compiled with PostgreSQL lib versions earlier - * than 7.4, pg_version() won't return the server version - * and so we'll have to fall back to running a query in - * order to get it. - */ - return isset($pg_version['server']) - ? $this->data_cache['version'] = $pg_version['server'] - : parent::version(); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return pg_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return (bool) pg_query($this->conn_id, 'BEGIN'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return (bool) pg_query($this->conn_id, 'COMMIT'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return (bool) pg_query($this->conn_id, 'ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return pg_escape_string($this->conn_id, $str); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * - * @param string $str - * @return mixed - */ - public function escape($str) - { - if (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))) - { - return pg_escape_literal($this->conn_id, $str); - } - elseif (is_bool($str)) - { - return ($str) ? 'TRUE' : 'FALSE'; - } - - return parent::escape($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return pg_affected_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return string - */ - public function insert_id() - { - $v = pg_version($this->conn_id); - $v = isset($v['server']) ? $v['server'] : 0; // 'server' key is only available since PosgreSQL 7.4 - - $table = (func_num_args() > 0) ? func_get_arg(0) : NULL; - $column = (func_num_args() > 1) ? func_get_arg(1) : NULL; - - if ($table === NULL && $v >= '8.1') - { - $sql = 'SELECT LASTVAL() AS ins_id'; - } - elseif ($table !== NULL) - { - if ($column !== NULL && $v >= '8.0') - { - $sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq"; - $query = $this->query($sql); - $query = $query->row(); - $seq = $query->seq; - } - else - { - // seq_name passed in table parameter - $seq = $table; - } - - $sql = 'SELECT CURRVAL(\''.$seq."') AS ins_id"; - } - else - { - return pg_last_oid($this->result_id); - } - - $query = $this->query($sql); - $query = $query->row(); - return (int) $query->ins_id; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql.' AND "table_name" LIKE \'' - .$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT "column_name" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->column_name; - $retval[$i]->type = $query[$i]->data_type; - $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; - $retval[$i]->default = $query[$i]->column_default; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => '', 'message' => pg_last_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderby - * @param string $direction ASC, DESC or RANDOM - * @param bool $escape - * @return object - */ - public function order_by($orderby, $direction = '', $escape = NULL) - { - $direction = strtoupper(trim($direction)); - if ($direction === 'RANDOM') - { - if ( ! is_float($orderby) && ctype_digit((string) $orderby)) - { - $orderby = ($orderby > 1) - ? (float) '0.'.$orderby - : (float) $orderby; - } - - if (is_float($orderby)) - { - $this->simple_query('SET SEED '.$orderby); - } - - $orderby = $this->_random_keyword[0]; - $direction = ''; - $escape = FALSE; - } - - return parent::order_by($orderby, $direction, $escape); - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]['value']; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k.' = (CASE '.$val[$index]['field']."\n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END), '; - } - - $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - pg_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/postgre/postgre_forge.php b/finecms/finecms/system/database/drivers/postgre/postgre_forge.php deleted file mode 100644 index cdbff4c..0000000 --- a/finecms/finecms/system/database/drivers/postgre/postgre_forge.php +++ /dev/null @@ -1,205 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INT4' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'INT8' => 'NUMERIC', - 'BIGINT' => 'NUMERIC', - 'REAL' => 'DOUBLE PRECISION', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * @param object &$db Database object - * @return void - */ - public function __construct(&$db) - { - parent::__construct($db); - - if (version_compare($this->db->version(), '9.0', '>')) - { - $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; - } - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - // Reset field lengths for data types that don't support it - if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) - { - $attributes['CONSTRAINT'] = NULL; - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $field['type'] = ($field['type'] === 'NUMERIC') - ? 'BIGSERIAL' - : 'SERIAL'; - } - } - -} diff --git a/finecms/finecms/system/database/drivers/postgre/postgre_result.php b/finecms/finecms/system/database/drivers/postgre/postgre_result.php deleted file mode 100644 index 57864a7..0000000 --- a/finecms/finecms/system/database/drivers/postgre/postgre_result.php +++ /dev/null @@ -1,182 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = pg_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return pg_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[] = pg_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = pg_field_name($this->result_id, $i); - $retval[$i]->type = pg_field_type($this->result_id, $i); - $retval[$i]->max_length = pg_field_size($this->result_id, $i); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - pg_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return pg_result_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return pg_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return pg_fetch_object($this->result_id, NULL, $class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/postgre/postgre_utility.php b/finecms/finecms/system/database/drivers/postgre/postgre_utility.php deleted file mode 100644 index 5ca358d..0000000 --- a/finecms/finecms/system/database/drivers/postgre/postgre_utility.php +++ /dev/null @@ -1,78 +0,0 @@ -db->display_error('db_unsupported_feature'); - } -} diff --git a/finecms/finecms/system/database/drivers/sqlite/index.html b/finecms/finecms/system/database/drivers/sqlite/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/sqlite/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/sqlite/sqlite_driver.php b/finecms/finecms/system/database/drivers/sqlite/sqlite_driver.php deleted file mode 100644 index 03c96e4..0000000 --- a/finecms/finecms/system/database/drivers/sqlite/sqlite_driver.php +++ /dev/null @@ -1,330 +0,0 @@ -database, 0666, $error) - : sqlite_open($this->database, 0666, $error); - - isset($error) && log_message('error', $error); - - return $conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - return isset($this->data_cache['version']) - ? $this->data_cache['version'] - : $this->data_cache['version'] = sqlite_libversion(); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return $this->is_write_type($sql) - ? sqlite_exec($this->conn_id, $sql) - : sqlite_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->simple_query('BEGIN TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->simple_query('COMMIT'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->simple_query('ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependant string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return sqlite_escape_string($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return sqlite_changes($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return sqlite_last_insert_rowid($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT name FROM sqlite_master WHERE type='table'"; - - if ($prefix_limit !== FALSE && $this->dbprefix != '') - { - return $sql." AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return bool - */ - protected function _list_columns($table = '') - { - // Not supported - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occured. - * - * @return array - */ - public function error() - { - $error = array('code' => sqlite_last_error($this->conn_id)); - $error['message'] = sqlite_error_string($error['code']); - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this function maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - sqlite_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite/sqlite_forge.php b/finecms/finecms/system/database/drivers/sqlite/sqlite_forge.php deleted file mode 100644 index a0fc0cd..0000000 --- a/finecms/finecms/system/database/drivers/sqlite/sqlite_forge.php +++ /dev/null @@ -1,205 +0,0 @@ -db->database) OR ! @unlink($this->db->database)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @todo implement drop_column(), modify_column() - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite/sqlite_result.php b/finecms/finecms/system/database/drivers/sqlite/sqlite_result.php deleted file mode 100644 index 34d3ac3..0000000 --- a/finecms/finecms/system/database/drivers/sqlite/sqlite_result.php +++ /dev/null @@ -1,164 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = @sqlite_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return @sqlite_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[$i] = sqlite_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = sqlite_field_name($this->result_id, $i); - $retval[$i]->type = NULL; - $retval[$i]->max_length = NULL; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return sqlite_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return sqlite_fetch_array($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return sqlite_fetch_object($this->result_id, $class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite/sqlite_utility.php b/finecms/finecms/system/database/drivers/sqlite/sqlite_utility.php deleted file mode 100644 index 90ca4b1..0000000 --- a/finecms/finecms/system/database/drivers/sqlite/sqlite_utility.php +++ /dev/null @@ -1,61 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite3/index.html b/finecms/finecms/system/database/drivers/sqlite3/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/sqlite3/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_driver.php b/finecms/finecms/system/database/drivers/sqlite3/sqlite3_driver.php deleted file mode 100644 index d131baa..0000000 --- a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_driver.php +++ /dev/null @@ -1,350 +0,0 @@ -password) - ? new SQLite3($this->database) - : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); - } - catch (Exception $e) - { - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - $version = SQLite3::version(); - return $this->data_cache['version'] = $version['versionString']; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @todo Implement use of SQLite3::querySingle(), if needed - * @param string $sql - * @return mixed SQLite3Result object or bool - */ - protected function _execute($sql) - { - return $this->is_write_type($sql) - ? $this->conn_id->exec($sql) - : $this->conn_id->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->conn_id->exec('BEGIN TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->conn_id->exec('END TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->conn_id->exec('ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return $this->conn_id->escapeString($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return $this->conn_id->changes(); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return $this->conn_id->lastInsertRowID(); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' - .(($prefix_limit !== FALSE && $this->dbprefix != '') - ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) - : ''); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * @return array - */ - public function list_fields($table) - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $this->data_cache['field_names'][$table] = array(); - foreach ($result->result_array() as $row) - { - $this->data_cache['field_names'][$table][] = $row['name']; - } - - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg()); - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - $this->conn_id->close(); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_forge.php b/finecms/finecms/system/database/drivers/sqlite3/sqlite3_forge.php deleted file mode 100644 index 5ee6daa..0000000 --- a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_forge.php +++ /dev/null @@ -1,225 +0,0 @@ -db->version(), '3.3', '<')) - { - $this->_create_table_if = FALSE; - $this->_drop_table_if = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return bool - */ - public function create_database($db_name) - { - // In SQLite, a database is created when you connect to the database. - // We'll return TRUE so that an error isn't generated - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - // In SQLite, a database is dropped when we delete a file - if (file_exists($this->db->database)) - { - // We need to close the pseudo-connection first - $this->db->close(); - if ( ! @unlink($this->db->database)) - { - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @todo implement drop_column(), modify_column() - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_result.php b/finecms/finecms/system/database/drivers/sqlite3/sqlite3_result.php deleted file mode 100644 index 03751f0..0000000 --- a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_result.php +++ /dev/null @@ -1,194 +0,0 @@ -result_id->numColumns(); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[] = $this->result_id->columnName($i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - static $data_types = array( - SQLITE3_INTEGER => 'integer', - SQLITE3_FLOAT => 'float', - SQLITE3_TEXT => 'text', - SQLITE3_BLOB => 'blob', - SQLITE3_NULL => 'null' - ); - - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $this->result_id->columnName($i); - - $type = $this->result_id->columnType($i); - $retval[$i]->type = isset($data_types[$type]) ? $data_types[$type] : $type; - - $retval[$i]->max_length = NULL; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id->finalize(); - $this->result_id = NULL; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return $this->result_id->fetchArray(SQLITE3_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - // No native support for fetching rows as objects - if (($row = $this->result_id->fetchArray(SQLITE3_ASSOC)) === FALSE) - { - return FALSE; - } - elseif ($class_name === 'stdClass') - { - return (object) $row; - } - - $class_name = new $class_name(); - foreach (array_keys($row) as $key) - { - $class_name->$key = $row[$key]; - } - - return $class_name; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n (ignored) - * @return array - */ - public function data_seek($n = 0) - { - // Only resetting to the start of the result set is supported - return ($n > 0) ? FALSE : $this->result_id->reset(); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_utility.php b/finecms/finecms/system/database/drivers/sqlite3/sqlite3_utility.php deleted file mode 100644 index 20d562f..0000000 --- a/finecms/finecms/system/database/drivers/sqlite3/sqlite3_utility.php +++ /dev/null @@ -1,61 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlsrv/index.html b/finecms/finecms/system/database/drivers/sqlsrv/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/drivers/sqlsrv/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_driver.php b/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_driver.php deleted file mode 100644 index a43e253..0000000 --- a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ /dev/null @@ -1,543 +0,0 @@ -scrollable === NULL) - { - $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') - ? SQLSRV_CURSOR_CLIENT_BUFFERED - : FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $pooling - * @return resource - */ - public function db_connect($pooling = FALSE) - { - $charset = in_array(strtolower($this->char_set), array('utf-8', 'utf8'), TRUE) - ? 'UTF-8' : SQLSRV_ENC_CHAR; - - $connection = array( - 'UID' => empty($this->username) ? '' : $this->username, - 'PWD' => empty($this->password) ? '' : $this->password, - 'Database' => $this->database, - 'ConnectionPooling' => ($pooling === TRUE) ? 1 : 0, - 'CharacterSet' => $charset, - 'Encrypt' => ($this->encrypt === TRUE) ? 1 : 0, - 'ReturnDatesAsStrings' => 1 - ); - - // If the username and password are both empty, assume this is a - // 'Windows Authentication Mode' connection. - if (empty($connection['UID']) && empty($connection['PWD'])) - { - unset($connection['UID'], $connection['PWD']); - } - - if (FALSE !== ($this->conn_id = sqlsrv_connect($this->hostname, $connection))) - { - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if ($this->_execute('USE '.$this->escape_identifiers($database))) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return ($this->scrollable === FALSE OR $this->is_write_type($sql)) - ? sqlsrv_query($this->conn_id, $sql) - : sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable)); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return sqlsrv_begin_transaction($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return sqlsrv_commit($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return sqlsrv_rollback($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return sqlsrv_rows_affected($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * Returns the last id created in the Identity column. - * - * @return string - */ - public function insert_id() - { - return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($info = sqlsrv_server_info($this->conn_id)) === FALSE) - { - return FALSE; - } - - return $this->data_cache['version'] = $info['SQLServerVersion']; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool - * @return string $prefix_limit - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_escape_like_str, $this->_escape_like_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - $error = array('code' => '00000', 'message' => ''); - $sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); - - if ( ! is_array($sqlsrv_errors)) - { - return $error; - } - - $sqlsrv_error = array_shift($sqlsrv_errors); - if (isset($sqlsrv_error['SQLSTATE'])) - { - $error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE']; - } - elseif (isset($sqlsrv_error['code'])) - { - $error['code'] = $sqlsrv_error['code']; - } - - if (isset($sqlsrv_error['message'])) - { - $error['message'] = $sqlsrv_error['message']; - } - - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // As of SQL Server 2012 (11.0.*) OFFSET is supported - if (version_compare($this->version(), '11', '>=')) - { - // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - $limit = $this->qb_offset + $this->qb_limit; - - // An ORDER BY clause is required for ROW_NUMBER() to work - if ($this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - sqlsrv_close($this->conn_id); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_forge.php b/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_forge.php deleted file mode 100644 index aa8490e..0000000 --- a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ /dev/null @@ -1,149 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_result.php b/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_result.php deleted file mode 100644 index f784ebe..0000000 --- a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_result.php +++ /dev/null @@ -1,193 +0,0 @@ -scrollable = $driver_object->scrollable; - } - - // -------------------------------------------------------------------- - - /** - * Number of rows in the result set - * - * @return int - */ - public function num_rows() - { - // sqlsrv_num_rows() doesn't work with the FORWARD and DYNAMIC cursors (FALSE is the same as FORWARD) - if ( ! in_array($this->scrollable, array(FALSE, SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_DYNAMIC), TRUE)) - { - return parent::num_rows(); - } - - return is_int($this->num_rows) - ? $this->num_rows - : $this->num_rows = sqlsrv_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return @sqlsrv_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field) - { - $field_names[] = $field['Name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - foreach (sqlsrv_field_metadata($this->result_id) as $i => $field) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $field['Name']; - $retval[$i]->type = $field['Type']; - $retval[$i]->max_length = $field['Size']; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - sqlsrv_free_stmt($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return sqlsrv_fetch_object($this->result_id, $class_name); - } - -} diff --git a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_utility.php b/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_utility.php deleted file mode 100644 index 19c93d0..0000000 --- a/finecms/finecms/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ /dev/null @@ -1,77 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/finecms/finecms/system/database/index.html b/finecms/finecms/system/database/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/database/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/fonts/index.html b/finecms/finecms/system/fonts/index.html deleted file mode 100644 index b702fbc..0000000 --- a/finecms/finecms/system/fonts/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

    Directory access is forbidden.

    - - - diff --git a/finecms/finecms/system/fonts/texb.ttf b/finecms/finecms/system/fonts/texb.ttf deleted file mode 100644 index 383c88b..0000000 Binary files a/finecms/finecms/system/fonts/texb.ttf and /dev/null differ diff --git a/finecms/finecms/system/helpers/array_helper.php b/finecms/finecms/system/helpers/array_helper.php deleted file mode 100644 index 74c7c15..0000000 --- a/finecms/finecms/system/helpers/array_helper.php +++ /dev/null @@ -1,115 +0,0 @@ - '', - 'img_path' => '', - 'img_url' => '', - 'img_width' => '150', - 'img_height' => '30', - 'font_path' => '', - 'expiration' => 7200, - 'word_length' => 8, - 'font_size' => 16, - 'img_id' => '', - 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'colors' => array( - 'background' => array(255,255,255), - 'border' => array(153,102,102), - 'text' => array(204,153,153), - 'grid' => array(255,182,182) - ) - ); - - foreach ($defaults as $key => $val) - { - if ( ! is_array($data) && empty($$key)) - { - $$key = $val; - } - else - { - $$key = isset($data[$key]) ? $data[$key] : $val; - } - } - - if ($img_path === '' OR $img_url === '' - OR ! is_dir($img_path) OR ! is_really_writable($img_path) - OR ! extension_loaded('gd')) - { - return FALSE; - } - - // ----------------------------------- - // Remove old images - // ----------------------------------- - - $now = microtime(TRUE); - - $current_dir = @opendir($img_path); - while ($filename = @readdir($current_dir)) - { - if (in_array(substr($filename, -4), array('.jpg', '.png')) - && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) - { - @unlink($img_path.$filename); - } - } - - @closedir($current_dir); - - // ----------------------------------- - // Do we have a "word" yet? - // ----------------------------------- - - if (empty($word)) - { - $word = ''; - $pool_length = strlen($pool); - $rand_max = $pool_length - 1; - - // PHP7 or a suitable polyfill - if (function_exists('random_int')) - { - try - { - for ($i = 0; $i < $word_length; $i++) - { - $word .= $pool[random_int(0, $rand_max)]; - } - } - catch (Exception $e) - { - // This means fallback to the next possible - // alternative to random_int() - $word = ''; - } - } - } - - if (empty($word)) - { - // Nobody will have a larger character pool than - // 256 characters, but let's handle it just in case ... - // - // No, I do not care that the fallback to mt_rand() can - // handle it; if you trigger this, you're very obviously - // trying to break it. -- Narf - if ($pool_length > 256) - { - return FALSE; - } - - // We'll try using the operating system's PRNG first, - // which we can access through CI_Security::get_random_bytes() - $security = get_instance()->security; - - // To avoid numerous get_random_bytes() calls, we'll - // just try fetching as much bytes as we need at once. - if (($bytes = $security->get_random_bytes($pool_length)) !== FALSE) - { - $byte_index = $word_index = 0; - while ($word_index < $word_length) - { - // Do we have more random data to use? - // It could be exhausted by previous iterations - // ignoring bytes higher than $rand_max. - if ($byte_index === $pool_length) - { - // No failures should be possible if the - // first get_random_bytes() call didn't - // return FALSE, but still ... - for ($i = 0; $i < 5; $i++) - { - if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) - { - continue; - } - - $byte_index = 0; - break; - } - - if ($bytes === FALSE) - { - // Sadly, this means fallback to mt_rand() - $word = ''; - break; - } - } - - list(, $rand_index) = unpack('C', $bytes[$byte_index++]); - if ($rand_index > $rand_max) - { - continue; - } - - $word .= $pool[$rand_index]; - $word_index++; - } - } - } - - if (empty($word)) - { - for ($i = 0; $i < $word_length; $i++) - { - $word .= $pool[mt_rand(0, $rand_max)]; - } - } - elseif ( ! is_string($word)) - { - $word = (string) $word; - } - - // ----------------------------------- - // Determine angle and position - // ----------------------------------- - $length = strlen($word); - $angle = ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0; - $x_axis = mt_rand(6, (360/$length)-16); - $y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height); - - // Create image - // PHP.net recommends imagecreatetruecolor(), but it isn't always available - $im = function_exists('imagecreatetruecolor') - ? imagecreatetruecolor($img_width, $img_height) - : imagecreate($img_width, $img_height); - - // ----------------------------------- - // Assign colors - // ---------------------------------- - - is_array($colors) OR $colors = $defaults['colors']; - - foreach (array_keys($defaults['colors']) as $key) - { - // Check for a possible missing value - is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key]; - $colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]); - } - - // Create the rectangle - ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']); - - // ----------------------------------- - // Create the spiral pattern - // ----------------------------------- - $theta = 1; - $thetac = 7; - $radius = 16; - $circles = 20; - $points = 32; - - for ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++) - { - $theta += $thetac; - $rad = $radius * ($i / $points); - $x = ($rad * cos($theta)) + $x_axis; - $y = ($rad * sin($theta)) + $y_axis; - $theta += $thetac; - $rad1 = $radius * (($i + 1) / $points); - $x1 = ($rad1 * cos($theta)) + $x_axis; - $y1 = ($rad1 * sin($theta)) + $y_axis; - imageline($im, $x, $y, $x1, $y1, $colors['grid']); - $theta -= $thetac; - } - - // ----------------------------------- - // Write the text - // ----------------------------------- - - $use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext')); - if ($use_font === FALSE) - { - ($font_size > 5) && $font_size = 5; - $x = mt_rand(0, $img_width / ($length / 3)); - $y = 0; - } - else - { - ($font_size > 30) && $font_size = 30; - $x = mt_rand(0, $img_width / ($length / 1.5)); - $y = $font_size + 2; - } - - for ($i = 0; $i < $length; $i++) - { - if ($use_font === FALSE) - { - $y = mt_rand(0 , $img_height / 2); - imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']); - $x += ($font_size * 2); - } - else - { - $y = mt_rand($img_height / 2, $img_height - 3); - imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]); - $x += $font_size; - } - } - - // Create the border - imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']); - - // ----------------------------------- - // Generate the image - // ----------------------------------- - $img_url = rtrim($img_url, '/').'/'; - - if (function_exists('imagejpeg')) - { - $img_filename = $now.'.jpg'; - imagejpeg($im, $img_path.$img_filename); - } - elseif (function_exists('imagepng')) - { - $img_filename = $now.'.png'; - imagepng($im, $img_path.$img_filename); - } - else - { - return FALSE; - } - - $img = ' '; - ImageDestroy($im); - - return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename); - } -} diff --git a/finecms/finecms/system/helpers/cookie_helper.php b/finecms/finecms/system/helpers/cookie_helper.php deleted file mode 100644 index b943edb..0000000 --- a/finecms/finecms/system/helpers/cookie_helper.php +++ /dev/null @@ -1,113 +0,0 @@ -input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_cookie')) -{ - /** - * Fetch an item from the COOKIE array - * - * @param string - * @param bool - * @return mixed - */ - function get_cookie($index, $xss_clean = NULL) - { - is_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE); - $prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix'); - return get_instance()->input->cookie($prefix.$index, $xss_clean); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('delete_cookie')) -{ - /** - * Delete a COOKIE - * - * @param mixed - * @param string the cookie domain. Usually: .yourdomain.com - * @param string the cookie path - * @param string the cookie prefix - * @return void - */ - function delete_cookie($name, $domain = '', $path = '/', $prefix = '') - { - set_cookie($name, '', '', $domain, $path, $prefix); - } -} diff --git a/finecms/finecms/system/helpers/date_helper.php b/finecms/finecms/system/helpers/date_helper.php deleted file mode 100644 index bb15042..0000000 --- a/finecms/finecms/system/helpers/date_helper.php +++ /dev/null @@ -1,742 +0,0 @@ -format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); - - return mktime($hour, $minute, $second, $month, $day, $year); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('mdate')) -{ - /** - * Convert MySQL Style Datecodes - * - * This function is identical to PHPs date() function, - * except that it allows date codes to be formatted using - * the MySQL style, where each code letter is preceded - * with a percent sign: %Y %m %d etc... - * - * The benefit of doing dates this way is that you don't - * have to worry about escaping your text letters that - * match the date codes. - * - * @param string - * @param int - * @return int - */ - function mdate($datestr = '', $time = '') - { - if ($datestr === '') - { - return ''; - } - elseif (empty($time)) - { - $time = now(); - } - - $datestr = str_replace( - '%\\', - '', - preg_replace('/([a-z]+?){1}/i', '\\\\\\1', $datestr) - ); - - return date($datestr, $time); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('standard_date')) -{ - /** - * Standard Date - * - * Returns a date formatted according to the submitted standard. - * - * As of PHP 5.2, the DateTime extension provides constants that - * serve for the exact same purpose and are used with date(). - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 Use PHP's native date() instead. - * @link http://www.php.net/manual/en/class.datetime.php#datetime.constants.types - * - * @example date(DATE_RFC822, now()); // default - * @example date(DATE_W3C, $time); // a different format and time - * - * @param string $fmt = 'DATE_RFC822' the chosen format - * @param int $time = NULL Unix timestamp - * @return string - */ - function standard_date($fmt = 'DATE_RFC822', $time = NULL) - { - if (empty($time)) - { - $time = now(); - } - - // Procedural style pre-defined constants from the DateTime extension - if (strpos($fmt, 'DATE_') !== 0 OR defined($fmt) === FALSE) - { - return FALSE; - } - - return date(constant($fmt), $time); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('timespan')) -{ - /** - * Timespan - * - * Returns a span of seconds in this format: - * 10 days 14 hours 36 minutes 47 seconds - * - * @param int a number of seconds - * @param int Unix timestamp - * @param int a number of display units - * @return string - */ - function timespan($seconds = 1, $time = '', $units = 7) - { - $CI =& get_instance(); - $CI->lang->load('date'); - - is_numeric($seconds) OR $seconds = 1; - is_numeric($time) OR $time = time(); - is_numeric($units) OR $units = 7; - - $seconds = ($time <= $seconds) ? 1 : $time - $seconds; - - $str = array(); - $years = floor($seconds / 31557600); - - if ($years > 0) - { - $str[] = $years.' '.$CI->lang->line($years > 1 ? 'date_years' : 'date_year'); - } - - $seconds -= $years * 31557600; - $months = floor($seconds / 2629743); - - if (count($str) < $units && ($years > 0 OR $months > 0)) - { - if ($months > 0) - { - $str[] = $months.' '.$CI->lang->line($months > 1 ? 'date_months' : 'date_month'); - } - - $seconds -= $months * 2629743; - } - - $weeks = floor($seconds / 604800); - - if (count($str) < $units && ($years > 0 OR $months > 0 OR $weeks > 0)) - { - if ($weeks > 0) - { - $str[] = $weeks.' '.$CI->lang->line($weeks > 1 ? 'date_weeks' : 'date_week'); - } - - $seconds -= $weeks * 604800; - } - - $days = floor($seconds / 86400); - - if (count($str) < $units && ($months > 0 OR $weeks > 0 OR $days > 0)) - { - if ($days > 0) - { - $str[] = $days.' '.$CI->lang->line($days > 1 ? 'date_days' : 'date_day'); - } - - $seconds -= $days * 86400; - } - - $hours = floor($seconds / 3600); - - if (count($str) < $units && ($days > 0 OR $hours > 0)) - { - if ($hours > 0) - { - $str[] = $hours.' '.$CI->lang->line($hours > 1 ? 'date_hours' : 'date_hour'); - } - - $seconds -= $hours * 3600; - } - - $minutes = floor($seconds / 60); - - if (count($str) < $units && ($days > 0 OR $hours > 0 OR $minutes > 0)) - { - if ($minutes > 0) - { - $str[] = $minutes.' '.$CI->lang->line($minutes > 1 ? 'date_minutes' : 'date_minute'); - } - - $seconds -= $minutes * 60; - } - - if (count($str) === 0) - { - $str[] = $seconds.' '.$CI->lang->line($seconds > 1 ? 'date_seconds' : 'date_second'); - } - - return implode(', ', $str); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('days_in_month')) -{ - /** - * Number of days in a month - * - * Takes a month/year as input and returns the number of days - * for the given month/year. Takes leap years into consideration. - * - * @param int a numeric month - * @param int a numeric year - * @return int - */ - function days_in_month($month = 0, $year = '') - { - if ($month < 1 OR $month > 12) - { - return 0; - } - elseif ( ! is_numeric($year) OR strlen($year) !== 4) - { - $year = date('Y'); - } - - if (defined('CAL_GREGORIAN')) - { - return cal_days_in_month(CAL_GREGORIAN, $month, $year); - } - - if ($year >= 1970) - { - return (int) date('t', mktime(12, 0, 0, $month, 1, $year)); - } - - if ($month == 2) - { - if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0)) - { - return 29; - } - } - - $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); - return $days_in_month[$month - 1]; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('local_to_gmt')) -{ - /** - * Converts a local Unix timestamp to GMT - * - * @param int Unix timestamp - * @return int - */ - function local_to_gmt($time = '') - { - if ($time === '') - { - $time = time(); - } - - return mktime( - gmdate('G', $time), - gmdate('i', $time), - gmdate('s', $time), - gmdate('n', $time), - gmdate('j', $time), - gmdate('Y', $time) - ); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('gmt_to_local')) -{ - /** - * Converts GMT time to a localized value - * - * Takes a Unix timestamp (in GMT) as input, and returns - * at the local value based on the timezone and DST setting - * submitted - * - * @param int Unix timestamp - * @param string timezone - * @param bool whether DST is active - * @return int - */ - function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) - { - if ($time === '') - { - return now(); - } - - $time += timezones($timezone) * 3600; - - return ($dst === TRUE) ? $time + 3600 : $time; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('mysql_to_unix')) -{ - /** - * Converts a MySQL Timestamp to Unix - * - * @param int MySQL timestamp YYYY-MM-DD HH:MM:SS - * @return int Unix timstamp - */ - function mysql_to_unix($time = '') - { - // We'll remove certain characters for backward compatibility - // since the formatting changed with MySQL 4.1 - // YYYY-MM-DD HH:MM:SS - - $time = str_replace(array('-', ':', ' '), '', $time); - - // YYYYMMDDHHMMSS - return mktime( - substr($time, 8, 2), - substr($time, 10, 2), - substr($time, 12, 2), - substr($time, 4, 2), - substr($time, 6, 2), - substr($time, 0, 4) - ); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('unix_to_human')) -{ - /** - * Unix to "Human" - * - * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM - * - * @param int Unix timestamp - * @param bool whether to show seconds - * @param string format: us or euro - * @return string - */ - function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') - { - $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; - - if ($fmt === 'us') - { - $r .= date('h', $time).':'.date('i', $time); - } - else - { - $r .= date('H', $time).':'.date('i', $time); - } - - if ($seconds) - { - $r .= ':'.date('s', $time); - } - - if ($fmt === 'us') - { - return $r.' '.date('A', $time); - } - - return $r; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('human_to_unix')) -{ - /** - * Convert "human" date to GMT - * - * Reverses the above process - * - * @param string format: us or euro - * @return int - */ - function human_to_unix($datestr = '') - { - if ($datestr === '') - { - return FALSE; - } - - $datestr = preg_replace('/\040+/', ' ', trim($datestr)); - - if ( ! preg_match('/^(\d{2}|\d{4})\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) - { - return FALSE; - } - - sscanf($datestr, '%d-%d-%d %s %s', $year, $month, $day, $time, $ampm); - sscanf($time, '%d:%d:%d', $hour, $min, $sec); - isset($sec) OR $sec = 0; - - if (isset($ampm)) - { - $ampm = strtolower($ampm); - - if ($ampm[0] === 'p' && $hour < 12) - { - $hour += 12; - } - elseif ($ampm[0] === 'a' && $hour === 12) - { - $hour = 0; - } - } - - return mktime($hour, $min, $sec, $month, $day, $year); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('nice_date')) -{ - /** - * Turns many "reasonably-date-like" strings into something - * that is actually useful. This only works for dates after unix epoch. - * - * @deprecated 3.1.3 Use DateTime::createFromFormat($input_format, $input)->format($output_format); - * @param string The terribly formatted date-like string - * @param string Date format to return (same as php date function) - * @return string - */ - function nice_date($bad_date = '', $format = FALSE) - { - if (empty($bad_date)) - { - return 'Unknown'; - } - elseif (empty($format)) - { - $format = 'U'; - } - - // Date like: YYYYMM - if (preg_match('/^\d{6}$/i', $bad_date)) - { - if (in_array(substr($bad_date, 0, 2), array('19', '20'))) - { - $year = substr($bad_date, 0, 4); - $month = substr($bad_date, 4, 2); - } - else - { - $month = substr($bad_date, 0, 2); - $year = substr($bad_date, 2, 4); - } - - return date($format, strtotime($year.'-'.$month.'-01')); - } - - // Date Like: YYYYMMDD - if (preg_match('/^\d{8}$/i', $bad_date, $matches)) - { - return DateTime::createFromFormat('Ymd', $bad_date)->format($format); - } - - // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) - if (preg_match('/^(\d{1,2})-(\d{1,2})-(\d{4})$/i', $bad_date, $matches)) - { - return date($format, strtotime($matches[3].'-'.$matches[1].'-'.$matches[2])); - } - - // Any other kind of string, when converted into UNIX time, - // produces "0 seconds after epoc..." is probably bad... - // return "Invalid Date". - if (date('U', strtotime($bad_date)) === '0') - { - return 'Invalid Date'; - } - - // It's probably a valid-ish date format already - return date($format, strtotime($bad_date)); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('timezone_menu')) -{ - /** - * Timezone Menu - * - * Generates a drop-down menu of timezones. - * - * @param string timezone - * @param string classname - * @param string menu name - * @param mixed attributes - * @return string - */ - function timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '') - { - $CI =& get_instance(); - $CI->lang->load('date'); - - $default = ($default === 'GMT') ? 'UTC' : $default; - - $menu = ''; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('timezones')) -{ - /** - * Timezones - * - * Returns an array of timezones. This is a helper function - * for various other ones in this library - * - * @param string timezone - * @return string - */ - function timezones($tz = '') - { - // Note: Don't change the order of these even though - // some items appear to be in the wrong order - - $zones = array( - 'UM12' => -12, - 'UM11' => -11, - 'UM10' => -10, - 'UM95' => -9.5, - 'UM9' => -9, - 'UM8' => -8, - 'UM7' => -7, - 'UM6' => -6, - 'UM5' => -5, - 'UM45' => -4.5, - 'UM4' => -4, - 'UM35' => -3.5, - 'UM3' => -3, - 'UM2' => -2, - 'UM1' => -1, - 'UTC' => 0, - 'UP1' => +1, - 'UP2' => +2, - 'UP3' => +3, - 'UP35' => +3.5, - 'UP4' => +4, - 'UP45' => +4.5, - 'UP5' => +5, - 'UP55' => +5.5, - 'UP575' => +5.75, - 'UP6' => +6, - 'UP65' => +6.5, - 'UP7' => +7, - 'UP8' => +8, - 'UP875' => +8.75, - 'UP9' => +9, - 'UP95' => +9.5, - 'UP10' => +10, - 'UP105' => +10.5, - 'UP11' => +11, - 'UP115' => +11.5, - 'UP12' => +12, - 'UP1275' => +12.75, - 'UP13' => +13, - 'UP14' => +14 - ); - - if ($tz === '') - { - return $zones; - } - - return isset($zones[$tz]) ? $zones[$tz] : 0; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('date_range')) -{ - /** - * Date range - * - * Returns a list of dates within a specified period. - * - * @param int unix_start UNIX timestamp of period start date - * @param int unix_end|days UNIX timestamp of period end date - * or interval in days. - * @param mixed is_unix Specifies whether the second parameter - * is a UNIX timestamp or a day interval - * - TRUE or 'unix' for a timestamp - * - FALSE or 'days' for an interval - * @param string date_format Output date format, same as in date() - * @return array - */ - function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') - { - if ($unix_start == '' OR $mixed == '' OR $format == '') - { - return FALSE; - } - - $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); - - // Validate input and try strtotime() on invalid timestamps/intervals, just in case - if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE) - OR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) - OR ($is_unix === TRUE && $mixed < $unix_start)) - { - return FALSE; - } - - if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) - { - return array(date($format, $unix_start)); - } - - $range = array(); - - $from = new DateTime(); - $from->setTimestamp($unix_start); - - if ($is_unix) - { - $arg = new DateTime(); - $arg->setTimestamp($mixed); - } - else - { - $arg = (int) $mixed; - } - - $period = new DatePeriod($from, new DateInterval('P1D'), $arg); - foreach ($period as $date) - { - $range[] = $date->format($format); - } - - /* If a period end date was passed to the DatePeriod constructor, it might not - * be in our results. Not sure if this is a bug or it's just possible because - * the end date might actually be less than 24 hours away from the previously - * generated DateTime object, but either way - we have to append it manually. - */ - if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) - { - $range[] = $arg->format($format); - } - - return $range; - } -} diff --git a/finecms/finecms/system/helpers/directory_helper.php b/finecms/finecms/system/helpers/directory_helper.php deleted file mode 100644 index 2785241..0000000 --- a/finecms/finecms/system/helpers/directory_helper.php +++ /dev/null @@ -1,101 +0,0 @@ - 0) && is_dir($source_dir.$file)) - { - $filedata[$file] = directory_map($source_dir.$file, $new_depth, $hidden); - } - else - { - $filedata[] = $file; - } - } - - closedir($fp); - return $filedata; - } - - return FALSE; - } -} diff --git a/finecms/finecms/system/helpers/download_helper.php b/finecms/finecms/system/helpers/download_helper.php deleted file mode 100644 index b2a1458..0000000 --- a/finecms/finecms/system/helpers/download_helper.php +++ /dev/null @@ -1,158 +0,0 @@ - 0) - ? @rmdir($path) - : TRUE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_filenames')) -{ - /** - * Get Filenames - * - * Reads the specified directory and builds an array containing the filenames. - * Any sub-folders contained within the specified path are read as well. - * - * @param string path to source - * @param bool whether to include the path as part of the filename - * @param bool internal variable to determine recursion status - do not use in calls - * @return array - */ - function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) - { - static $_filedata = array(); - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === FALSE) - { - $_filedata = array(); - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - - while (FALSE !== ($file = readdir($fp))) - { - if (is_dir($source_dir.$file) && $file[0] !== '.') - { - get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); - } - elseif ($file[0] !== '.') - { - $_filedata[] = ($include_path === TRUE) ? $source_dir.$file : $file; - } - } - - closedir($fp); - return $_filedata; - } - - return FALSE; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_dir_file_info')) -{ - /** - * Get Directory File Information - * - * Reads the specified directory and builds an array containing the filenames, - * filesize, dates, and permissions - * - * Any sub-folders contained within the specified path are read as well. - * - * @param string path to source - * @param bool Look only at the top level directory specified? - * @param bool internal variable to determine recursion status - do not use in calls - * @return array - */ - function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) - { - static $_filedata = array(); - $relative_path = $source_dir; - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === FALSE) - { - $_filedata = array(); - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - - // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast - while (FALSE !== ($file = readdir($fp))) - { - if (is_dir($source_dir.$file) && $file[0] !== '.' && $top_level_only === FALSE) - { - get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); - } - elseif ($file[0] !== '.') - { - $_filedata[$file] = get_file_info($source_dir.$file); - $_filedata[$file]['relative_path'] = $relative_path; - } - } - - closedir($fp); - return $_filedata; - } - - return FALSE; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_file_info')) -{ - /** - * Get File Info - * - * Given a file and path, returns the name, path, size, date modified - * Second parameter allows you to explicitly declare what information you want returned - * Options are: name, server_path, size, date, readable, writable, executable, fileperms - * Returns FALSE if the file cannot be found. - * - * @param string path to file - * @param mixed array or comma separated string of information returned - * @return array - */ - function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) - { - if ( ! file_exists($file)) - { - return FALSE; - } - - if (is_string($returned_values)) - { - $returned_values = explode(',', $returned_values); - } - - foreach ($returned_values as $key) - { - switch ($key) - { - case 'name': - $fileinfo['name'] = basename($file); - break; - case 'server_path': - $fileinfo['server_path'] = $file; - break; - case 'size': - $fileinfo['size'] = filesize($file); - break; - case 'date': - $fileinfo['date'] = filemtime($file); - break; - case 'readable': - $fileinfo['readable'] = is_readable($file); - break; - case 'writable': - $fileinfo['writable'] = is_really_writable($file); - break; - case 'executable': - $fileinfo['executable'] = is_executable($file); - break; - case 'fileperms': - $fileinfo['fileperms'] = fileperms($file); - break; - } - } - - return $fileinfo; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_mime_by_extension')) -{ - /** - * Get Mime by Extension - * - * Translates a file extension into a mime type based on config/mimes.php. - * Returns FALSE if it can't determine the type, or open the mime config file - * - * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience - * It should NOT be trusted, and should certainly NOT be used for security - * - * @param string $filename File name - * @return string - */ - function get_mime_by_extension($filename) - { - static $mimes; - - if ( ! is_array($mimes)) - { - $mimes = get_mimes(); - - if (empty($mimes)) - { - return FALSE; - } - } - - $extension = strtolower(substr(strrchr($filename, '.'), 1)); - - if (isset($mimes[$extension])) - { - return is_array($mimes[$extension]) - ? current($mimes[$extension]) // Multiple mime types, just give the first one - : $mimes[$extension]; - } - - return FALSE; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('symbolic_permissions')) -{ - /** - * Symbolic Permissions - * - * Takes a numeric value representing a file's permissions and returns - * standard symbolic notation representing that value - * - * @param int $perms Permissions - * @return string - */ - function symbolic_permissions($perms) - { - if (($perms & 0xC000) === 0xC000) - { - $symbolic = 's'; // Socket - } - elseif (($perms & 0xA000) === 0xA000) - { - $symbolic = 'l'; // Symbolic Link - } - elseif (($perms & 0x8000) === 0x8000) - { - $symbolic = '-'; // Regular - } - elseif (($perms & 0x6000) === 0x6000) - { - $symbolic = 'b'; // Block special - } - elseif (($perms & 0x4000) === 0x4000) - { - $symbolic = 'd'; // Directory - } - elseif (($perms & 0x2000) === 0x2000) - { - $symbolic = 'c'; // Character special - } - elseif (($perms & 0x1000) === 0x1000) - { - $symbolic = 'p'; // FIFO pipe - } - else - { - $symbolic = 'u'; // Unknown - } - - // Owner - $symbolic .= (($perms & 0x0100) ? 'r' : '-') - .(($perms & 0x0080) ? 'w' : '-') - .(($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); - - // Group - $symbolic .= (($perms & 0x0020) ? 'r' : '-') - .(($perms & 0x0010) ? 'w' : '-') - .(($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); - - // World - $symbolic .= (($perms & 0x0004) ? 'r' : '-') - .(($perms & 0x0002) ? 'w' : '-') - .(($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); - - return $symbolic; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('octal_permissions')) -{ - /** - * Octal Permissions - * - * Takes a numeric value representing a file's permissions and returns - * a three character string representing the file's octal permissions - * - * @param int $perms Permissions - * @return string - */ - function octal_permissions($perms) - { - return substr(sprintf('%o', $perms), -3); - } -} diff --git a/finecms/finecms/system/helpers/form_helper.php b/finecms/finecms/system/helpers/form_helper.php deleted file mode 100644 index 13f1963..0000000 --- a/finecms/finecms/system/helpers/form_helper.php +++ /dev/null @@ -1,1055 +0,0 @@ -config->site_url($CI->uri->uri_string()); - } - // If an action is not a full URL then turn it into one - elseif (strpos($action, '://') === FALSE) - { - $action = $CI->config->site_url($action); - } - - $attributes = _attributes_to_string($attributes); - - if (stripos($attributes, 'method=') === FALSE) - { - $attributes .= ' method="post"'; - } - - if (stripos($attributes, 'accept-charset=') === FALSE) - { - $attributes .= ' accept-charset="'.strtolower(config_item('charset')).'"'; - } - - $form = '
    \n"; - - if (is_array($hidden)) - { - foreach ($hidden as $name => $value) - { - $form .= ''."\n"; - } - } - - // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites - if ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method="get"')) - { - // Prepend/append random-length "white noise" around the CSRF - // token input, as a form of protection against BREACH attacks - if (FALSE !== ($noise = $CI->security->get_random_bytes(1))) - { - list(, $noise) = unpack('c', $noise); - } - else - { - $noise = mt_rand(-128, 127); - } - - // Prepend if $noise has a negative value, append if positive, do nothing for zero - $prepend = $append = ''; - if ($noise < 0) - { - $prepend = str_repeat(" ", abs($noise)); - } - elseif ($noise > 0) - { - $append = str_repeat(" ", $noise); - } - - $form .= sprintf( - '%s%s%s', - $prepend, - $CI->security->get_csrf_token_name(), - $CI->security->get_csrf_hash(), - $append, - "\n" - ); - } - - return $form; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_open_multipart')) -{ - /** - * Form Declaration - Multipart type - * - * Creates the opening portion of the form, but with "multipart/form-data". - * - * @param string the URI segments of the form destination - * @param array a key/value pair of attributes - * @param array a key/value pair hidden data - * @return string - */ - function form_open_multipart($action = '', $attributes = array(), $hidden = array()) - { - if (is_string($attributes)) - { - $attributes .= ' enctype="multipart/form-data"'; - } - else - { - $attributes['enctype'] = 'multipart/form-data'; - } - - return form_open($action, $attributes, $hidden); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_hidden')) -{ - /** - * Hidden Input Field - * - * Generates hidden fields. You can pass a simple key/value string or - * an associative array with multiple values. - * - * @param mixed $name Field name - * @param string $value Field value - * @param bool $recursing - * @return string - */ - function form_hidden($name, $value = '', $recursing = FALSE) - { - static $form; - - if ($recursing === FALSE) - { - $form = "\n"; - } - - if (is_array($name)) - { - foreach ($name as $key => $val) - { - form_hidden($key, $val, TRUE); - } - - return $form; - } - - if ( ! is_array($value)) - { - $form .= '\n"; - } - else - { - foreach ($value as $k => $v) - { - $k = is_int($k) ? '' : $k; - form_hidden($name.'['.$k.']', $v, TRUE); - } - } - - return $form; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_input')) -{ - /** - * Text Input Field - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_input($data = '', $value = '', $extra = '') - { - $defaults = array( - 'type' => 'text', - 'name' => is_array($data) ? '' : $data, - 'value' => $value - ); - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_password')) -{ - /** - * Password Field - * - * Identical to the input function but adds the "password" type - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_password($data = '', $value = '', $extra = '') - { - is_array($data) OR $data = array('name' => $data); - $data['type'] = 'password'; - return form_input($data, $value, $extra); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_upload')) -{ - /** - * Upload Field - * - * Identical to the input function but adds the "file" type - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_upload($data = '', $value = '', $extra = '') - { - $defaults = array('type' => 'file', 'name' => ''); - is_array($data) OR $data = array('name' => $data); - $data['type'] = 'file'; - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_textarea')) -{ - /** - * Textarea field - * - * @param mixed $data - * @param string $value - * @param mixed $extra - * @return string - */ - function form_textarea($data = '', $value = '', $extra = '') - { - $defaults = array( - 'name' => is_array($data) ? '' : $data, - 'cols' => '40', - 'rows' => '10' - ); - - if ( ! is_array($data) OR ! isset($data['value'])) - { - $val = $value; - } - else - { - $val = $data['value']; - unset($data['value']); // textareas don't use the value attribute - } - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_multiselect')) -{ - /** - * Multi-select menu - * - * @param string - * @param array - * @param mixed - * @param mixed - * @return string - */ - function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') - { - $extra = _attributes_to_string($extra); - if (stripos($extra, 'multiple') === FALSE) - { - $extra .= ' multiple="multiple"'; - } - - return form_dropdown($name, $options, $selected, $extra); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('form_dropdown')) -{ - /** - * Drop-down Menu - * - * @param mixed $data - * @param mixed $options - * @param mixed $selected - * @param mixed $extra - * @return string - */ - function form_dropdown($data = '', $options = array(), $selected = array(), $extra = '') - { - $defaults = array(); - - if (is_array($data)) - { - if (isset($data['selected'])) - { - $selected = $data['selected']; - unset($data['selected']); // select tags don't have a selected attribute - } - - if (isset($data['options'])) - { - $options = $data['options']; - unset($data['options']); // select tags don't use an options attribute - } - } - else - { - $defaults = array('name' => $data); - } - - is_array($selected) OR $selected = array($selected); - is_array($options) OR $options = array($options); - - // If no selected state was submitted we will attempt to set it automatically - if (empty($selected)) - { - if (is_array($data)) - { - if (isset($data['name'], $_POST[$data['name']])) - { - $selected = array($_POST[$data['name']]); - } - } - elseif (isset($_POST[$data])) - { - $selected = array($_POST[$data]); - } - } - - $extra = _attributes_to_string($extra); - - $multiple = (count($selected) > 1 && stripos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; - - $form = '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_checkbox')) -{ - /** - * Checkbox Field - * - * @param mixed - * @param string - * @param bool - * @param mixed - * @return string - */ - function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') - { - $defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); - - if (is_array($data) && array_key_exists('checked', $data)) - { - $checked = $data['checked']; - - if ($checked == FALSE) - { - unset($data['checked']); - } - else - { - $data['checked'] = 'checked'; - } - } - - if ($checked == TRUE) - { - $defaults['checked'] = 'checked'; - } - else - { - unset($defaults['checked']); - } - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_radio')) -{ - /** - * Radio Button - * - * @param mixed - * @param string - * @param bool - * @param mixed - * @return string - */ - function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') - { - is_array($data) OR $data = array('name' => $data); - $data['type'] = 'radio'; - - return form_checkbox($data, $value, $checked, $extra); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_submit')) -{ - /** - * Submit Button - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_submit($data = '', $value = '', $extra = '') - { - $defaults = array( - 'type' => 'submit', - 'name' => is_array($data) ? '' : $data, - 'value' => $value - ); - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_reset')) -{ - /** - * Reset Button - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_reset($data = '', $value = '', $extra = '') - { - $defaults = array( - 'type' => 'reset', - 'name' => is_array($data) ? '' : $data, - 'value' => $value - ); - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_button')) -{ - /** - * Form Button - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_button($data = '', $content = '', $extra = '') - { - $defaults = array( - 'name' => is_array($data) ? '' : $data, - 'type' => 'button' - ); - - if (is_array($data) && isset($data['content'])) - { - $content = $data['content']; - unset($data['content']); // content is not an attribute - } - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_label')) -{ - /** - * Form Label Tag - * - * @param string The text to appear onscreen - * @param string The id the label applies to - * @param mixed Additional attributes - * @return string - */ - function form_label($label_text = '', $id = '', $attributes = array()) - { - - $label = ''.$label_text.''; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_fieldset')) -{ - /** - * Fieldset Tag - * - * Used to produce
    text. To close fieldset - * use form_fieldset_close() - * - * @param string The legend text - * @param array Additional attributes - * @return string - */ - function form_fieldset($legend_text = '', $attributes = array()) - { - $fieldset = '\n"; - if ($legend_text !== '') - { - return $fieldset.''.$legend_text."\n"; - } - - return $fieldset; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_fieldset_close')) -{ - /** - * Fieldset Close Tag - * - * @param string - * @return string - */ - function form_fieldset_close($extra = '') - { - return '
    '.$extra; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_close')) -{ - /** - * Form Close Tag - * - * @param string - * @return string - */ - function form_close($extra = '') - { - return ''.$extra; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_prep')) -{ - /** - * Form Prep - * - * Formats text so that it can be safely placed in a form field in the event it has HTML tags. - * - * @deprecated 3.0.0 An alias for html_escape() - * @param string|string[] $str Value to escape - * @return string|string[] Escaped values - */ - function form_prep($str) - { - return html_escape($str, TRUE); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('set_value')) -{ - /** - * Form Value - * - * Grabs a value from the POST array for the specified field so you can - * re-populate an input field or textarea. If Form Validation - * is active it retrieves the info from the validation class - * - * @param string $field Field name - * @param string $default Default value - * @param bool $html_escape Whether to escape HTML special characters or not - * @return string - */ - function set_value($field, $default = '', $html_escape = TRUE) - { - $CI =& get_instance(); - - $value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field)) - ? $CI->form_validation->set_value($field, $default) - : $CI->input->post($field, FALSE); - - isset($value) OR $value = $default; - return ($html_escape) ? html_escape($value) : $value; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('set_select')) -{ - /** - * Set Select - * - * Let's you set the selected value of a ",textarea:"",email:"",select:"",checkbox:"
    ",date:"",time:"",number:"",password:""}},o={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body"},p={};p.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback.call(this):!0},p.dialog(a)},p.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,!1)},a.buttons.confirm.callback=function(){return a.callback.call(this,!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return p.dialog(a)},p.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"textarea":case"email":case"select":case"date":case"time":case"number":case"password":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback.call(this,c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"textarea":case"email":case"date":case"time":case"number":case"password":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!b.isArray(k))throw new Error("Please pass an array of input options");if(!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("").attr("label",d.group)),e=o[d.group]),e.append("")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var q=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("
    "),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(q,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),a.pattern&&h.attr("pattern",a.pattern),a.maxlength&&h.attr("maxlength",a.maxlength),f.append(h),f.on("submit",function(a){a.preventDefault(),a.stopPropagation(),e.find(".btn-primary").click()}),e=p.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},p.dialog=function(a){a=h(a);var d=b(n.dialog),f=d.find(".modal-dialog"),i=d.find(".modal-body"),j=a.buttons,k="",l={onEscape:a.onEscape};if(b.fn.modal===c)throw new Error("$.fn.modal is not defined; please double check you have included the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ for more details.");if(g(j,function(a,b){k+="",l[a]=b.callback}),i.find(".bootbox-body").html(a.message),a.animate===!0&&d.addClass("fade"),a.className&&d.addClass(a.className),"large"===a.size?f.addClass("modal-lg"):"small"===a.size&&f.addClass("modal-sm"),a.title&&i.before(n.header),a.closeButton){var m=b(n.closeButton);a.title?d.find(".modal-header").prepend(m):m.css("margin-top","-10px").prependTo(i)}return a.title&&d.find(".modal-title").html(a.title),k.length&&(i.after(n.footer),d.find(".modal-footer").html(k)),d.on("hidden.bs.modal",function(a){a.target===this&&d.remove()}),d.on("shown.bs.modal",function(){d.find(".btn-primary:first").focus()}),"static"!==a.backdrop&&d.on("click.dismiss.bs.modal",function(a){d.children(".modal-backdrop").length&&(a.currentTarget=d.children(".modal-backdrop").get(0)),a.target===a.currentTarget&&d.trigger("escape.close.bb")}),d.on("escape.close.bb",function(a){l.onEscape&&e(a,d,l.onEscape)}),d.on("click",".modal-footer button",function(a){var c=b(this).data("bb-handler");e(a,d,l[c])}),d.on("click",".bootbox-close-button",function(a){e(a,d,l.onEscape)}),d.on("keyup",function(a){27===a.which&&d.trigger("escape.close.bb")}),b(a.container).append(d),d.modal({backdrop:a.backdrop?"static":!1,keyboard:!1,show:!1}),a.show&&d.modal("show"),d},p.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(o,a)},p.hideAll=function(){return b(".bootbox").modal("hide"),p};var q={bg_BG:{OK:"Ок",CANCEL:"Отказ",CONFIRM:"Потвърждавам"},br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},cs:{OK:"OK",CANCEL:"Zrušit",CONFIRM:"Potvrdit"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},el:{OK:"Εντάξει",CANCEL:"Ακύρωση",CONFIRM:"Επιβεβαίωση"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},et:{OK:"OK",CANCEL:"Katkesta",CONFIRM:"OK"},fa:{OK:"قبول",CANCEL:"لغو",CONFIRM:"تایید"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},he:{OK:"אישור",CANCEL:"ביטול",CONFIRM:"אישור"},hu:{OK:"OK",CANCEL:"Mégsem",CONFIRM:"Megerősít"},hr:{OK:"OK",CANCEL:"Odustani",CONFIRM:"Potvrdi"},id:{OK:"OK",CANCEL:"Batal",CONFIRM:"OK"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},ja:{OK:"OK",CANCEL:"キャンセル",CONFIRM:"確認"},lt:{OK:"Gerai",CANCEL:"Atšaukti",CONFIRM:"Patvirtinti"},lv:{OK:"Labi",CANCEL:"Atcelt",CONFIRM:"Apstiprināt"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},pt:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Confirmar"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},sq:{OK:"OK",CANCEL:"Anulo",CONFIRM:"Prano"},sv:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},th:{OK:"ตกลง",CANCEL:"ยกเลิก",CONFIRM:"ยืนยัน"},tr:{OK:"Tamam",CANCEL:"İptal",CONFIRM:"Onayla"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return p.addLocale=function(a,c){return b.each(["OK","CANCEL","CONFIRM"],function(a,b){if(!c[b])throw new Error("Please supply a translation for '"+b+"'")}),q[a]={OK:c.OK,CANCEL:c.CANCEL,CONFIRM:c.CONFIRM},p},p.removeLocale=function(a){return delete q[a],p},p.setLocale=function(a){return p.setDefaults("locale",a)},p.init=function(c){return a(c||b)},p}); \ No newline at end of file diff --git a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/css/colorpicker.css b/finecms/statics/admin/global/plugins/bootstrap-colorpicker/css/colorpicker.css deleted file mode 100644 index 25c32a1..0000000 --- a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/css/colorpicker.css +++ /dev/null @@ -1,127 +0,0 @@ -/*! -* Colorpicker for Bootstrap -* -* Copyright 2012 Stefan Petre -* Licensed under the Apache License v2.0 -* http://www.apache.org/licenses/LICENSE-2.0 -* -*/ -.colorpicker-saturation { - width: 100px; - height: 100px; - background-image: url(../img/saturation.png); - cursor: crosshair; - float: left; -} -.colorpicker-saturation i { - display: block; - height: 5px; - width: 5px; - border: 1px solid #000; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - position: absolute; - top: 0; - left: 0; - margin: -4px 0 0 -4px; -} -.colorpicker-saturation i b { - display: block; - height: 5px; - width: 5px; - border: 1px solid #fff; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.colorpicker-hue, .colorpicker-alpha { - width: 15px; - height: 100px; - float: left; - cursor: row-resize; - margin-left: 4px; - margin-bottom: 4px; -} -.colorpicker-hue i, .colorpicker-alpha i { - display: block; - height: 1px; - background: #000; - border-top: 1px solid #fff; - position: absolute; - top: 0; - left: 0; - width: 100%; - margin-top: -1px; -} -.colorpicker-hue { - background-image: url(../img/hue.png); -} -.colorpicker-alpha { - background-image: url(../img/alpha.png); - display: none; -} -.colorpicker { - *zoom: 1; - top: 0; - left: 0; - padding: 4px; - min-width: 120px; - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.colorpicker:before, .colorpicker:after { - display: table; - content: ""; -} -.colorpicker:after { - clear: both; -} -.colorpicker:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 6px; -} -.colorpicker:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 7px; -} -.colorpicker div { - position: relative; -} -.colorpicker.alpha { - min-width: 140px; -} -.colorpicker.alpha .colorpicker-alpha { - display: block; -} -.colorpicker-color { - height: 10px; - margin-top: 5px; - clear: both; - background-image: url(../img/alpha.png); - background-position: 0 100%; -} -.colorpicker-color div { - height: 10px; -} -.input-append.color .add-on i, .input-prepend.color .add-on i { - display: block; - cursor: pointer; - width: 16px; - height: 16px; -} \ No newline at end of file diff --git a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/alpha.png b/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/alpha.png deleted file mode 100644 index 38043f1..0000000 Binary files a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/alpha.png and /dev/null differ diff --git a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/hue.png b/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/hue.png deleted file mode 100644 index d89560e..0000000 Binary files a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/hue.png and /dev/null differ diff --git a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/saturation.png b/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/saturation.png deleted file mode 100644 index 594ae50..0000000 Binary files a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/img/saturation.png and /dev/null differ diff --git a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.js b/finecms/statics/admin/global/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.js deleted file mode 100644 index 40a7744..0000000 --- a/finecms/statics/admin/global/plugins/bootstrap-colorpicker/js/bootstrap-colorpicker.js +++ /dev/null @@ -1,540 +0,0 @@ -/* ========================================================= - * bootstrap-colorpicker.js - * http://www.eyecon.ro/bootstrap-colorpicker - * ========================================================= - * Copyright 2012 Stefan Petre - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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. - * ========================================================= */ - -!function( $ ) { - - // Color object - - var Color = function(val) { - this.value = { - h: 1, - s: 1, - b: 1, - a: 1 - }; - this.setColor(val); - }; - - Color.prototype = { - constructor: Color, - - //parse a string to HSB - setColor: function(val){ - val = val.toLowerCase(); - var that = this; - $.each( CPGlobal.stringParsers, function( i, parser ) { - var match = parser.re.exec( val ), - values = match && parser.parse( match ), - space = parser.space||'rgba'; - if ( values ) { - if (space === 'hsla') { - that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values)); - } else { - that.value = CPGlobal.RGBtoHSB.apply(null, values); - } - return false; - } - }); - }, - - setHue: function(h) { - this.value.h = 1- h; - }, - - setSaturation: function(s) { - this.value.s = s; - }, - - setLightness: function(b) { - this.value.b = 1- b; - }, - - setAlpha: function(a) { - this.value.a = parseInt((1 - a)*100, 10)/100; - }, - - // HSBtoRGB from RaphaelJS - // https://github.com/DmitryBaranovskiy/raphael/ - toRGB: function(h, s, b, a) { - if (!h) { - h = this.value.h; - s = this.value.s; - b = this.value.b; - } - h *= 360; - var R, G, B, X, C; - h = (h % 360) / 60; - C = b * s; - X = C * (1 - Math.abs(h % 2 - 1)); - R = G = B = b - C; - - h = ~~h; - R += [C, X, 0, 0, X, C][h]; - G += [X, C, C, X, 0, 0][h]; - B += [0, 0, X, C, C, X][h]; - return { - r: Math.round(R*255), - g: Math.round(G*255), - b: Math.round(B*255), - a: a||this.value.a - }; - }, - - toHex: function(h, s, b, a){ - var rgb = this.toRGB(h, s, b, a); - return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); - }, - - toHSL: function(h, s, b, a){ - if (!h) { - h = this.value.h; - s = this.value.s; - b = this.value.b; - } - var H = h, - L = (2 - s) * b, - S = s * b; - if (L > 0 && L <= 1) { - S /= L; - } else { - S /= 2 - L; - } - L /= 2; - if (S > 1) { - S = 1; - } - return { - h: H, - s: S, - l: L, - a: a||this.value.a - }; - } - }; - - // Picker object - - var Colorpicker = function(element, options){ - this.element = $(element); - var format = options.format||this.element.data('color-format')||'hex'; - this.format = CPGlobal.translateFormats[format]; - this.isInput = this.element.is('input'); - this.component = this.element.is('.color') ? this.element.find('.input-group-btn') : false; // modified by keenthemes for Bootstrap 3.0 support - - this.picker = $(CPGlobal.template) - .appendTo('body') - .on('mousedown', $.proxy(this.mousedown, this)); - - if (this.isInput) { - this.element.on({ - 'focus': $.proxy(this.show, this), - 'keyup': $.proxy(this.update, this) - }); - } else if (this.component){ - this.component.on({ - 'click': $.proxy(this.show, this) - }); - } else { - this.element.on({ - 'click': $.proxy(this.show, this) - }); - } - if (format === 'rgba' || format === 'hsla') { - this.picker.addClass('alpha'); - this.alpha = this.picker.find('.colorpicker-alpha')[0].style; - } - - if (this.component){ - this.picker.find('.colorpicker-color').hide(); - this.preview = this.element.find('i')[0].style; - } else { - this.preview = this.picker.find('div:last')[0].style; - } - - this.base = this.picker.find('div:first')[0].style; - this.update(); - }; - - Colorpicker.prototype = { - constructor: Colorpicker, - - show: function(e) { - this.picker.show(); - this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); - this.place(); - $(window).on('resize', $.proxy(this.place, this)); - if (!this.isInput) { - if (e) { - e.stopPropagation(); - e.preventDefault(); - } - } - $(document).on({ - 'mousedown': $.proxy(this.hide, this) - }); - this.element.trigger({ - type: 'show', - color: this.color - }); - }, - - update: function(){ - this.color = new Color(this.isInput ? this.element.prop('value') : this.element.data('color')); - this.picker.find('i') - .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end() - .eq(1).css('top', 100 * (1 - this.color.value.h)).end() - .eq(2).css('top', 100 * (1 - this.color.value.a)); - this.previewColor(); - }, - - setValue: function(newColor) { - this.color = new Color(newColor); - this.picker.find('i') - .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end() - .eq(1).css('top', 100 * (1 - this.color.value.h)).end() - .eq(2).css('top', 100 * (1 - this.color.value.a)); - this.previewColor(); - this.element.trigger({ - type: 'changeColor', - color: this.color - }); - }, - - hide: function(){ - this.picker.hide(); - $(window).off('resize', this.place); - if (!this.isInput) { - $(document).off({ - 'mousedown': this.hide - }); - if (this.component){ - this.element.find('input').prop('value', this.format.call(this)); - } - this.element.data('color', this.format.call(this)); - } else { - this.element.prop('value', this.format.call(this)); - } - this.element.trigger({ - type: 'hide', - color: this.color - }); - }, - - place: function(){ - var offset = this.component ? this.component.offset() : this.element.offset(); - this.picker.css({ - top: offset.top + this.height, - left: offset.left - }); - }, - - //preview color change - previewColor: function(){ - try { - this.preview.backgroundColor = this.format.call(this); - } catch(e) { - this.preview.backgroundColor = this.color.toHex(); - } - //set the color for brightness/saturation slider - this.base.backgroundColor = this.color.toHex(this.color.value.h, 1, 1, 1); - //set te color for alpha slider - if (this.alpha) { - this.alpha.backgroundColor = this.color.toHex(); - } - }, - - pointer: null, - - slider: null, - - mousedown: function(e){ - e.stopPropagation(); - e.preventDefault(); - - var target = $(e.target); - - //detect the slider and set the limits and callbacks - var zone = target.closest('div'); - if (!zone.is('.colorpicker')) { - if (zone.is('.colorpicker-saturation')) { - this.slider = $.extend({}, CPGlobal.sliders.saturation); - } - else if (zone.is('.colorpicker-hue')) { - this.slider = $.extend({}, CPGlobal.sliders.hue); - } - else if (zone.is('.colorpicker-alpha')) { - this.slider = $.extend({}, CPGlobal.sliders.alpha); - } else { - return false; - } - var offset = zone.offset(); - //reference to knob's style - this.slider.knob = zone.find('i')[0].style; - this.slider.left = e.pageX - offset.left; - this.slider.top = e.pageY - offset.top; - this.pointer = { - left: e.pageX, - top: e.pageY - }; - //trigger mousemove to move the knob to the current position - $(document).on({ - mousemove: $.proxy(this.mousemove, this), - mouseup: $.proxy(this.mouseup, this) - }).trigger('mousemove'); - } - return false; - }, - - mousemove: function(e){ - e.stopPropagation(); - e.preventDefault(); - var left = Math.max( - 0, - Math.min( - this.slider.maxLeft, - this.slider.left + ((e.pageX||this.pointer.left) - this.pointer.left) - ) - ); - var top = Math.max( - 0, - Math.min( - this.slider.maxTop, - this.slider.top + ((e.pageY||this.pointer.top) - this.pointer.top) - ) - ); - this.slider.knob.left = left + 'px'; - this.slider.knob.top = top + 'px'; - if (this.slider.callLeft) { - this.color[this.slider.callLeft].call(this.color, left/100); - } - if (this.slider.callTop) { - this.color[this.slider.callTop].call(this.color, top/100); - } - this.previewColor(); - this.element.trigger({ - type: 'changeColor', - color: this.color - }); - return false; - }, - - mouseup: function(e){ - e.stopPropagation(); - e.preventDefault(); - $(document).off({ - mousemove: this.mousemove, - mouseup: this.mouseup - }); - return false; - } - } - - $.fn.colorpicker = function ( option, val ) { - return this.each(function () { - var $this = $(this), - data = $this.data('colorpicker'), - options = typeof option === 'object' && option; - if (!data) { - $this.data('colorpicker', (data = new Colorpicker(this, $.extend({}, $.fn.colorpicker.defaults,options)))); - } - if (typeof option === 'string') data[option](val); - }); - }; - - $.fn.colorpicker.defaults = { - }; - - $.fn.colorpicker.Constructor = Colorpicker; - - var CPGlobal = { - - // translate a format from Color object to a string - translateFormats: { - 'rgb': function(){ - var rgb = this.color.toRGB(); - return 'rgb('+rgb.r+','+rgb.g+','+rgb.b+')'; - }, - - 'rgba': function(){ - var rgb = this.color.toRGB(); - return 'rgba('+rgb.r+','+rgb.g+','+rgb.b+','+rgb.a+')'; - }, - - 'hsl': function(){ - var hsl = this.color.toHSL(); - return 'hsl('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%)'; - }, - - 'hsla': function(){ - var hsl = this.color.toHSL(); - return 'hsla('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%,'+hsl.a+')'; - }, - - 'hex': function(){ - return this.color.toHex(); - } - }, - - sliders: { - saturation: { - maxLeft: 100, - maxTop: 100, - callLeft: 'setSaturation', - callTop: 'setLightness' - }, - - hue: { - maxLeft: 0, - maxTop: 100, - callLeft: false, - callTop: 'setHue' - }, - - alpha: { - maxLeft: 0, - maxTop: 100, - callLeft: false, - callTop: 'setAlpha' - } - }, - - // HSBtoRGB from RaphaelJS - // https://github.com/DmitryBaranovskiy/raphael/ - RGBtoHSB: function (r, g, b, a){ - r /= 255; - g /= 255; - b /= 255; - - var H, S, V, C; - V = Math.max(r, g, b); - C = V - Math.min(r, g, b); - H = (C === 0 ? null : - V == r ? (g - b) / C : - V == g ? (b - r) / C + 2 : - (r - g) / C + 4 - ); - H = ((H + 360) % 6) * 60 / 360; - S = C === 0 ? 0 : C / V; - return {h: H||1, s: S, b: V, a: a||1}; - }, - - HueToRGB: function (p, q, h) { - if (h < 0) - h += 1; - else if (h > 1) - h -= 1; - - if ((h * 6) < 1) - return p + (q - p) * h * 6; - else if ((h * 2) < 1) - return q; - else if ((h * 3) < 2) - return p + (q - p) * ((2 / 3) - h) * 6; - else - return p; - }, - - HSLtoRGB: function (h, s, l, a) - { - if (s < 0) { - s = 0; - } - var q; - if (l <= 0.5) { - q = l * (1 + s); - } else { - q = l + s - (l * s); - } - - var p = 2 * l - q; - - var tr = h + (1 / 3); - var tg = h; - var tb = h - (1 / 3); - - var r = Math.round(CPGlobal.HueToRGB(p, q, tr) * 255); - var g = Math.round(CPGlobal.HueToRGB(p, q, tg) * 255); - var b = Math.round(CPGlobal.HueToRGB(p, q, tb) * 255); - return [r, g, b, a||1]; - }, - - // a set of RE's that can match strings and generate color tuples. - // from John Resig color plugin - // https://github.com/jquery/jquery-color/ - stringParsers: [ - { - re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, - parse: function( execResult ) { - return [ - execResult[ 1 ], - execResult[ 2 ], - execResult[ 3 ], - execResult[ 4 ] - ]; - } - }, { - re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, - parse: function( execResult ) { - return [ - 2.55 * execResult[1], - 2.55 * execResult[2], - 2.55 * execResult[3], - execResult[ 4 ] - ]; - } - }, { - re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, - parse: function( execResult ) { - return [ - parseInt( execResult[ 1 ], 16 ), - parseInt( execResult[ 2 ], 16 ), - parseInt( execResult[ 3 ], 16 ) - ]; - } - }, { - re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, - parse: function( execResult ) { - return [ - parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), - parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), - parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) - ]; - } - }, { - re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, - space: 'hsla', - parse: function( execResult ) { - return [ - execResult[1]/360, - execResult[2] / 100, - execResult[3] / 100, - execResult[4] - ]; - } - } - ], - template: '