From 264866ab93db525672267b5ff6ddf059f07a54df Mon Sep 17 00:00:00 2001 From: thisgun Date: Thu, 17 Jul 2014 14:21:37 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=8A=A4=EB=A7=88=ED=8A=B8=EC=97=90?= =?UTF-8?q?=EB=94=94=ED=84=B02=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/autosave.js | 6 + plugin/editor/smarteditor2/SmartEditor2.html | 74 + .../editor/smarteditor2/SmartEditor2Skin.html | 797 + plugin/editor/smarteditor2/config.js | 29 + .../editor/smarteditor2/css/smart_editor2.css | 336 + .../smarteditor2/css/smart_editor2_in.css | 34 + .../smarteditor2/css/smart_editor2_items.css | 894 + .../smarteditor2/css/smart_editor2_out.css | 20 + plugin/editor/smarteditor2/editor.lib.php | 67 + plugin/editor/smarteditor2/img/bg_b1.png | Bin 0 -> 115 bytes plugin/editor/smarteditor2/img/bg_button.gif | Bin 0 -> 526 bytes .../smarteditor2/img/bg_button_left.gif | Bin 0 -> 331 bytes .../smarteditor2/img/bg_button_right.gif | Bin 0 -> 1240 bytes plugin/editor/smarteditor2/img/bg_find_h3.gif | Bin 0 -> 159 bytes plugin/editor/smarteditor2/img/bg_help.gif | Bin 0 -> 2360 bytes .../editor/smarteditor2/img/bg_icon_tool.gif | Bin 0 -> 103 bytes plugin/editor/smarteditor2/img/bg_line1.gif | Bin 0 -> 43 bytes plugin/editor/smarteditor2/img/bg_quote2.gif | Bin 0 -> 56 bytes plugin/editor/smarteditor2/img/bg_set.gif | Bin 0 -> 941 bytes .../editor/smarteditor2/img/bg_text_tool.gif | Bin 0 -> 1123 bytes plugin/editor/smarteditor2/img/bg_tool2.gif | Bin 0 -> 104 bytes .../smarteditor2/img/editor_guideline_698.gif | Bin 0 -> 139 bytes .../smarteditor2/img/editor_guideline_890.gif | Bin 0 -> 155 bytes plugin/editor/smarteditor2/img/ico_extend.png | Bin 0 -> 270 bytes plugin/editor/smarteditor2/img/icon_set.gif | Bin 0 -> 4611 bytes .../editor/smarteditor2/img/ko_KR/btn_set.png | Bin 0 -> 1469116 bytes .../smarteditor2/img/ko_KR/bx_set_110302.gif | Bin 0 -> 34462 bytes .../smarteditor2/img/ko_KR/text_tool_set.png | Bin 0 -> 11403 bytes .../img/photoQuickPopup/bg_drag_image.png | Bin 0 -> 1227 bytes .../img/photoQuickPopup/btn_cancel.png | Bin 0 -> 718 bytes .../img/photoQuickPopup/btn_confirm.png | Bin 0 -> 553 bytes .../img/photoQuickPopup/btn_confirm2.png | Bin 0 -> 553 bytes .../img/photoQuickPopup/btn_del.png | Bin 0 -> 157 bytes .../img/photoQuickPopup/btn_find.png | Bin 0 -> 506 bytes .../smarteditor2/img/text_tool_set2.png | Bin 0 -> 7271 bytes .../editor/smarteditor2/js/HuskyEZCreator.js | 134 + .../js/SE2B_Configuration_General.js | 52 + .../js/SE2B_Configuration_Service.js | 71 + .../editor/smarteditor2/js/SE2BasicCreator.js | 91 + plugin/editor/smarteditor2/js/jindo.min.js | 1 + .../editor/smarteditor2/js/jindo_component.js | 1 + plugin/editor/smarteditor2/js/smarteditor2.js | 21291 ++++++++++++++++ .../smarteditor2/js/smarteditor2.min.js | 1 + .../plugin/hp_SE2M_AttachQuickPhoto.js | 105 + .../photo_uploader/popup/attach_photo.js | 681 + .../photo_uploader/popup/callback.html | 31 + .../popup/css/jquery.fileupload-noscript.css | 22 + .../css/jquery.fileupload-ui-noscript.css | 17 + .../popup/css/jquery.fileupload-ui.css | 57 + .../popup/css/jquery.fileupload.css | 36 + .../photo_uploader/popup/css/style.css | 99 + .../photo_uploader/popup/file_uploader.php | 43 + .../popup/file_uploader_html5.php | 47 + .../photo_uploader/popup/img/delete.png | Bin 0 -> 850 bytes .../photo_uploader/popup/img/loading.gif | Bin 0 -> 1924 bytes .../photo_uploader/popup/img/progressbar.gif | Bin 0 -> 3323 bytes .../popup/img/system_delete.png | Bin 0 -> 426 bytes .../photo_uploader/popup/index.html | 64 + .../popup/jindo.fileuploader.js | 390 + .../photo_uploader/popup/jindo.min.js | 12686 +++++++++ .../photo_uploader/popup/js/basic.js | 339 + .../popup/js/jquery-1.8.3.min.js | 2 + .../photo_uploader/popup/js/jquery-ui.min.js | 5 + .../popup/js/jquery.fileupload-process.js | 172 + .../popup/js/jquery.fileupload-ui.js | 699 + .../popup/js/jquery.fileupload.js | 1462 ++ .../popup/js/jquery.iframe-transport.js | 214 + .../popup/js/jquery.ui.widget.js | 530 + .../photo_uploader/popup/photo_uploader.html | 100 + .../popup/php/UploadHandler.php | 1392 + .../photo_uploader/popup/php/index.php | 32 + .../swfupload/XPButtonUploadText_61x22.png | Bin 0 -> 1855 bytes .../popup/swfupload/fileprogress.js | 203 + .../popup/swfupload/handlers.js | 378 + .../popup/swfupload/jquery.swfupload.js | 82 + .../popup/swfupload/swfupload.js | 1002 + .../popup/swfupload/swfupload.queue.js | 99 + .../popup/swfupload/swfupload.swf | Bin 0 -> 12787 bytes plugin/editor/smarteditor2/readme.txt | 40 + plugin/editor/smarteditor2/release_notes.txt | 255 + plugin/editor/smarteditor2/sample.php | 33 + plugin/editor/smarteditor2/shortcut.html | 23 + .../smarteditor2/smart_editor2_inputarea.html | 8 + .../smart_editor2_inputarea_ie8.html | 9 + plugin/editor/smarteditor2/src_include.txt | 7 + 85 files changed, 45263 insertions(+) create mode 100644 plugin/editor/smarteditor2/SmartEditor2.html create mode 100644 plugin/editor/smarteditor2/SmartEditor2Skin.html create mode 100644 plugin/editor/smarteditor2/config.js create mode 100644 plugin/editor/smarteditor2/css/smart_editor2.css create mode 100644 plugin/editor/smarteditor2/css/smart_editor2_in.css create mode 100644 plugin/editor/smarteditor2/css/smart_editor2_items.css create mode 100644 plugin/editor/smarteditor2/css/smart_editor2_out.css create mode 100644 plugin/editor/smarteditor2/editor.lib.php create mode 100644 plugin/editor/smarteditor2/img/bg_b1.png create mode 100644 plugin/editor/smarteditor2/img/bg_button.gif create mode 100644 plugin/editor/smarteditor2/img/bg_button_left.gif create mode 100644 plugin/editor/smarteditor2/img/bg_button_right.gif create mode 100644 plugin/editor/smarteditor2/img/bg_find_h3.gif create mode 100644 plugin/editor/smarteditor2/img/bg_help.gif create mode 100644 plugin/editor/smarteditor2/img/bg_icon_tool.gif create mode 100644 plugin/editor/smarteditor2/img/bg_line1.gif create mode 100644 plugin/editor/smarteditor2/img/bg_quote2.gif create mode 100644 plugin/editor/smarteditor2/img/bg_set.gif create mode 100644 plugin/editor/smarteditor2/img/bg_text_tool.gif create mode 100644 plugin/editor/smarteditor2/img/bg_tool2.gif create mode 100644 plugin/editor/smarteditor2/img/editor_guideline_698.gif create mode 100644 plugin/editor/smarteditor2/img/editor_guideline_890.gif create mode 100644 plugin/editor/smarteditor2/img/ico_extend.png create mode 100644 plugin/editor/smarteditor2/img/icon_set.gif create mode 100644 plugin/editor/smarteditor2/img/ko_KR/btn_set.png create mode 100644 plugin/editor/smarteditor2/img/ko_KR/bx_set_110302.gif create mode 100644 plugin/editor/smarteditor2/img/ko_KR/text_tool_set.png create mode 100644 plugin/editor/smarteditor2/img/photoQuickPopup/bg_drag_image.png create mode 100644 plugin/editor/smarteditor2/img/photoQuickPopup/btn_cancel.png create mode 100644 plugin/editor/smarteditor2/img/photoQuickPopup/btn_confirm.png create mode 100644 plugin/editor/smarteditor2/img/photoQuickPopup/btn_confirm2.png create mode 100644 plugin/editor/smarteditor2/img/photoQuickPopup/btn_del.png create mode 100644 plugin/editor/smarteditor2/img/photoQuickPopup/btn_find.png create mode 100644 plugin/editor/smarteditor2/img/text_tool_set2.png create mode 100644 plugin/editor/smarteditor2/js/HuskyEZCreator.js create mode 100644 plugin/editor/smarteditor2/js/SE2B_Configuration_General.js create mode 100644 plugin/editor/smarteditor2/js/SE2B_Configuration_Service.js create mode 100644 plugin/editor/smarteditor2/js/SE2BasicCreator.js create mode 100644 plugin/editor/smarteditor2/js/jindo.min.js create mode 100644 plugin/editor/smarteditor2/js/jindo_component.js create mode 100644 plugin/editor/smarteditor2/js/smarteditor2.js create mode 100644 plugin/editor/smarteditor2/js/smarteditor2.min.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/plugin/hp_SE2M_AttachQuickPhoto.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/attach_photo.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/callback.html create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload-noscript.css create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload-ui-noscript.css create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload-ui.css create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/css/jquery.fileupload.css create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/css/style.css create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/file_uploader.php create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/file_uploader_html5.php create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/img/delete.png create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/img/loading.gif create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/img/progressbar.gif create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/img/system_delete.png create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/index.html create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/jindo.fileuploader.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/jindo.min.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery-1.8.3.min.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery-ui.min.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload-process.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload-ui.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.iframe-transport.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.ui.widget.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/photo_uploader.html create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/php/index.php create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/XPButtonUploadText_61x22.png create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/fileprogress.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/jquery.swfupload.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.queue.js create mode 100644 plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.swf create mode 100644 plugin/editor/smarteditor2/readme.txt create mode 100644 plugin/editor/smarteditor2/release_notes.txt create mode 100644 plugin/editor/smarteditor2/sample.php create mode 100644 plugin/editor/smarteditor2/shortcut.html create mode 100644 plugin/editor/smarteditor2/smart_editor2_inputarea.html create mode 100644 plugin/editor/smarteditor2/smart_editor2_inputarea_ie8.html create mode 100644 plugin/editor/smarteditor2/src_include.txt diff --git a/js/autosave.js b/js/autosave.js index 7c867e1a1..ed24c9335 100644 --- a/js/autosave.js +++ b/js/autosave.js @@ -11,6 +11,8 @@ function autosave() { this.wr_content.value = CKEDITOR.instances.wr_content.getData(); } else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") { this.wr_content.value = ed_wr_content.outputBodyHTML(); + } else if (g5_editor.indexOf("smarteditor2") != -1 && typeof(oEditors.getById['wr_content'])!="undefined" ) { + this.wr_content.value = oEditors.getById['wr_content'].getIR(); } // 변수에 저장해 놓은 값과 다를 경우에만 임시 저장함 if (save_wr_subject != this.wr_subject.value || save_wr_content != this.wr_content.value) { @@ -79,6 +81,10 @@ $(function(){ CKEDITOR.instances.wr_content.setData(content); } else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") { ed_wr_content.putContents(content); + } else if (g5_editor.indexOf("smarteditor2") != -1 && typeof(oEditors.getById['wr_content'])!="undefined" ) { + oEditors.getById["wr_content"].exec("SET_CONTENTS", [""]); + //oEditors.getById["wr_content"].exec("SET_IR", [""]); + oEditors.getById["wr_content"].exec("PASTE_HTML", [content]); } else { $("#fwrite #wr_content").val(content); } diff --git a/plugin/editor/smarteditor2/SmartEditor2.html b/plugin/editor/smarteditor2/SmartEditor2.html new file mode 100644 index 000000000..58f22794e --- /dev/null +++ b/plugin/editor/smarteditor2/SmartEditor2.html @@ -0,0 +1,74 @@ + + + + +네이버 :: Smart Editor 2 ™ + + + +
+ + +

+ + + + +

+
+ + + + + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/SmartEditor2Skin.html b/plugin/editor/smarteditor2/SmartEditor2Skin.html new file mode 100644 index 000000000..03c99f4eb --- /dev/null +++ b/plugin/editor/smarteditor2/SmartEditor2Skin.html @@ -0,0 +1,797 @@ + + + + + + +네이버 :: Smart Editor 2 ™ + + + + + + + + + + + + + + + + + + +
+
글쓰기영역으로 바로가기 +
+ +
+
    +
  • + +
    +
    +
      +
    • + +
    • +
    • +
    • +
    • +
    +
    +
    + +
  • + +
  • + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +
    + +
  • +
    +
  • + +
  • + +
  • + +
  • + +
  • + + + +
  • + +
  • + + + +
  • + +
  • + +
  • +
    +
  • + +
  • + +
  • + +
  • + +
  • + +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +

    직접 입력

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

    + +

    +
    +
    +
    + +
  • + +
  • + + +
    +
    +
    +
    + 칸수 지정 +
    +
    +
    + + +
    +
    +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + +
        
        
        
    +
    +
    + 속성직접입력 +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    +
    +
    + 표스타일 +
    +
    +
    + + + +
    +
    +
    +

    + +

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

    찾기/바꾸기

    +
      +
    • +
    • +
    +
    +
    +
    +
    +

    + +

    +
    + + +
    +
    +
    + + +
  • +
+
    +
  • +
+
+ +
+ + + + + +
+ +
+ + + + + + + + + +
+ + +
+ + +
+ + + + +
+ + +
+ + +
+
+ + +
+ +
    +
  • +
  • +
  • +
+
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/config.js b/plugin/editor/smarteditor2/config.js new file mode 100644 index 000000000..0790864a1 --- /dev/null +++ b/plugin/editor/smarteditor2/config.js @@ -0,0 +1,29 @@ +(function($){ + $(document).ready(function() { + $(".smarteditor2").each( function(index){ + var get_id = $(this).attr("id"); + + if( !get_id || $(this).prop("nodeName") != 'TEXTAREA' ) return true; + + nhn.husky.EZCreator.createInIFrame({ + oAppRef: oEditors, + elPlaceHolder: get_id, + sSkinURI: g5_editor_url+"/SmartEditor2Skin.html", + htParams : { + bUseToolbar : true, // 툴바 사용 여부 (true:사용/ false:사용하지 않음) + bUseVerticalResizer : true, // 입력창 크기 조절바 사용 여부 (true:사용/ false:사용하지 않음) + bUseModeChanger : true, // 모드 탭(Editor | HTML | TEXT) 사용 여부 (true:사용/ false:사용하지 않음) + //aAdditionalFontList : aAdditionalFontSet, // 추가 글꼴 목록 + fOnBeforeUnload : function(){ + //alert("완료!"); + } + }, //boolean + fOnAppLoad : function(){ + //예제 코드 + //oEditors.getById["ir1"].exec("PASTE_HTML", ["로딩이 완료된 후에 본문에 삽입되는 text입니다."]); + }, + fCreator: "createSEditor2" + }); + }); + }); +})(jQuery); \ No newline at end of file diff --git a/plugin/editor/smarteditor2/css/smart_editor2.css b/plugin/editor/smarteditor2/css/smart_editor2.css new file mode 100644 index 000000000..54104fb48 --- /dev/null +++ b/plugin/editor/smarteditor2/css/smart_editor2.css @@ -0,0 +1,336 @@ +@charset "UTF-8"; +/* NHN Web Standardization Team (http://html.nhndesign.com/) HHJ 090226 */ +/* COMMON */ +body, #smart_editor2, #smart_editor2 p, #smart_editor2 h1, #smart_editor2 h2, #smart_editor2 h3, #smart_editor2 h4, #smart_editor2 h5, #smart_editor2 h6, #smart_editor2 ul, #smart_editor2 ol, #smart_editor2 li, #smart_editor2 dl, #smart_editor2 dt, #smart_editor2 dd, #smart_editor2 table, #smart_editor2 th, #smart_editor2 td, #smart_editor2 form, #smart_editor2 fieldset, #smart_editor2 legend, #smart_editor2 input, #smart_editor2 textarea, #smart_editor2 button, #smart_editor2 select { margin: 0; padding: 0; } + +#smart_editor2, #smart_editor2 h1, #smart_editor2 h2, #smart_editor2 h3, #smart_editor2 h4, #smart_editor2 h5, #smart_editor2 h6, #smart_editor2 input, #smart_editor2 textarea, #smart_editor2 select, #smart_editor2 table, #smart_editor2 button { font-family: '돋움',Dotum,Helvetica,sans-serif; font-size: 12px; color: #666; } + +#smart_editor2 span, #smart_editor2 em { font-size: 12px; } + +#smart_editor2 em, #smart_editor2 address { font-style: normal; } + +#smart_editor2 img, #smart_editor2 fieldset { border: 0; } + +#smart_editor2 hr { display: none; } + +#smart_editor2 ol, #smart_editor2 ul { list-style: none; } + +#smart_editor2 button { border: 0; background: none; font-size: 11px; vertical-align: top; cursor: pointer; } + +#smart_editor2 button span, #smart_editor2 button em { visibility: hidden; overflow: hidden; position: absolute; top: 0; font-size: 0; line-height: 0; } + +#smart_editor2 legend, #smart_editor2 .blind { visibility: hidden; overflow: hidden; position: absolute; width: 0; height: 0; font-size: 0; line-height: 0; } + +#smart_editor2 .input_ty1 { height: 14px; margin: 0; padding: 4px 2px 0 4px; border: 1px solid #c7c7c7; font-size: 11px; color: #666; } + +#smart_editor2 a:link, #smart_editor2 a:visited, #smart_editor2 a:active, #smart_editor2 a:focus { color: #666; text-decoration: none; } + +#smart_editor2 a:hover { color: #666; text-decoration: underline; } + +/* LAYOUT */ +#smart_editor2 .se2_header { margin: 10px 0 29px 0; } + +#smart_editor2 .se2_bi { float: left; width: 93px; height: 20px; margin: 0; padding: 0; background: url("../img/ko_KR/btn_set.png?130306") -343px -358px no-repeat; font-size: 0; line-height: 0; text-indent: -10000px; vertical-align: middle; } + +#smart_editor2 .se2_allhelp { display: inline-block; width: 18px; height: 18px; padding: 0; background: url("../img/ko_KR/btn_set.png?130306") -437px -358px no-repeat; font-size: 0; line-height: 0; text-indent: -10000px; vertical-align: middle; } + +#smart_editor2 #smart_editor2_content { border: 1px solid #b5b5b5; } + +#smart_editor2 .se2_tool { overflow: visible; position: relative; z-index: 25; } + +/* EDITINGAREA */ +#smart_editor2 .se2_input_area { position: relative; z-index: 22; height: 400px; margin: 0; padding: 0; *zoom: 1; } + +#smart_editor2 .se2_input_wysiwyg, #smart_editor2 .se2_input_syntax { display: block; overflow: auto; width: 100%; height: 100%; margin: 0; *margin: -1px 0 0 0; border: 0; } + +/* EDITINGMODE */ +#smart_editor2 .se2_conversion_mode { position: relative; height: 15px; padding-top: 1px; border-top: 1px solid #b5b5b5; background: url("../img/icon_set.gif") 0 -896px repeat-x; } + +#smart_editor2 .se2_inputarea_controller { display: block; clear: both; position: relative; width: 100%; height: 15px; text-align: center; cursor: n-resize; } + +#smart_editor2 .se2_inputarea_controller span, #smart_editor2 .controller_on span { background: url("../img/ico_extend.png") no-repeat; } + +#smart_editor2 .se2_inputarea_controller span { position: static; display: inline-block; visibility: visible; overflow: hidden; height: 15px; padding-left: 11px; background-position: 0 2px; color: #888; font-size: 11px; letter-spacing: -1px; line-height: 16px; white-space: nowrap; } + +* + html #smart_editor2 .se2_inputarea_controller span { line-height: 14px; } + +#smart_editor2 .controller_on span { background-position: 0 -21px; color: #249c04; } + +#smart_editor2 .ly_controller { display: block; position: absolute; bottom: 2px; left: 50%; width: 287px; margin-left: -148px; padding: 8px 0 7px 9px; border: 1px solid #827f7c; background: #fffdef; } + +#smart_editor2 .ly_controller p { color: #666; font-size: 11px; letter-spacing: -1px; line-height: 11px; } + +#smart_editor2 .ly_controller .bt_clse, #smart_editor2 .ly_controller .ic_arr { position: absolute; background: url("../img/ico_extend.png") no-repeat; } + +#smart_editor2 .ly_controller .bt_clse { top: 5px; right: 4px; width: 14px; height: 15px; background-position: 1px -43px; } + +#smart_editor2 .ly_controller .ic_arr { top: 25px; left: 50%; width: 10px; height: 6px; margin-left: -5px; background-position: 0 -65px; } + +#smart_editor2 .se2_converter { float: left; position: absolute; top: -1px; right: 3px; z-index: 20; } + +#smart_editor2 .se2_converter li { float: left; } + +#smart_editor2 .se2_converter .se2_to_editor { width: 59px; height: 15px; background: url("../img/ko_KR/btn_set.png?130306") 0 -85px no-repeat; vertical-align: top; } + +#smart_editor2 .se2_converter .se2_to_html { width: 59px; height: 15px; background: url("../img/ko_KR/btn_set.png?130306") -59px -70px no-repeat; vertical-align: top; } + +#smart_editor2 .se2_converter .se2_to_text { width: 60px; height: 15px; background: url("../img/ko_KR/btn_set.png?130306") -417px -466px no-repeat; vertical-align: top; } + +#smart_editor2 .se2_converter .active .se2_to_editor { width: 59px; height: 15px; background: url("../img/ko_KR/btn_set.png?130306") 0 -70px no-repeat; vertical-align: top; } + +#smart_editor2 .se2_converter .active .se2_to_html { width: 59px; height: 15px; background: url("../img/ko_KR/btn_set.png?130306") -59px -85px no-repeat; vertical-align: top; } + +#smart_editor2 .se2_converter .active .se2_to_text { width: 60px; height: 15px; background: url("../img/ko_KR/btn_set.png?130306") -417px -481px no-repeat; vertical-align: top; } + +/* EDITINGAREA_HTMLSRC */ +#smart_editor2 .off .ico_btn, #smart_editor2 .off .se2_more, #smart_editor2 .off .se2_more2, #smart_editor2 .off .se2_font_family, #smart_editor2 .off .se2_font_size, #smart_editor2 .off .se2_bold, #smart_editor2 .off .se2_underline, #smart_editor2 .off .se2_italic, #smart_editor2 .off .se2_tdel, #smart_editor2 .off .se2_fcolor, #smart_editor2 .off .se2_fcolor_more, #smart_editor2 .off .se2_bgcolor, #smart_editor2 .off .se2_bgcolor_more, #smart_editor2 .off .se2_left, #smart_editor2 .off .se2_center, #smart_editor2 .off .se2_right, #smart_editor2 .off .se2_justify, #smart_editor2 .off .se2_ol, #smart_editor2 .off .se2_ul, #smart_editor2 .off .se2_indent, #smart_editor2 .off .se2_outdent, #smart_editor2 .off .se2_lineheight, #smart_editor2 .off .se2_del_style, #smart_editor2 .off .se2_blockquote, #smart_editor2 .off .se2_summary, #smart_editor2 .off .se2_footnote, #smart_editor2 .off .se2_url, #smart_editor2 .off .se2_emoticon, #smart_editor2 .off .se2_character, #smart_editor2 .off .se2_table, #smart_editor2 .off .se2_find, #smart_editor2 .off .se2_spelling, #smart_editor2 .off .se2_sup, #smart_editor2 .off .se2_sub, #smart_editor2 .off .se2_text_tool_more, #smart_editor2 .off .se2_new, #smart_editor2 .off .selected_color, #smart_editor2 .off .se2_lineSticker { -ms-filter: alpha(opacity=50); opacity: .5; cursor: default; filter: alpha(opacity=50); } + +/* LAYER */ +#smart_editor2 .se2_text_tool .se2_layer { display: none; float: left; position: absolute; top: 20px; left: 0; z-index: 50; margin: 0; padding: 0; border: 1px solid #bcbbbb; background: #fafafa; } + +#smart_editor2 .se2_text_tool li.active { z-index: 50; } + +#smart_editor2 .se2_text_tool .active .se2_layer { display: block; } + +#smart_editor2 .se2_text_tool .active li .se2_layer { display: none; } + +#smart_editor2 .se2_text_tool .active .active .se2_layer { display: block; } + +#smart_editor2 .se2_text_tool .se2_layer .se2_in_layer { float: left; margin: 0; padding: 0; border: 1px solid #fff; background: #fafafa; } + +/* TEXT_TOOLBAR */ +#smart_editor2 .se2_text_tool { position: relative; clear: both; z-index: 30; padding: 4px 0 4px 3px; background: #f4f4f4 url("../img/bg_text_tool.gif") 0 0 repeat-x; border-bottom: 1px solid #b5b5b5; *zoom: 1; } + +#smart_editor2 .se2_text_tool:after { content: ""; display: block; clear: both; } + +#smart_editor2 .se2_text_tool ul { float: left; display: inline; margin-right: 3px; padding-left: 1px; white-space: nowrap; } + +#smart_editor2 .se2_text_tool li { _display: inline; float: left; position: relative; z-index: 30; } + +#smart_editor2 .se2_text_tool button, #smart_editor2 .se2_multy .se2_icon { width: 21px; height: 21px; background: url("../img/ko_KR/text_tool_set.png?140317") no-repeat; vertical-align: top; } + +#smart_editor2 .se2_text_tool .se2_font_type { position: relative; } + +#smart_editor2 .se2_text_tool .se2_font_type li { margin-left: 3px; } + +#smart_editor2 .se2_text_tool .se2_font_type button { text-align: left; } + +#smart_editor2 .se2_text_tool .se2_font_type button.se2_font_family span, #smart_editor2 .se2_text_tool .se2_font_type button.se2_font_size span { display: inline-block; visibility: visible; position: static; width: 52px; height: 20px; padding: 0 0 0 6px; font-size: 12px; line-height: 20px; *line-height: 22px; color: #333; *zoom: 1; } + +#smart_editor2 .se2_text_tool .se2_multy { position: absolute; top: 0; right: 0; padding-left: 0; margin-right: 0; white-space: nowrap; border-left: 1px solid #e0dedf; } + +#smart_editor2 .se2_text_tool .se2_multy .se2_mn { float: left; white-space: nowrap; } + +#smart_editor2 .se2_text_tool .se2_multy button { background-image: none; width: 47px; } + +#smart_editor2 .se2_text_tool .se2_multy .se2_icon { display: inline-block; visibility: visible; overflow: visible; position: static; width: 16px; height: 29px; margin: -1px 2px 0 -1px; background-position: 0 -132px; line-height: 30px; vertical-align: top; } + +#smart_editor2 .se2_text_tool .se2_multy button, #smart_editor2 .se2_text_tool .se2_multy button span { height: 29px; line-height: 29px; } + +#smart_editor2 .se2_text_tool .se2_map .se2_icon { background-position: -29px -132px; } + +#smart_editor2 .se2_text_tool button span.se2_mntxt { display: inline-block; visibility: visible; overflow: visible; _overflow-y: hidden; position: relative; *margin-right: -1px; width: auto; height: 29px; font-weight: normal; font-size: 11px; line-height: 30px; *line-height: 29px; _line-height: 30px; color: #444; letter-spacing: -1px; vertical-align: top; } + +#smart_editor2 .se2_text_tool .se2_multy .se2_photo { margin-right: 1px; } + +#smart_editor2 .se2_text_tool .se2_multy .hover .ico_btn { background: #e8e8e8; } + +#smart_editor2 .se2_text_tool .se2_multy .se2_mn.hover { background: #e0dedf; } + +/* TEXT_TOOLBAR : ROUNDING */ +#smart_editor2 ul li.first_child button span.tool_bg, #smart_editor2 ul li.last_child button span.tool_bg, #smart_editor2 ul li.single_child button span.tool_bg { visibility: visible; height: 21px; } + +#smart_editor2 ul li.first_child button span.tool_bg { left: -1px; width: 3px; background: url("../img/bg_button_left.gif?20121228") no-repeat; } + +#smart_editor2 ul li.last_child button span.tool_bg { right: 0px; _right: -1px; width: 2px; background: url("../img/bg_button_right.gif") no-repeat; } + +#smart_editor2 ul li.single_child { padding-right: 1px; } + +#smart_editor2 ul li.single_child button span.tool_bg { left: 0; background: url("../img/bg_button.gif?20121228") no-repeat; width: 22px; } + +#smart_editor2 div.se2_text_tool ul li.hover button span.tool_bg { background-position: 0 -21px; } + +#smart_editor2 div.se2_text_tool ul li.active button span.tool_bg, #smart_editor2 div.se2_text_tool ul li.active li.active button span.tool_bg { background-position: 0 -42px; } + +#smart_editor2 div.se2_text_tool ul li.active li button span.tool_bg { background-position: 0 0; } + +/* TEXT_TOOLBAR : SUB_MENU */ +#smart_editor2 .se2_sub_text_tool { display: none; position: absolute; top: 20px; left: 0; z-index: 40; width: auto; height: 29px; padding: 0 4px 0 0; border: 1px solid #b5b5b5; border-top: 1px solid #9a9a9a; background: #f4f4f4; } + +#smart_editor2 .active .se2_sub_text_tool { display: block; } + +#smart_editor2 .se2_sub_text_tool ul { float: left; height: 25px; margin: 0; padding: 4px 0 0 4px; } + +/* TEXT_TOOLBAR : SUB_MENU_SIZE */ +#smart_editor2 .se2_sub_step1 { width: 88px; } + +#smart_editor2 .se2_sub_step2 { width: 199px; } + +#smart_editor2 .se2_sub_step2_1 { width: 178px; } + +/* TEXT_TOOLBAR : BUTTON */ +#smart_editor2 .se2_text_tool .se2_font_family { width: 70px; height: 21px; background-position: 0 -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_font_family { background-position: 0 -72px; } + +#smart_editor2 .se2_text_tool .active .se2_font_family { background-position: 0 -103px; } + +#smart_editor2 .se2_text_tool .se2_font_size { width: 45px; height: 21px; background-position: -70px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_font_size { background-position: -70px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_font_size { background-position: -70px -103px; } + +#smart_editor2 .se2_text_tool .se2_bold { background-position: -115px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_bold { background-position: -115px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_bold { background-position: -115px -103px; } + +#smart_editor2 .se2_text_tool .se2_underline { background-position: -136px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_underline { background-position: -136px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_underline { background-position: -136px -103px; } + +#smart_editor2 .se2_text_tool .se2_italic { background-position: -157px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_italic { background-position: -157px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_italic { background-position: -157px -103px; } + +#smart_editor2 .se2_text_tool .se2_tdel { background-position: -178px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_tdel { background-position: -178px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_tdel { background-position: -178px -103px; } + +#smart_editor2 .se2_text_tool .se2_fcolor { position: relative; background-position: -199px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_fcolor { background-position: -199px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_fcolor { background-position: -199px -103px; } + +#smart_editor2 .se2_text_tool .se2_fcolor_more { background-position: -220px -10px; width: 10px; } + +#smart_editor2 .se2_text_tool .hover .se2_fcolor_more { background-position: -220px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_fcolor_more { background-position: -220px -103px; } + +#smart_editor2 .se2_text_tool .selected_color { position: absolute; top: 14px; left: 5px; width: 11px; height: 3px; font-size: 0; } + +#smart_editor2 .se2_text_tool .se2_ol, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .se2_ol { background-position: -345px -10px; } + +#smart_editor2 .se2_text_tool .se2_ul, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .se2_ul { background-position: -366px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_ol, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .hover .se2_ol { background-position: -345px -72px; } + +#smart_editor2 .se2_text_tool .hover .se2_ul, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .hover .se2_ul { background-position: -366px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_ol, #smart_editor2 .se2_text_tool .active .active .se2_ol { background-position: -345px -103px; } + +#smart_editor2 .se2_text_tool .active .se2_ul, #smart_editor2 .se2_text_tool .active .active .se2_ul { background-position: -366px -103px; } + +#smart_editor2 .se2_text_tool .se2_indent, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .se2_indent { background-position: -408px -10px; } + +#smart_editor2 .se2_text_tool .se2_outdent, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .se2_outdent { background-position: -387px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_indent, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .hover .se2_indent { background-position: -408px -72px; } + +#smart_editor2 .se2_text_tool .hover .se2_outdent, #smart_editor2 .se2_text_tool .active .se2_sub_text_tool .hover .se2_outdent { background-position: -387px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_indent, #smart_editor2 .se2_text_tool .active .active .se2_indent { background-position: -408px -103px; } + +#smart_editor2 .se2_text_tool .active .se2_outdent, #smart_editor2 .se2_text_tool .active .active .se2_outdent { background-position: -387px -103px; } + +#smart_editor2 .se2_text_tool .se2_lineheight { background-position: -429px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_lineheight { background-position: -429px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_lineheight { background-position: -429px -103px; } + +#smart_editor2 .se2_text_tool .se2_url { background-position: -513px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_url { background-position: -513px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_url { background-position: -513px -103px; } + +#smart_editor2 .se2_text_tool .se2_bgcolor { position: relative; background-position: -230px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_bgcolor { background-position: -230px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_bgcolor { background-position: -230px -103px; } + +#smart_editor2 .se2_text_tool .se2_bgcolor_more { background-position: -251px -10px; width: 10px; } + +#smart_editor2 .se2_text_tool .hover .se2_bgcolor_more { background-position: -251px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_bgcolor_more { background-position: -251px -103px; } + +#smart_editor2 .se2_text_tool .se2_left { background-position: -261px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_left { background-position: -261px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_left { background-position: -261px -103px; } + +#smart_editor2 .se2_text_tool .se2_center { background-position: -282px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_center { background-position: -282px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_center { background-position: -282px -103px; } + +#smart_editor2 .se2_text_tool .se2_right { background-position: -303px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_right { background-position: -303px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_right { background-position: -303px -103px; } + +#smart_editor2 .se2_text_tool .se2_justify { background-position: -324px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_justify { background-position: -324px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_justify { background-position: -324px -103px; } + +#smart_editor2 .se2_text_tool .se2_blockquote { background-position: -471px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_blockquote { background-position: -471px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_blockquote { background-position: -471px -103px; } + +#smart_editor2 .se2_text_tool .se2_character { background-position: -555px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_character { background-position: -555px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_character { background-position: -555px -103px; } + +#smart_editor2 .se2_text_tool .se2_table { background-position: -576px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_table { background-position: -576px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_table { background-position: -576px -103px; } + +#smart_editor2 .se2_text_tool .se2_find { background-position: -597px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_find { background-position: -597px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_find { background-position: -597px -103px; } + +#smart_editor2 .se2_text_tool .se2_sup { background-position: -660px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_sup { background-position: -660px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_sup { background-position: -660px -103px; } + +#smart_editor2 .se2_text_tool .se2_sub { background-position: -681px -10px; } + +#smart_editor2 .se2_text_tool .hover .se2_sub { background-position: -681px -72px; } + +#smart_editor2 .se2_text_tool .active .se2_sub { background-position: -681px -103px; } + +#smart_editor2 .se2_text_tool .se2_text_tool_more { background-position: 0 -41px; width: 13px; } + +#smart_editor2 .se2_text_tool .se2_text_tool_more span.tool_bg { background: none; } + +#smart_editor2 .se2_text_tool .hover .se2_text_tool_more { background-position: -13px -41px; } + +#smart_editor2 .se2_text_tool .active .se2_text_tool_more { background-position: -26px -41px; } diff --git a/plugin/editor/smarteditor2/css/smart_editor2_in.css b/plugin/editor/smarteditor2/css/smart_editor2_in.css new file mode 100644 index 000000000..9d8fd4a43 --- /dev/null +++ b/plugin/editor/smarteditor2/css/smart_editor2_in.css @@ -0,0 +1,34 @@ +@charset "UTF-8"; +/* NHN Web Standardization Team (http://html.nhndesign.com/) HHJ 090226 */ +/* COMMON */ +body, .se2_inputarea { margin: 0; padding: 0; font-family: '돋움',Dotum,Helvetica,Sans-serif; font-size: 12px; line-height: 1.5; } + +/* body,.se2_inputarea,.se2_inputarea th,.se2_inputarea td{margin:0;padding:0;font-family:'돋움',Dotum,Helvetica,Sans-serif;font-size:12px;line-height:1.5;color:#666} */ +.se2_inputarea p, .se2_inputarea br { margin: 0; padding: 0; } + +.se2_inputarea { margin: 15px; word-wrap: break-word; *word-wrap: normal; *word-break: break-all; } + +.se2_inputarea_890 { width: 741px; margin: 20px 0 10px 64px; } + +.se2_inputarea_698 { width: 548px; margin: 20px 0 10px 64px; } + +/* TEXT_TOOLBAR : QUOTE */ +.se2_quote1 { margin: 0 0 30px 20px; padding: 0 8px; border-left: 2px solid #ccc; color: #888; } + +.se2_quote2 { margin: 0 0 30px 13px; padding: 0 8px 0 16px; background: url("../img/bg_quote2.gif") 0 3px no-repeat; color: #888; } + +.se2_quote3 { margin: 0 0 30px; padding: 12px 10px 11px; border: 1px dashed #ccc; color: #888; } + +.se2_quote4 { margin: 0 0 30px; padding: 12px 10px 11px; border: 1px dashed #66b246; color: #888; } + +.se2_quote5 { margin: 0 0 30px; padding: 12px 10px 11px; border: 1px dashed #ccc; background: #fafafa; color: #888; } + +.se2_quote6 { margin: 0 0 30px; padding: 12px 10px 11px; border: 1px solid #e5e5e5; color: #888; } + +.se2_quote7 { margin: 0 0 30px; padding: 12px 10px 11px; border: 1px solid #66b246; color: #888; } + +.se2_quote8 { margin: 0 0 30px; padding: 12px 10px 11px; border: 1px solid #e5e5e5; background: #fafafa; color: #888; } + +.se2_quote9 { margin: 0 0 30px; padding: 12px 10px 11px; border: 2px solid #e5e5e5; color: #888; } + +.se2_quote10 { margin: 0 0 30px; padding: 12px 10px 11px; border: 2px solid #e5e5e5; background: #fafafa; color: #888; } diff --git a/plugin/editor/smarteditor2/css/smart_editor2_items.css b/plugin/editor/smarteditor2/css/smart_editor2_items.css new file mode 100644 index 000000000..320bbb244 --- /dev/null +++ b/plugin/editor/smarteditor2/css/smart_editor2_items.css @@ -0,0 +1,894 @@ +@charset "UTF-8"; +/* NHN Web Standardization Team (http://html.nhndesign.com/) HHJ 090226 */ +/* TEXT_TOOLBAR : FONTNAME */ +#smart_editor2 .se2_tool .se2_l_font_fam { width: 202px; margin: 0; padding: 0; } + +#smart_editor2 .se2_tool .se2_l_font_fam li { display: block; width: 202px; height: 21px; margin: 0; padding: 0; color: #333; cursor: pointer; } + +#smart_editor2 .se2_l_font_fam .hover, #smart_editor2 .se2_l_font_fam .active { background: #ebebeb; } + +#smart_editor2 .se2_l_font_fam button { width: 200px; height: 21px; margin: 0; padding: 2px 0 2px 0px; background: none; text-align: left; } + +#smart_editor2 .se2_l_font_fam button span { display: block; visibility: visible; overflow: visible; position: relative; top: auto; left: auto; width: auto; height: auto; margin: 0 0 0 4px; padding: 0; font-size: 12px; line-height: normal; color: #333; } + +#smart_editor2 .se2_l_font_fam button span span { display: inline; visibility: visible; overflow: visible; width: auto; height: auto; margin: 0 0 0 4px; font-family: Verdana; font-size: 12px; line-height: 14px; color: #888; } + +#smart_editor2 .se2_l_font_fam button span em { visibility: visible; overflow: auto; position: static; width: auto; height: auto; margin-right: -4px; font-size: 12px; color: #888; } + +#smart_editor2 .se2_l_font_fam .se2_division { width: 162px; height: 2px !important; margin: 1px 0 1px 0px; border: 0; background: url("../img/bg_line1.gif") 0 0 repeat-x; font-size: 0; cursor: default; } + +/* TEXT_TOOLBAR : FONTSIZE */ +#smart_editor2 .se2_tool .se2_l_font_size { width: 302px; margin: 0; padding: 0; } + +#smart_editor2 .se2_tool .se2_l_font_size li { width: 302px; margin: 0; padding: 0; color: #333; cursor: pointer; } + +#smart_editor2 .se2_l_font_size .hover, #smart_editor2 .se2_l_font_size .active { background: #ebebeb; } + +#smart_editor2 .se2_l_font_size button { width: 300px; margin: 0; padding: 2px 0 1px 0px; *padding: 4px 0 1px 0px; background: none; text-align: left; } + +#smart_editor2 .se2_l_font_size button span { display: block; visibility: visible; overflow: visible; position: relative; top: auto; left: auto; width: auto; height: auto; margin: 0 0 0 4px; padding: 0; line-height: normal; color: #373737; letter-spacing: 0px; } + +#smart_editor2 .se2_l_font_size button span span { display: inline; margin: 0 0 0 5px; padding: 0; } + +#smart_editor2 .se2_l_font_size span em { visibility: visible; overflow: auto; position: static; width: auto; height: auto; color: #888; } + +/* TEXT_TOOLBAR : FONTCOLOR */ +#smart_editor2 .se2_palette { float: left; position: relative; width: 225px; margin: 0; padding: 11px 0 10px 0; } + +#smart_editor2 .se2_palette .se2_pick_color { _display: inline; float: left; clear: both; width: 205px; margin: 0 0 0 11px; padding: 0; } + +#smart_editor2 .se2_palette .se2_pick_color li { float: left; width: 12px; height: 12px; margin: 0; padding: 0; } + +#smart_editor2 .se2_palette .se2_pick_color li button { width: 11px; height: 11px; border: 0; } + +#smart_editor2 .se2_palette .se2_pick_color li button span { display: block; visibility: visible; overflow: visible; position: absolute; top: 1px; left: 1px; width: 11px; height: 11px; } + +#smart_editor2 .se2_palette .se2_pick_color li button span span { visibility: hidden; overflow: hidden; position: absolute; top: 0; left: 0; width: 0; height: 0; } + +#smart_editor2 .se2_palette .se2_pick_color .hover button, #smart_editor2 .se2_palette .se2_pick_color .active button { width: 11px; height: 11px; border: 1px solid #666; } + +#smart_editor2 .se2_palette .se2_pick_color .hover span, #smart_editor2 .se2_palette .se2_pick_color .active span { width: 7px; height: 7px; border: 1px solid #fff; } + +#smart_editor2 .se2_palette .se2_view_more { _display: inline; float: left; width: 46px; height: 23px; margin: 1px 0 0 1px; background: url("../img/ko_KR/btn_set.png?130306") 0 -47px no-repeat; } + +#smart_editor2 .se2_palette .se2_view_more2 { _display: inline; float: left; width: 46px; height: 23px; margin: 1px 0 0 1px; background: url("../img/ko_KR/btn_set.png?130306") 0 -24px no-repeat; } + +#smart_editor2 .se2_palette h4 { _display: inline; float: left; width: 203px; margin: 9px 0 0 11px; padding: 10px 0 4px 0; background: url("../img/bg_line1.gif") repeat-x; font-weight: normal; font-size: 12px; line-height: 14px; color: #333; letter-spacing: -1px; } + +#smart_editor2 .se2_palette2 { float: left; _float: none; width: 214px; margin: 9px 0 0 0; padding: 11px 0 0 11px; background: url("../img/bg_line1.gif") repeat-x; } + +#smart_editor2 .se2_palette2 .se2_color_set { float: left; } + +#smart_editor2 .se2_palette2 .se2_selected_color { _display: inline; float: left; width: 83px; height: 18px; margin: 0; border: 1px solid #c7c7c7; background: #fff; } + +#smart_editor2 .se2_palette2 .se2_selected_color span { _display: inline; float: left; width: 79px; height: 14px; margin: 2px; } + +#smart_editor2 .se2_palette2 .input_ty1 { _display: inline; float: left; width: 67px; height: 16px; margin: 0 3px 0 3px; padding: 2px 2px 0 4px; font-family: tahoma; font-size: 11px; } + +#smart_editor2 .se2_palette2 button.se2_btn_insert { float: left; width: 35px; height: 21px; margin-left: 2px; padding: 0; background: url("../img/ko_KR/btn_set.png?130306") -80px 0 no-repeat; } + +#smart_editor2 .se2_gradation1 { float: left; _float: none; width: 201px; height: 128px; margin: 4px 0 0 0; border: 1px solid #c7c7c7; cursor: crosshair; } + +#smart_editor2 .se2_gradation2 { float: left; _float: none; width: 201px; height: 10px; margin: 4px 0 1px 0; border: 1px solid #c7c7c7; cursor: crosshair; } + +/* TEXT_TOOLBAR : BGCOLOR */ +#smart_editor2 .se2_palette_bgcolor { width: 225px; margin: 11px 0 0; padding: 0; } + +#smart_editor2 .se2_palette_bgcolor .se2_background { width: 205px; margin: 0 11px 0 11px; } + +#smart_editor2 .se2_palette_bgcolor .se2_background li { width: 68px; height: 20px; } + +#smart_editor2 .se2_palette_bgcolor .se2_background button { width: 67px; height: 19px; border: 0; } + +#smart_editor2 .se2_palette_bgcolor .se2_background span { left: 0; display: block; visibility: visible; overflow: visible; width: 65px; height: 17px; padding: 0; } + +#smart_editor2 .se2_palette_bgcolor .se2_background span span { display: block; visibility: visible; overflow: visible; width: 64px; height: 16px; padding: 3px 0 0 3px; font-size: 11px; line-height: 14px; text-align: left; } + +#smart_editor2 .se2_palette_bgcolor .se2_background .hover span { width: 65px; height: 17px; border: 1px solid #666; } + +#smart_editor2 .se2_palette_bgcolor .se2_background .hover span span { width: 62px; height: 14px; padding: 1px 0 0 1px; border: 1px solid #fff; } + +/* TEXT_TOOLBAR : LINEHEIGHT */ +#smart_editor2 .se2_l_line_height { width: 107px; margin: 0; padding: 0; } + +#smart_editor2 .se2_l_line_height li { width: 107px; margin: 0; padding: 0; border-top: 0; border-bottom: 0; color: #333; cursor: pointer; } + +#smart_editor2 .se2_l_line_height .hover { background: #ebebeb; } + +#smart_editor2 .se2_l_line_height button { width: 105px; height: 19px; margin: 0; padding: 3px 0 2px 0px; background: none; text-align: left; } + +#smart_editor2 .se2_l_line_height button span { visibility: visible; overflow: visible; position: relative; width: auto; height: auto; margin: 0; padding: 0 0 0 15px; font-size: 12px; line-height: normal; color: #373737; } + +#smart_editor2 .se2_l_line_height li button.active span { background: url("../img/icon_set.gif") 5px -30px no-repeat; } + +#smart_editor2 .se2_l_line_height_user { clear: both; width: 83px; margin: 5px 0 0 12px; padding: 10px 0 0 0; _padding: 11px 0 0 0; background: url("../img/bg_line1.gif") repeat-x; } + +#smart_editor2 .se2_l_line_height_user h3 { margin: 0 0 4px 0; _margin: 0 0 2px -1px; padding: 0; line-height: 14px; color: #000; letter-spacing: -1px; } + +#smart_editor2 .se2_l_line_height_user .bx_input { display: block; position: relative; width: 83px; } + +#smart_editor2 .se2_l_line_height_user .btn_up { position: absolute; top: 2px; *top: 3px; left: 68px; width: 13px; height: 8px; background: url("../img/ko_KR/btn_set.png?130306") -86px -54px no-repeat; } + +#smart_editor2 .se2_l_line_height_user .btn_down { position: absolute; top: 10px; *top: 11px; left: 68px; width: 13px; height: 8px; background: url("../img/ko_KR/btn_set.png?130306") -86px -62px no-repeat; } + +#smart_editor2 .se2_l_line_height_user .btn_area { margin: 5px 0 10px 0; } + +#smart_editor2 .se2_tool .btn_area .se2_btn_apply3 { width: 41px; height: 24px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat; } + +#smart_editor2 .se2_tool .btn_area .se2_btn_cancel3 { width: 39px; height: 24px; margin-left: 3px; background: url("../img/ko_KR/btn_set.png?130306") -41px 0 no-repeat; } + +/* TEXT_TOOLBAR : QUOTE */ +#smart_editor2 .se2_quote { width: 425px; height: 56px; } + +#smart_editor2 .se2_quote ul { _display: inline; float: left; margin: 11px 0 0 9px; padding: 0; } + +#smart_editor2 .se2_quote li { _display: inline; float: left; margin: 0 0 0 2px; padding: 0; } + +#smart_editor2 .se2_quote button { width: 34px; height: 34px; margin: 0; padding: 0; background: url("../img/ko_KR/btn_set.png?130306") no-repeat; cursor: pointer; } + +#smart_editor2 .se2_quote button span { left: 0; display: block; visibility: visible; overflow: visible; width: 32px; height: 32px; margin: 0; padding: 0; border: 1px solid #c7c7c7; } + +#smart_editor2 .se2_quote button span span { visibility: hidden; overflow: hidden; position: absolute; top: 0; left: 0; width: 0; height: 0; margin: 0; padding: 0; } + +#smart_editor2 .se2_quote .se2_quote1 { background-position: 1px -375px; } + +#smart_editor2 .se2_quote .se2_quote2 { background-position: -32px -375px; } + +#smart_editor2 .se2_quote .se2_quote3 { background-position: -65px -375px; } + +#smart_editor2 .se2_quote .se2_quote4 { background-position: -98px -375px; } + +#smart_editor2 .se2_quote .se2_quote5 { background-position: -131px -375px; } + +#smart_editor2 .se2_quote .se2_quote6 { background-position: -164px -375px; } + +#smart_editor2 .se2_quote .se2_quote7 { background-position: -197px -375px; } + +#smart_editor2 .se2_quote .se2_quote8 { background-position: -230px -375px; } + +#smart_editor2 .se2_quote .se2_quote9 { background-position: -263px -375px; } + +#smart_editor2 .se2_quote .se2_quote10 { background-position: -296px -375px; } + +#smart_editor2 .se2_quote .hover button span, #smart_editor2 .se2_quote .active button span { width: 30px; height: 30px; margin: 0; padding: 0; border: 2px solid #44b525; } + +#smart_editor2 .se2_quote .hover button span span, #smart_editor2 .se2_quote .active button span span { visibility: hidden; overflow: hidden; position: absolute; top: 0; left: 0; width: 0; height: 0; margin: 0; padding: 0; } + +#smart_editor2 .se2_quote .se2_cancel2 { float: left; width: 40px; height: 35px; margin: 11px 0 0 5px; background: url("../img/ko_KR/btn_set.png?130306") -46px -24px no-repeat; } + +#smart_editor2 .se2_quote .se2_cancel2 span { visibility: hidden; overflow: hidden; position: absolute; top: 0; left: 0; width: 0; height: 0; margin: 0; padding: 0; } + +/* TEXT_TOOLBAR : HYPERLINK */ +#smart_editor2 .se2_url2 { width: 281px; padding: 11px 11px 6px 11px; color: #666; } + +#smart_editor2 .se2_url2 .input_ty1 { display: block; width: 185px; height: 16px; margin: 0 5px 5px 0; *margin: -1px 5px 5px 0; padding: 5px 2px 0 4px; } + +#smart_editor2 .se2_url2 .se2_url_new { width: 15px; height: 15px; margin: -1px 3px 1px -1px; *margin: -2px 3px 2px -1px; vertical-align: middle; } + +#smart_editor2 .se2_url2 label { font-size: 11px; line-height: 14px; vertical-align: middle; } + +#smart_editor2 .se2_url2 .se2_apply { position: absolute; top: 13px; right: 51px; width: 41px; height: 24px; margin: -1px 3px 1px 0; background: url("../img/ko_KR/btn_set.png?130306") no-repeat; } + +#smart_editor2 .se2_url2 .se2_cancel { position: absolute; top: 13px; right: 9px; width: 39px; height: 24px; margin: -1px 3px 1px 0; background: url("../img/ko_KR/btn_set.png?130306") -41px 0 no-repeat; } + +/* TEXT_TOOLBAR : SCHARACTER */ +#smart_editor2 .se2_bx_character { width: 469px; height: 272px; margin: 0; padding: 0; background: url("../img/ko_KR/bx_set_110302.gif") 9px -1230px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_char_tab { _display: inline; float: left; position: relative; width: 443px; margin: 11px 10px 200px 11px; padding: 0 0 0 1px; } + +#smart_editor2 .se2_bx_character .se2_char_tab li { position: static; margin: 0 0 0 -1px; padding: 0; } + +#smart_editor2 .se2_bx_character .se2_char1 { width: 76px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") 0 -204px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_char2 { width: 86px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -75px -204px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_char3 { width: 68px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -160px -204px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_char4 { width: 55px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -227px -204px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_char5 { width: 97px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -281px -204px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_char6 { width: 66px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -377px -204px no-repeat; } + +#smart_editor2 .se2_bx_character .active .se2_char1 { width: 76px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") 0 -230px no-repeat; } + +#smart_editor2 .se2_bx_character .active .se2_char2 { width: 86px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -75px -230px no-repeat; } + +#smart_editor2 .se2_bx_character .active .se2_char3 { width: 68px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -160px -230px no-repeat; } + +#smart_editor2 .se2_bx_character .active .se2_char4 { width: 55px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -227px -230px no-repeat; } + +#smart_editor2 .se2_bx_character .active .se2_char5 { width: 97px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -281px -230px no-repeat; } + +#smart_editor2 .se2_bx_character .active .se2_char6 { width: 66px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -377px -230px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_s_character { display: none; position: absolute; top: 26px; left: 0; width: 448px; height: 194px; margin: 0; padding: 0; } + +#smart_editor2 .se2_bx_character .active .se2_s_character { display: block; } + +#smart_editor2 .se2_bx_character .se2_s_character ul { float: left; width: 422px; height: 172px; margin: 0; padding: 9px 0 0 11px; } + +#smart_editor2 .se2_bx_character .se2_s_character li { _display: inline; float: left; position: relative; width: 20px; height: 18px; margin: 0 0 1px 1px; background: #fff; } + +#smart_editor2 .se2_bx_character .se2_s_character button { width: 20px; height: 18px; margin: 0; padding: 2px; background: none; } + +#smart_editor2 .se2_bx_character .se2_s_character .hover, #smart_editor2 .se2_bx_character .se2_s_character .active { background: url("../img/ko_KR/btn_set.png?130306") -446px -274px no-repeat; } + +#smart_editor2 .se2_bx_character .se2_s_character button span { left: 0; display: block; visibility: visible; overflow: visible; width: 14px; height: 16px; margin: 3px 0 0 3px; border: 0; background: none; font-size: 12px; line-height: normal; } + +#smart_editor2 .se2_apply_character { clear: both; position: relative; padding: 0 0 0 11px; } + +#smart_editor2 .se2_apply_character label { margin: 0 3px 0 0; font-size: 12px; color: #666; letter-spacing: -1px; } + +#smart_editor2 .se2_apply_character .input_ty1 { width: 283px; height: 17px; margin: -1px 5px 1px 0; padding: 4px 0 0 5px; font-size: 12px; color: #666; letter-spacing: 0; vertical-align: middle; } + +#smart_editor2 .se2_apply_character .se2_confirm { width: 41px; height: 24px; margin-right: 3px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat; vertical-align: middle; } + +#smart_editor2 .se2_apply_character .se2_cancel { width: 39px; height: 24px; background: url("../img/ko_KR/btn_set.png?130306") -41px 0 no-repeat; vertical-align: middle; } + +/* TEXT_TOOLBAR : TABLECREATOR */ +#smart_editor2 .se2_table_set { position: relative; width: 166px; margin: 3px 11px 0 11px; padding: 8px 0 0 0; } + +#smart_editor2 .se2_table_set .se2_cell_num { float: left; width: 73px; } + +#smart_editor2 .se2_table_set .se2_cell_num dt { float: left; clear: both; width: 17px; height: 23px; margin: 0; padding: 0; } + +#smart_editor2 .se2_table_set .se2_cell_num dt label { display: block; margin: 5px 0 0 0; font-size: 11px; color: #666; } + +#smart_editor2 .se2_table_set .se2_cell_num dd { float: left; position: relative; width: 54px; height: 23px; margin: 0; padding: 0; } + +#smart_editor2 .se2_table_set .se2_cell_num .input_ty2 { display: block; width: 32px; height: 16px; *margin: -1px 0 0 0; padding: 2px 19px 0 0px; border: 1px solid #c7c7c7; font-family: tahoma,verdana,times New Roman; font-size: 11px; color: #666; text-align: right; } + +#smart_editor2 .se2_table_set .se2_cell_num .input_ty2::-ms-clear { display: none; } + +#smart_editor2 .se2_table_set .se2_pre_table { float: right; width: 91px; height: 43px; background: #c7c7c7; border-spacing: 1px; } + +#smart_editor2 .se2_table_set .se2_pre_table tr { background: #fff; } + +#smart_editor2 .se2_table_set .se2_pre_table td { font-size: 0; line-height: 0; } + +#smart_editor2 .se2_table_set .se2_add { position: absolute; top: 2px; right: 3px; width: 13px; height: 8px; background: url("../img/ko_KR/btn_set.png?130306") -86px -54px no-repeat; } + +#smart_editor2 .se2_table_set .se2_del { position: absolute; top: 10px; right: 3px; width: 13px; height: 8px; background: url("../img/ko_KR/btn_set.png?130306") -86px -62px no-repeat; } + +/* TEXT_TOOLBAR : TABLEEDITOR */ +#smart_editor2 .se2_table_set .se2_t_proper1 { float: left; width: 166px; margin: 7px 0 0 0; padding: 10px 0 5px; background: url("../img/bg_line1.gif") repeat-x; } + +#smart_editor2 .se2_table_set .se2_t_proper1 dt { width: 166px; margin: 0 0 6px 0; } + +#smart_editor2 .se2_table_set .se2_t_proper1 dd { width: 166px; } + +#smart_editor2 .se2_table_set .se2_t_proper1 dt input { width: 15px; height: 15px; margin: -1px 3px 1px 0; _margin: -2px 3px 2px 0; vertical-align: middle; } + +#smart_editor2 .se2_table_set .se2_t_proper1 dt label { font-weight: bold; font-size: 11px; color: #666; letter-spacing: -1px; vertical-align: middle; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 { float: left; position: relative; z-index: 59; width: 166px; margin: 1px 0 0 0; } + +#smart_editor2 .se2_table_set .se2_t_proper1_2 { z-index: 54; margin: 0; } + +#smart_editor2 .se2_table_set .se2_t_proper1_3 { z-index: 53; margin: 0; } + +#smart_editor2 .se2_table_set .se2_t_proper1_4 { z-index: 52; margin: 0; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 dt { _display: inline; float: left; clear: both; width: 66px; height: 22px; margin: 1px 0 0 18px; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 dt label { display: block; margin: 4px 0 0 0; font-weight: normal; font-size: 11px; color: #666; letter-spacing: -1px; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 dd { float: left; position: relative; width: 82px; height: 23px; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 .input_ty1 { width: 72px; height: 16px; *margin: -1px 0 0 0; padding: 2px 2px 0 6px; font-family: tahoma,verdana,times New Roman; font-size: 11px; color: #666; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 .input_ty3 { float: left; width: 49px; height: 16px; margin: 0 3px 0 0; padding: 2px 4px 0 4px; border: 1px solid #c7c7c7; font-family: tahoma,verdana,times New Roman; font-size: 11px; color: #666; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 .se2_add { top: 2px; right: 2px; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 .se2_del { top: 10px; right: 2px; } + +#smart_editor2 .se2_table_set .se2_t_proper1_1 .se2_color_set .input_ty1 { _display: inline; float: left; width: 67px; height: 16px; margin: 0 3px 0 3px; padding: 2px 2px 0 4px; font-family: tahoma,verdana,times New Roman; font-size: 11px; } + +#smart_editor2 .se2_select_ty1 { position: relative; width: 80px; height: 18px; border: 1px solid #c7c7c7; background: #fff; font-size: 11px; line-height: 14px; text-align: left; } + +#smart_editor2 .se2_select_ty1 span { float: left; width: 54px; height: 18px; margin: 0 0 0 5px; font-size: 11px; line-height: 14px; color: #666; } + +#smart_editor2 .se2_select_ty1 .se2_b_style0 { position: relative; top: 3px; left: -3px; white-space: nowrap; } + +#smart_editor2 .se2_select_ty1 .se2_b_style1 { height: 15px; margin: 3px 0 0 4px; font-size: 11px; line-height: 14px; color: #666; letter-spacing: -1px; } + +#smart_editor2 .se2_select_ty1 .se2_b_style2 { background: url("../img/bg_set.gif") 0 -50px repeat-x; } + +#smart_editor2 .se2_select_ty1 .se2_b_style3 { background: url("../img/bg_set.gif") 0 -68px repeat-x; } + +#smart_editor2 .se2_select_ty1 .se2_b_style4 { background: url("../img/bg_set.gif") 0 -85px repeat-x; } + +#smart_editor2 .se2_select_ty1 .se2_b_style5 { background: url("../img/bg_set.gif") 0 -103px repeat-x; } + +#smart_editor2 .se2_select_ty1 .se2_b_style6 { background: url("../img/bg_set.gif") 0 -121px repeat-x; } + +#smart_editor2 .se2_select_ty1 .se2_b_style7 { background: url("../img/bg_set.gif") 0 -139px repeat-x; } + +#smart_editor2 .se2_select_ty1 .se2_view_more { position: absolute; top: 1px; right: 1px; width: 13px; height: 16px; background: url("../img/ko_KR/btn_set.png?130306") -112px -54px no-repeat; } + +#smart_editor2 .se2_select_ty1 .se2_view_more2 { position: absolute; top: 1px; right: 1px; width: 13px; height: 16px; background: url("../img/ko_KR/btn_set.png?130306") -99px -54px no-repeat; } + +/* TEXT_TOOLBAR : TABLEEDITOR > BORDER */ +#smart_editor2 .se2_table_set .se2_b_t_b1 { border-top: 1px solid #b1b1b1; } + +#smart_editor2 .se2_layer_b_style { position: absolute; top: 20px; right: 0px; width: 80px; padding-bottom: 1px; border: 1px solid #c7c7c7; border-top: 1px solid #a8a8a8; background: #fff; } + +#smart_editor2 .se2_layer_b_style ul { width: 80px; margin: 0; padding: 1px 0 0 0; } + +#smart_editor2 .se2_layer_b_style li { width: 80px; height: 18px; margin: 0; padding: 0; } + +#smart_editor2 .se2_layer_b_style .hover, #smart_editor2 .se2_layer_b_style .active { background: #ebebeb; } + +#smart_editor2 .se2_layer_b_style button { width: 80px; height: 18px; background: none; } + +#smart_editor2 .se2_layer_b_style button span { left: 0; display: block; visibility: visible; overflow: visible; width: 71px; height: 18px; margin: 0 0 0 5px; font-size: 11px; line-height: 15px; text-align: left; } + +#smart_editor2 .se2_layer_b_style button span span { visibility: hidden; overflow: hidden; position: absolute; top: 0; left: 0; width: 0; height: 0; } + +#smart_editor2 .se2_layer_b_style .se2_b_style1 span { margin: 3px 0 0 4px; font-size: 11px; line-height: 14px; color: #666; letter-spacing: -1px; } + +#smart_editor2 .se2_layer_b_style .se2_b_style2 span { background: url("../img/bg_set.gif") 0 -50px repeat-x; } + +#smart_editor2 .se2_layer_b_style .se2_b_style3 span { background: url("../img/bg_set.gif") 0 -68px repeat-x; } + +#smart_editor2 .se2_layer_b_style .se2_b_style4 span { background: url("../img/bg_set.gif") 0 -86px repeat-x; } + +#smart_editor2 .se2_layer_b_style .se2_b_style5 span { background: url("../img/bg_set.gif") 0 -103px repeat-x; } + +#smart_editor2 .se2_layer_b_style .se2_b_style6 span { background: url("../img/bg_set.gif") 0 -121px repeat-x; } + +#smart_editor2 .se2_layer_b_style .se2_b_style7 span { background: url("../img/bg_set.gif") 0 -139px repeat-x; } + +/* TEXT_TOOLBAR : TABLEEDITOR > COLOR */ +#smart_editor2 .se2_pre_color { float: left; width: 18px; height: 18px; border: 1px solid #c7c7c7; } + +#smart_editor2 .se2_pre_color button { float: left; width: 14px; height: 14px; margin: 2px 0 0 2px; padding: 0; } + +#smart_editor2 .se2_pre_color button span { overflow: hidden; position: absolute; top: -10000px; left: -10000px; z-index: -100; width: 0; height: 0; } + +/* TEXT_TOOLBAR : TABLEEDITOR > DIMMED */ +#smart_editor2 .se2_table_set .se2_t_dim1 { clear: both; position: absolute; top: 71px; left: 16px; z-index: 60; width: 157px; height: 118px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_table_set .se2_t_dim2 { position: absolute; top: 116px; left: 16px; z-index: 55; width: 157px; height: 45px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_table_set .se2_t_dim3 { clear: both; position: absolute; top: 192px; left: 16px; z-index: 51; width: 157px; height: 39px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +/* TEXT_TOOLBAR : TABLEEDITOR > STYLE PREVIEW */ +#smart_editor2 .se2_table_set .se2_t_proper2 { float: left; position: relative; z-index: 50; width: 166px; margin: 2px 0 0 0; } + +#smart_editor2 .se2_table_set .se2_t_proper2 dt { float: left; width: 84px; height: 33px; margin: 4px 0 0 0; } + +#smart_editor2 .se2_table_set .se2_t_proper2 dt input { width: 15px; height: 15px; margin: -1px 3px 1px 0; _margin: -2px 3px 2px 0; vertical-align: middle; } + +#smart_editor2 .se2_table_set .se2_t_proper2 dt label { font-weight: bold; font-size: 11px; color: #666; letter-spacing: -1px; vertical-align: middle; } + +#smart_editor2 .se2_table_set .se2_t_proper2 dd { float: left; width: 66px; height: 33px; } + +#smart_editor2 .se2_select_ty2 { position: relative; width: 65px; height: 31px; border: 1px solid #c7c7c7; background: #fff; font-size: 11px; line-height: 14px; text-align: left; } + +#smart_editor2 .se2_select_ty2 span { float: left; width: 45px; height: 25px; margin: 3px 0 0 3px; background: url("../img/ko_KR/btn_set.png?130306") repeat-x; } + +#smart_editor2 .se2_select_ty2 .se2_t_style1 { background-position: 0 -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style2 { background-position: -46px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style3 { background-position: -92px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style4 { background-position: -138px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style5 { background-position: -184px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style6 { background-position: -230px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style7 { background-position: -276px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style8 { background-position: -322px -410px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style9 { background-position: 0 -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style10 { background-position: -46px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style11 { background-position: -92px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style12 { background-position: -138px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style13 { background-position: -184px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style14 { background-position: -230px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style15 { background-position: -276px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_t_style16 { background-position: -322px -436px; } + +#smart_editor2 .se2_select_ty2 .se2_view_more { position: absolute; top: 1px; right: 1px; _right: 0px; width: 13px !important; height: 29px !important; background: url("../img/ko_KR/btn_set.png?130306") -353px -48px no-repeat !important; } + +#smart_editor2 .se2_select_ty2 .se2_view_more2 { position: absolute; top: 1px; right: 1px; _right: 0px; width: 13px !important; height: 29px !important; background: url("../img/ko_KR/btn_set.png?130306") -340px -48px no-repeat !important; } + +#smart_editor2 .se2_select_ty2 .se2_view_more span { display: none; } + +/* TEXT_TOOLBAR : TABLEEDITOR > STYLE */ +#smart_editor2 .se2_layer_t_style { position: absolute; top: 33px; right: 15px; width: 208px; border: 1px solid #c7c7c7; border-top: 1px solid #a8a8a8; background: #fff; } + +#smart_editor2 .se2_layer_t_style ul { width: 204px; height: 126px; margin: 1px 2px; padding: 1px 0 0 0; background: #fff; } + +#smart_editor2 .se2_layer_t_style li { _display: inline; float: left; width: 45px; height: 25px; margin: 1px; padding: 1px; border: 1px solid #fff; } + +#smart_editor2 .se2_layer_t_style .hover, #smart_editor2 .se2_layer_t_style .active { border: 1px solid #666; background: #fff; } + +#smart_editor2 .se2_layer_t_style button { width: 45px; height: 25px; background: url("../img/ko_KR/btn_set.png?130306") repeat-x !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style1 { background-position: 0 -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style2 { background-position: -46px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style3 { background-position: -92px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style4 { background-position: -138px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style5 { background-position: -184px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style6 { background-position: -230px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style7 { background-position: -276px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style8 { background-position: -322px -410px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style9 { background-position: 0 -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style10 { background-position: -46px -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style11 { background-position: -92px -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style12 { background-position: -138px -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style13 { background-position: -184px -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style14 { background-position: -230px -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style15 { background-position: -276px -436px !important; } + +#smart_editor2 .se2_layer_t_style .se2_t_style16 { background-position: -322px -436px !important; } + +#smart_editor2 .se2_table_set .se2_btn_area { float: left; width: 166px; margin: 6px 0 0 0; padding: 12px 0 8px 0; background: url("../img/bg_line1.gif") repeat-x; text-align: center; } + +#smart_editor2 .se2_table_set button.se2_apply { width: 41px; height: 24px; margin-right: 3px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat; } + +#smart_editor2 .se2_table_set button.se2_cancel { width: 39px; height: 24px; background: url("../img/ko_KR/btn_set.png?130306") -41px 0 no-repeat; } + +#smart_editor2 .se2_table_set .se2_rd { width: 14px; height: 14px; vertical-align: middle; } + +#smart_editor2 .se2_table_set .se2_celltit { font-size: 11px; font-size: 11px; color: #666; letter-spacing: -1px; } + +#smart_editor2 .se2_table_set dt label.se2_celltit { display: inline; } + +/* TEXT_TOOLBAR : FINDREPLACE */ +#smart_editor2 .se2_bx_find_revise { position: relative; width: 255px; margin: 0; padding: 0; } + +#smart_editor2 .se2_bx_find_revise .se2_close { position: absolute; top: 5px; right: 8px; width: 20px; height: 20px; background: url("../img/ko_KR/btn_set.png?130306") -151px -1px no-repeat; } + +#smart_editor2 .se2_bx_find_revise h3 { margin: 0; padding: 10px 0 13px 10px; background: url("../img/bg_find_h3.gif") 0 -1px repeat-x; font-size: 12px; line-height: 14px; letter-spacing: -1px; } + +#smart_editor2 .se2_bx_find_revise ul { position: relative; margin: 8px 0 0 0; padding: 0 0 0 12px; } + +#smart_editor2 .se2_bx_find_revise ul li { _display: inline; float: left; position: static; margin: 0 0 0 -1px; padding: 0; } + +#smart_editor2 .se2_bx_find_revise .se2_tabfind { width: 117px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") 0 -100px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_tabrevise { width: 117px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -116px -100px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .active .se2_tabfind { width: 117px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") 0 -126px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .active .se2_tabrevise { width: 117px; height: 26px; background: url("../img/ko_KR/btn_set.png?130306") -116px -126px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_in_bx_find dl { _display: inline; float: left; width: 223px; margin: 0 0 0 9px; padding: 7px 0 13px 14px; background: url("../img/ko_KR/bx_set_110302.gif") -289px -1518px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_in_bx_revise dl { _display: inline; float: left; width: 223px; margin: 0 0 0 9px; padding: 7px 0 13px 14px; background: url("../img/ko_KR/bx_set_110302.gif") -289px -1619px no-repeat; } + +#smart_editor2 .se2_bx_find_revise dt { _display: inline; float: left; clear: both; width: 47px; margin: 1px 0 2px 0; } + +#smart_editor2 .se2_bx_find_revise dd { float: left; margin: 0 0 2px 0; } + +#smart_editor2 .se2_bx_find_revise label { float: left; padding: 5px 0 0 0; font-size: 11px; color: #666; letter-spacing: -2px; } + +#smart_editor2 .se2_bx_find_revise input { float: left; width: 155px; height: 12px; margin: 1px 0 0 0; padding: 3px 2px 3px 4px; font-size: 12px; color: #666; } + +#smart_editor2 .se2_bx_find_revise .se2_find_btns { float: left; clear: both; width: 255px; padding: 8px 0 10px 0; text-align: center; } + +#smart_editor2 .se2_bx_find_revise .se2_find_next { width: 65px; height: 24px; margin: 0 3px 0 0; background: url("../img/ko_KR/btn_set.png?130306") -180px -48px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_find_next2 { width: 61px; height: 24px; margin: 0 3px 0 0; background: url("../img/ko_KR/btn_set.png?130306") -180px -24px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_revise1 { width: 54px; height: 24px; margin: 0 3px 0 0; background: url("../img/ko_KR/btn_set.png?130306") -245px -48px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_revise2 { width: 70px; height: 24px; margin: 0 3px 0 0; background: url("../img/ko_KR/btn_set.png?130306") -245px -24px no-repeat; } + +#smart_editor2 .se2_bx_find_revise .se2_cancel { width: 39px; height: 24px; background: url("../img/ko_KR/btn_set.png?130306") -41px 0 no-repeat; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE */ +#smart_editor2 .se2_qmax { position: absolute; width: 18px; height: 18px; background: url("../img/ko_KR/btn_set.png?130306") -339px -169px no-repeat; } + +#smart_editor2 .se2_qeditor { position: absolute; top: 0; left: 0; width: 183px; margin: 0; padding: 0; border: 1px solid #c7c7c7; border-right: 1px solid #ababab; border-bottom: 1px solid #ababab; background: #fafafa; } + +#smart_editor2 .se2_qeditor label, #smart_editor2 .se2_qeditor span, #smart_editor2 .se2_qeditor dt { font-size: 11px; color: #666; letter-spacing: -1px; } + +#smart_editor2 .se2_qbar { position: relative; width: 183px; height: 11px; background: url("../img/ko_KR/bx_set_110302.gif") 0 -731px no-repeat; } + +#smart_editor2 .se2_qbar .se2_qmini { position: absolute; top: -1px; right: 0; *right: -1px; _right: -3px; width: 18px; height: 14px; background: url("../img/ko_KR/btn_set.png?130306") -315px -170px no-repeat; } + +#smart_editor2 .se2_qbar .se2_qmini button { width: 20px; height: 14px; margin-top: -1px; } + +#smart_editor2 .se2_qeditor .se2_qbody0 { float: left; border: 1px solid #fefefe; } + +#smart_editor2 .se2_qeditor .se2_qbody { position: relative; z-index: 90; width: 174px; padding: 4px 0 0 7px; } + +#smart_editor2 .se2_qeditor .se2_qe1 { overflow: hidden; width: 174px; } + +#smart_editor2 .se2_qeditor .se2_qe1 dt { float: left; width: 22px; height: 18px; padding: 4px 0 0 0; } + +#smart_editor2 .se2_qeditor .se2_qe1 dd { float: left; width: 65px; height: 22px; } + +#smart_editor2 .se2_qeditor .se2_addrow { width: 28px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -385px -49px; } + +#smart_editor2 .se2_qeditor .se2_addcol { width: 29px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -413px -49px; } + +#smart_editor2 .se2_qeditor .se2_seprow { width: 28px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -385px -68px; } + +#smart_editor2 .se2_qeditor .se2_sepcol { width: 29px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -413px -68px; } + +#smart_editor2 .se2_qeditor .se2_delrow { width: 28px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -385px -106px; } + +#smart_editor2 .se2_qeditor .se2_delcol { width: 29px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -413px -106px; } + +#smart_editor2 .se2_qeditor .se2_merrow { width: 57px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -385px -125px; } + +#smart_editor2 .se2_qeditor .se2_mercol { width: 57px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -413px -125px; } + +#smart_editor2 .se2_qeditor .se2_seprow_off { width: 28px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -385px -87px; } + +#smart_editor2 .se2_qeditor .se2_sepcol_off { width: 29px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -413px -87px; } + +#smart_editor2 .se2_qeditor .se2_merrow_off { width: 57px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -385px -144px; } + +#smart_editor2 .se2_qeditor .se2_mercol_off { width: 57px; height: 19px; background: url("../img/ko_KR/btn_set.png?130306") no-repeat -413px -144px; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > CELL_BACKGROUND */ +#smart_editor2 .se2_qeditor .se2_qe2 { _display: inline; float: left; position: relative; z-index: 100; width: 165px; margin: 2px 0 0 1px; padding: 7px 0 0 0; background: url("../img/bg_line1.gif") repeat-x; zoom: 1; } + +#smart_editor2 .se2_qeditor .se2_qe2_1 dt { float: left; width: 62px; padding: 3px 0 0 0; } + +#smart_editor2 .se2_qeditor .se2_qe2_1 dt input { width: 15px; height: 15px; margin: -1px 1px 1px -1px; vertical-align: middle; } + +#smart_editor2 .se2_qeditor .se2_qe2_1 dd { float: left; position: relative; zoom: 1; } + +#smart_editor2 .se2_qeditor .se2_qe2_3 { padding: 7px 0 6px 0; } + +/* My글양식 없을때 */ +#smart_editor2 .se2_qeditor .se2_qe2_2 { position: relative; _position: absolute; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 dt { float: left; width: 50px; padding: 3px 0 0 13px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 dt input { width: 15px; height: 15px; margin: -1px 2px 1px -1px; vertical-align: middle; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 dd { float: left; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > STYLE */ +#smart_editor2 .se2_table_set .se2_qbody .se2_t_proper2 { float: left; *float: none; position: static; width: 166px; margin: 5px 0 0 1px; } + +#smart_editor2 .se2_qeditor .se2_qe3 dt { float: left; width: 62px; padding: 0; } + +#smart_editor2 .se2_qeditor .se2_qe3 dt label { font-weight: normal; } + +#smart_editor2 .se2_qeditor .se2_qe3 dt input { width: 15px; height: 15px; margin: -1px 1px 1px -1px; vertical-align: middle; } + +#smart_editor2 .se2_qeditor .se2_qe3 dd .se2_qe3_table { position: relative; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > CELL_BACKGROUND PREWVIEW */ +#smart_editor2 .se2_qeditor .se2_pre_color { float: left; width: 18px; height: 18px; border: 1px solid #c7c7c7; } + +#smart_editor2 .se2_qeditor .se2_pre_color button { float: left; width: 14px; height: 14px; margin: 2px 0 0 2px; padding: 0; } + +#smart_editor2 .se2_qeditor .se2_pre_color button span { overflow: hidden; position: absolute; top: -10000px; left: -10000px; z-index: -100; width: 0; height: 0; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > CELL_BACKGROUND LAYER */ +#smart_editor2 .se2_qeditor .se2_layer { float: left; clear: both; position: absolute; top: 20px; left: 0; margin: 0; padding: 0; border: 1px solid #c7c7c7; border-top: 1px solid #9a9a9a; background: #fafafa; } + +#smart_editor2 .se2_qeditor .se2_layer .se2_in_layer { float: left; margin: 0; padding: 0; border: 1px solid #fff; background: #fafafa; } + +#smart_editor2 .se2_qeditor .se2_layer button { vertical-align: top; } + +#smart_editor2 .se2_qeditor .se2_layer .se2_pick_color li { position: relative; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > CELL_BACKGROUND IMAGE */ +#smart_editor2 .se2_qeditor .se2_pre_bgimg { float: left; width: 14px; height: 14px; padding: 2px; border: 1px solid #c7c7c7; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 button { width: 16px; height: 16px; background: url("../img/ko_KR/btn_set.png?130306") 0 -261px no-repeat; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > CELL_BACKGROUND IMAGE LAYER */ +#smart_editor2 .se2_cellimg_set { _display: inline; float: left; width: 136px; margin: 4px 3px 0 4px; padding-bottom: 4px; } + +#smart_editor2 .se2_cellimg_set li { _display: inline; float: left; width: 16px; height: 16px; margin: 0 1px 1px 0; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg0 { background-position: -255px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg1 { background-position: 0 -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg2 { background-position: -17px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg3 { background-position: -34px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg4 { background-position: -51px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg5 { background-position: -68px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg6 { background-position: -85px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg7 { background-position: -102px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg8 { background-position: -119px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg9 { background-position: -136px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg10 { background-position: -153px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg11 { background-position: -170px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg12 { background-position: -187px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg13 { background-position: -204px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg14 { background-position: -221px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg15 { background-position: -238px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg16 { background-position: -255px -261px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg17 { background-position: 0 -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg18 { background-position: -17px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg19 { background-position: -34px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg20 { background-position: -51px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg21 { background-position: -68px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg22 { background-position: -85px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg23 { background-position: -102px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg24 { background-position: -119px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg25 { background-position: -136px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg26 { background-position: -153px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg27 { background-position: -170px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg28 { background-position: -187px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg29 { background-position: -204px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg30 { background-position: -221px -278px; } + +#smart_editor2 .se2_qeditor .se2_qe2_2 .se2_cellimg31 { background-position: -238px -278px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg button { width: 14px; height: 14px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg1 { background-position: -1px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg2 { background-position: -18px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg3 { background-position: -35px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg4 { background-position: -52px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg5 { background-position: -69px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg6 { background-position: -86px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg7 { background-position: -103px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg8 { background-position: -120px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg9 { background-position: -137px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg10 { background-position: -154px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg11 { background-position: -171px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg12 { background-position: -188px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg13 { background-position: -205px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg14 { background-position: -222px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg15 { background-position: -239px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg16 { background-position: -256px -262px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg17 { background-position: -1px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg18 { background-position: -18px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg19 { background-position: -35px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg20 { background-position: -52px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg21 { background-position: -69px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg22 { background-position: -86px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg23 { background-position: -103px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg24 { background-position: -120px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg25 { background-position: -137px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg26 { background-position: -154px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg27 { background-position: -171px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg28 { background-position: -188px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg29 { background-position: -205px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg30 { background-position: -222px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg31 { background-position: -239px -279px; } + +#smart_editor2 .se2_qeditor .se2_pre_bgimg .se2_cellimg32 { background-position: -256px -279px; } + +/* TEXT_TOOLBAR : QUICKEDITOR_TABLE > MY REVIEW */ +#smart_editor2 .se2_btn_area { _display: inline; float: left; clear: both; width: 166px; margin: 5px 0 0 1px; padding: 7px 0 6px 0; background: url("../img/bg_line1.gif") repeat-x; text-align: center; } + +#smart_editor2 .se2_btn_area .se2_btn_save { width: 97px; height: 21px; background: url("../img/ko_KR/btn_set.png?130306") -369px -163px no-repeat; } + +/* TEXT_TOOLBAR : QUICKEDITOR_IMAGE */ +#smart_editor2 .se2_qe10 { width: 166px; margin: 0; *margin: -2px 0 0 0; } + +#smart_editor2 .se2_qe10 label { margin: 0 1px 0 0; vertical-align: middle; } + +#smart_editor2 .se2_qe10 .se2_sheight { margin-left: 4px; } + +#smart_editor2 .se2_qe10 .input_ty1 { width: 30px; height: 13px; margin: 0 0 1px 1px; padding: 3px 4px 0 1px; font-size: 11px; letter-spacing: 0; text-align: right; vertical-align: middle; } + +#smart_editor2 .se2_qe10 .se2_sreset { width: 41px; height: 19px; margin-left: 3px; background: url("../img/ko_KR/btn_set.png?130306") -401px -184px no-repeat; vertical-align: middle; } + +#smart_editor2 .se2_qe10_1 { margin-top: 4px; padding: 10px 0 3px; background: url("../img/bg_line1.gif") repeat-x; } + +#smart_editor2 .se2_qe10_1 input { width: 15px; height: 15px; margin: -1px 3px 1px -1px; vertical-align: middle; } + +#smart_editor2 .se2_qe11 { float: left; width: 166px; margin: 4px 0 0 0; padding: 7px 0 2px 0; background: url("../img/bg_line1.gif") repeat-x; } + +#smart_editor2 .se2_qe11_1 { float: left; width: 99px; } + +#smart_editor2 .se2_qe11_1 dt { float: left; width: 56px; height: 15px; padding: 5px 0 0 0; } + +#smart_editor2 .se2_qe11_1 dd { float: left; position: relative; width: 38px; height: 20px; } + +#smart_editor2 .se2_qe11_1 .input_ty1 { display: block; width: 29px; height: 15px; margin: 0; *margin: -1px 0 1px 0; padding: 3px 1px 0 5px; font-size: 11px; letter-spacing: 0; text-align: left; } + +#smart_editor2 .se2_qe11_1 .se2_add { position: absolute; top: 2px; right: 3px; width: 13px; height: 8px; background: url("../img/ko_KR/btn_set.png?130306") -86px -54px no-repeat; } + +#smart_editor2 .se2_qe11_1 .se2_del { position: absolute; top: 10px; right: 3px; width: 13px; height: 8px; background: url("../img/ko_KR/btn_set.png?130306") -86px -62px no-repeat; } + +#smart_editor2 .se2_qe11_2 { float: left; width: 67px; } + +#smart_editor2 .se2_qe11_2 dt { float: left; width: 47px; margin: 5px 0 0 0; } + +#smart_editor2 .se2_qe11_2 dd { float: left; position: relative; width: 20px; } + +#smart_editor2 .se2_qe12 { float: left; width: 166px; margin: 3px 0 0 0; padding: 7px 0 0 0; background: url("../img/bg_line1.gif") repeat-x; } + +#smart_editor2 .se2_qe12 dt { float: left; margin: 5px 4px 0 0; } + +#smart_editor2 .se2_qe12 dd { float: left; padding: 0 0 6px 0; } + +#smart_editor2 .se2_qe12 .se2_align0 { float: left; width: 19px; height: 21px; background: url("../img/ko_KR/btn_set.png?130306") -276px -121px no-repeat; } + +#smart_editor2 .se2_qe12 .se2_align1 { float: left; width: 19px; height: 21px; background: url("../img/ko_KR/btn_set.png?130306") -295px -121px no-repeat; } + +#smart_editor2 .se2_qe12 .se2_align2 { float: left; width: 20px; height: 21px; background: url("../img/ko_KR/btn_set.png?130306") -314px -121px no-repeat; } + +#smart_editor2 .se2_qe13 { position: relative; z-index: 10; zoom: 1; } + +#smart_editor2 .se2_qe13 dt { float: left; width: 62px; padding: 3px 0 0; } + +#smart_editor2 .se2_qe13 dt input { width: 15px; height: 15px; margin: -1px 1px 1px -1px; vertical-align: middle; zoom: 1; } + +#smart_editor2 .se2_qe13 dt .se2_qdim2 { width: 32px; } + +#smart_editor2 .se2_qe13 dd .se2_select_ty1 { width: 38px; } + +#smart_editor2 .se2_qe13 dd .se2_select_ty1 span { width: 15px; } + +#smart_editor2 .se2_qe13 dd .input_ty1 { width: 20px; } + +#smart_editor2 .se2_qe13 dd .se2_palette2 .input_ty1 { width: 67px; } + +#smart_editor2 .se2_qe13 .se2_add { *top: 3px; } + +#smart_editor2 .se2_qe13 .se2_del { *top: 11px; } + +#smart_editor2 .se2_qe13 .se2_layer_b_style { right: -2px; _right: 0; } + +#smart_editor2 .se2_qe13 .se2_layer_b_style li span { width: auto; margin: 0 4px 0 5px; padding-top: 2px; } + +#smart_editor2 .se2_qe13 dd { _display: inline; float: left; position: relative; width: 29px; margin-right: 5px; _margin-right: 3px; zoom: 1; } + +#smart_editor2 .se2_qe13 dd .se2_palette h4 { margin-top: 9px; font-family: dotum; font-size: 12px; } + +#smart_editor2 .se2_qe13 dd.dd_type { width: 38px; } + +#smart_editor2 .se2_qe13 dd.dd_type2 { width: 37px; margin-right: 3px; } + +#smart_editor2 .se2_qe13 dd.dd_type2 .input_ty1 { width: 29px; } + +#smart_editor2 .se2_qe13 dd.dd_type2 button { right: 2px; _right: 1px; } + +#smart_editor2 .se2_qe13 dd.dd_type3 { width: 20px; margin: 0; } + +#smart_editor2 .se2_qe13_v1 { _display: inline; float: left; margin: 2px 0 1px; } + +#smart_editor2 .se2_qe13_v1 dt { padding: 4px 0 0 1px; } + +#smart_editor2 .se2_qe13_v2 { _display: inline; float: left; position: relative; z-index: 100; width: 165px; margin: 4px 0 0 1px; zoom: 1; } + +#smart_editor2 .se2_qe13_v2 dd { width: 18px; margin: 0; } + +#smart_editor2 .se2_qeditor .se2_qdim1 { clear: both; position: absolute; top: 25px; left: 115px; width: 60px; height: 23px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim2 { clear: both; position: absolute; top: 55px; left: 24px; z-index: 110; width: 70px; height: 22px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim3 { clear: both; position: absolute; top: 55px; left: 118px; z-index: 110; width: 56px; height: 22px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim4 { clear: both; position: absolute; top: 81px; left: 23px; z-index: 35; width: 116px; height: 35px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim5 { clear: both; position: absolute; top: 31px; left: 106px; width: 68px; height: 26px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim6c { clear: both; position: absolute; top: 25px; left: 28px; width: 29px; height: 23px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim6r { clear: both; position: absolute; top: 25px; left: 57px; width: 29px; height: 23px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_highedit { float: right; width: 56px; height: 21px; margin: -27px 8px 0 0; background: url("../img/ko_KR/btn_set.png?130306") -329px -142px no-repeat; } + +#smart_editor2 .se2_qeditor .se2_qdim7 { clear: both; position: absolute; top: 55px; left: 24px; z-index: 110; width: 150px; height: 48px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim8 { clear: both; position: absolute; top: 105px; left: 24px; z-index: 110; width: 150px; height: 37px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim9 { clear: both; position: absolute; top: 55px; left: 111px; z-index: 110; width: 65px; height: 24px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim10 { clear: both; position: absolute; top: 55px; left: 100px; z-index: 110; width: 77px; height: 24px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +#smart_editor2 .se2_qeditor .se2_qdim11 { clear: both; position: absolute; top: 55px; left: 65px; z-index: 110; width: 115px; height: 24px; background: #fafafa; opacity: 0.5; filter: alpha(opacity=50); } + +/* HELP : ACCESSIBILITY */ +#smart_editor2 .se2_accessibility { z-index: 90; } + +#smart_editor2 .se2_accessibility .se2_in_layer { width: 568px; padding: 0 10px; background: #fafafa; border: 1px solid #bcbbbb; } + +#smart_editor2 .se2_accessibility h3 { margin: 0 -10px; padding: 6px 0 12px 0; background: url("../img/bg_find_h3.gif") repeat-x; font-size: 12px; line-height: 14px; letter-spacing: -1px; } + +#smart_editor2 .se2_accessibility h3 strong { display: inline-block; padding: 4px 0 3px 11px; color: #333; letter-spacing: 0; } + +#smart_editor2 .se2_accessibility .se2_close { position: absolute; top: 10px; right: 12px; width: 13px; height: 12px; background: url("../img/ko_KR/btn_set.png?130306") -155px -5px no-repeat; } + +#smart_editor2 .se2_accessibility .box_help { padding: 0 2px; margin-top: 8px; background: url("../img/bg_help.gif") 0 100% no-repeat; } + +#smart_editor2 .se2_accessibility .box_help div { overflow: hidden; padding: 20px 21px 24px; border-top: 1px solid #d0d0d0; color: #333; } + +#smart_editor2 .se2_accessibility .box_help strong { display: block; margin-bottom: 2px; } + +#smart_editor2 .se2_accessibility .box_help p { margin-bottom: 28px; line-height: 1.5; } + +#smart_editor2 .se2_accessibility .box_help ul { width: 150%; margin-top: 10px; } + +#smart_editor2 .se2_accessibility .box_help li { position: relative; float: left; width: 252px; padding: 5px 0 5px 9px; margin-right: 40px; background: url("../img/ko_KR/btn_set.png?130306") -475px -51px no-repeat; border-right: 1px solid #f0f0f0; *zoom: 1; line-height: 1; } + +#smart_editor2 .se2_accessibility .box_help li span { position: absolute; top: 4px; left: 138px; line-height: 1.2; } + +#smart_editor2 .se2_accessibility .se2_btns { padding: 9px 0 10px; text-align: center; } + +#smart_editor2 .se2_accessibility .se2_btns .se2_close2 { width: 39px; height: 24px; background: url("../img/ko_KR/btn_set.png?130306") -235px -120px no-repeat; } diff --git a/plugin/editor/smarteditor2/css/smart_editor2_out.css b/plugin/editor/smarteditor2/css/smart_editor2_out.css new file mode 100644 index 000000000..fb7412470 --- /dev/null +++ b/plugin/editor/smarteditor2/css/smart_editor2_out.css @@ -0,0 +1,20 @@ +@charset "UTF-8"; +/* NHN Web Standardization Team (http://html.nhndesign.com/) HHJ 090226 */ +/* COMMON */ +.se2_outputarea, .se2_outputarea th, .se2_outputarea td { margin: 0; padding: 0; color: #666; font-size: 12px; font-family: '돋움',Dotum,'굴림',Gulim,Helvetica,Sans-serif; line-height: 1.5; } + +.se2_outputarea p { margin: 0; padding: 0; } + +.se2_outputarea a:hover { text-decoration: underline; } + +.se2_outputarea a:link { color: #0000ff; } + +.se2_outputarea ul { margin: 0 0 0 40px; padding: 0; } + +.se2_outputarea ul li { margin: 0; list-style-type: disc; padding: 0; } + +.se2_outputarea ul ul li { list-style-type: circle; } + +.se2_outputarea ul ul ul li { list-style-type: square; } + +.se2_outputarea img, .se2_outputarea fieldset { border: 0; } diff --git a/plugin/editor/smarteditor2/editor.lib.php b/plugin/editor/smarteditor2/editor.lib.php new file mode 100644 index 000000000..94ffc30f8 --- /dev/null +++ b/plugin/editor/smarteditor2/editor.lib.php @@ -0,0 +1,67 @@ +웹에디터 시작"; + if ($is_dhtml_editor) + $html .= ''; + + if ($is_dhtml_editor && $js) { + $html .= "\n".''; + $html .= "\n".''; + $html .= "\n".''; + $html .= "\n"; + $js = false; + } + + $smarteditor_class = $is_dhtml_editor ? "smarteditor2" : ""; + $html .= "\n"; + $html .= "\n웹 에디터 끝"; + return $html; +} + + +// textarea 로 값을 넘긴다. javascript 반드시 필요 +function get_editor_js($id, $is_dhtml_editor=true) +{ + if ($is_dhtml_editor) { + return "var {$id}_editor_data = oEditors.getById['{$id}'].getIR();\noEditors.getById['{$id}'].exec('UPDATE_CONTENTS_FIELD', []);\n"; + } else { + return "var {$id}_editor = document.getElementById('{$id}');\n"; + } +} + + +// textarea 의 값이 비어 있는지 검사 +function chk_editor_js($id, $is_dhtml_editor=true) +{ + if ($is_dhtml_editor) { + return "if (!{$id}_editor_data || {$id}_editor_data == ' ' || {$id}_editor_data == '

 

' || {$id}_editor_data == '


' || {$id}_editor_data == '

') { alert(\"내용을 입력해 주십시오.\"); oEditors.getById['{$id}'].exec('FOCUS'); return false; }\n"; + } else { + return "if (!{$id}_editor.value) { alert(\"내용을 입력해 주십시오.\"); {$id}_editor.focus(); return false; }\n"; + } +} +?> \ No newline at end of file diff --git a/plugin/editor/smarteditor2/img/bg_b1.png b/plugin/editor/smarteditor2/img/bg_b1.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd0c06fb96d0d38ad4fe581fd31cf2bf5a4a10e GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nR$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GqMj~}Ar-fhQW6ppSd-Y)*fbb83>X+{7&y~5tm^|RVDNPH Kb6Mw<&;$Uf9~={^RHgL z(%jsM`0>-tn>YXd{deci?ccwDA3uKl=g*%%zW;dgF72=ScTQnL2LpOH^US~0i)UHjxoMcx%+mz&Al)UtA2O(=9ex?vckf$A|kTP%(ASk zvP?{}yu7juyy8N9l8jOUQu0#LGV(G4i1@!Yv{mn~cN`Sa(k zTen`ldgcHB|FdV$W&i`l|J)J20SYdOC5b@V#=fE;F*!T6L?J0PJu}Z%>HY5gN(z}N zwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dgxv3?I3Kh9IdBs*0wn~X9 z`AMl(KsHENUr7P1q$Jx`$q^)>0J76LzbI9~RL?*+*}%+D!OTR@(8R#f#8OAW$iUD* z-_S_kz+BhRz{=Fz%D_+o3Y37h6{VzE1-ZCE?E>;_l`=|73as??%gf94%8m8%i_-NC zEiEne4UF`SjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1Uu~h=P6yk;4 z0=Thx#d=`x=q2ap>Q^Kd=o{)8fV>1#=KlDb#X~hD#E>34K5C;EJ)Q4N-fSW zElN%WDpv+sRbb^@l$uzQUlfv`p92fUfQaY~=8hI_rcS1YhOUN=hOWjImga7T#?B^g#+I%y zy)OC5rManjB{01y2)&j#^@5T@ZUN9{m(-%nveXo}qWoM1u$Qeeal6F~r+HAlDY)HY zj#IBb&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CHRJz(fB*dc_4CK~Z(qNB{`B#~ z`*&~Oyngla#q(!RpFDo_@WK6ickkT3b@RscYgeyazI5@z`EzH_oIZ8(#PMTCj~qU9 z@WB3kd-v?#wR6YzZCkf&-n4PU`gLp9tX{Qp#qwoKmn>eiaKZd}bLY&SHFL)FX;Y_6 zo-}bne_wA;cUNaeds}Nub5mnOeO+x$bya0Wd0A;maZzDGeqL@)c2;IadRl5qa#CVK zd|YfybW~(Scvxsia8O`?zn`yFMfd zYiVkztEs9eD=8|-%gM?}OG!$Ii;0Q|3keGF^YQXy^Buv$KFh+tYi^To<#Z(c2Pco^c5kPtcjebxE@vR>|&Dogle9hP5AOwem=Rcg9f VvgXEWv(tC0Hgld~5n^Jn1^{#J-!cFI literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_find_h3.gif b/plugin/editor/smarteditor2/img/bg_find_h3.gif new file mode 100644 index 0000000000000000000000000000000000000000..06627d98250b56f75525c97adf0a19ab0c791bd7 GIT binary patch literal 159 zcmZ?wbhEHbWMoigIKsg2@9)1aUq1i({rl(7pMU@U{rc_emoHzwfB*jL=dVA%e?NWt z^y`^)%+7*gzTJ=CK+HG;8KjfKG)044@r AQUCw| literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_help.gif b/plugin/editor/smarteditor2/img/bg_help.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2aae94ba5ab45792b1c9245acf7310ad7e6bb82 GIT binary patch literal 2360 zcmV-83CH$FNk%w1VK@Tx0mJ|R^z-x3(9p!h#QXdE`T6LyWj9Q49%6> z@A$la&qvXheSw05goTDUe}{^TjE#aZj3rP1s(hGorOSdXU&{0sbEeIDHE-%Mli|jYuRM-SIg8@TnD1TA z%vsUo&Y&%B4o#ZR=hCQcoKDR;+vwJ?*{qID+t2ITxWUZMO?x+Q*uHZ!;-z@$5 zV(;Vks(-)M{{C47V1QB$NT5>&9;j6Rf(jbNV1q(E2%%3BPN-9b7TSbihB9r)p-Ucq zs8Wa`nnYrWBAtk$M=GwUQHw63bX$zh!ARpoHr~k6j5-RJV~+{_2qa8A4vCwPMgoLn zk~9^`BydhXIb4)d8b@W7$z6#hb6RfsT$f%-2WFVnjY%eUW}dlSnreE-W}D%?2`71S z&Us#)cB+SGp6%_)CwzYXIbWcH+DB-i`5lTVe~K>pU!#r+2x+7RPD&|)mR`DGrkXm) zX{Ql>3Mz%7j(TCKrfP_4svRN`fncoObwmWOE*5K_w8DBTuC?we>i`ibpsTNI9if1* zwi0`mvB)ah=dr^&I~KFiO8XW6vj`+>Eq@3co9(vqb*sR);MylHx#i|}uD0n;6~Maf zs_QMg@gmsm1L)R!)w>ViORv61@#`^>B%(BN7CqVMcBPPH=12WSbVFC@{JhRRt1;De< zKvOt$&P88%^v_9mBy`V6H*NCLQfo+c)gAKeK-5^TB(wutGu<_g34qP@*d~@8HrigR zeKy-9mA$~*a66sA0&|O9H$p<=P50g?-JLh!DGL5K;bi-*H{$>Fy}$vBGrms%2jC64 z$k2SCtz=&!Fsx$Lgj9%SsZ>+aC) z1?28KL6jE|Jnh4aQ~dGC^L>Ev!Z%OT^UO;>(DKn+pAYuPYwr#9*?T`a_}z<-6#3>) zj(+;vug^YC?!O-o_wvJUyb<+}F2Vif=Z_2t1uy{q{PzwL7(jsiBj7L$2!H`9P#q)y zKm!x_Kwm^~f)#|I1SIId3@UGf81x`eK-fVMcH@F2G~qTPSb!9&@EQO_;0wWFKpD=E zC=xJ02yf^O5>k+dT=5|gd&t2b4p9{-G~yA#BE%(1BZ*FY;s#r+g)hAy-sRB~uT zEh>Y7S@hyBpeV-waWt`v#ULXZw^+nArtyq!93vd#NR=suk&d&#VioZyi5lLKkFWsa z9s&7@ITA9DhCE~})Tl^Awy}{|NhBoOA<0P=#*TxuBtQ1oMNP88kD2r&UUIlYQ6jOD zrX&k0Qz?&CveGfGeB~t=Da$LyvX+!!;U95X2|e<16rlX2Ep@m{Vcz4G#)Jzplj)gd zGSd*Wd}c14Da}njvYNfbBsMMK%WY2cfW`FYCW#qJafTt9=4|FQ)2YmLvQwRLebE?f-fKkZ3MfezFd^gO635~@&xFtni&c_>81aLXp0S_3mB4J6`e9mAvOQZ(Py4UiG?_z3+AJTH!li`J$D+_qA_X z@w;FBij}|r_3u{!JYWHDmB0r!Fjf(~U7q&1{F}z_7CzZn= z_OMYwJYo?GmBc4D@lR2_VioU{#V>X-PGLM_8P}A?H@2}%alB(4zm&&6_AyI=JY*rK zl*mUmvPqG=WF?Q3$xn9jN1;4rDRY#{SGICSvAkt1Ta?RR_VPr*JZ3RNl+0%~b3@U* zW;H96&2M(|LE$`SIS-W1cee9C@w{g}^OMhi_A@>KJ!nDKlhB7Yv^){LXhpx1(T{eu zG&>& z*0;7bGjY9ZT_=;*zxK5;fjw+t3zOK#Huf)(y=)Q+;MvfQwzQ{B?P^>5+Styvwztjg zZhQON;10LA$4%~XoBQ18PPe+(&F*%)8`>mf?GGeK?|R$&-uTY9zW2@Ve*63101vpp e2Tt&U8~or1Pq@Mt&hUmi{NWIfxWx4x0suSVU$e&m literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_icon_tool.gif b/plugin/editor/smarteditor2/img/bg_icon_tool.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef680ebee2ebd98b06850b1af3e7b4d5414487b8 GIT binary patch literal 103 zcmZ?wbhEHbWMoia*vtR||NsC0`SaKBKYxDy`t|+CkKccO{rK_y`}c3ZfB*jV>(|ep zKYu{@-@XA=D*j|)WMJTD&;jWLnZdv!V$hSg%usWsuS>j7gvgnT3Vg3D1R1OWw2C*G literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_line1.gif b/plugin/editor/smarteditor2/img/bg_line1.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c506a4a18bc89e5d528a378821b1f32ee0a3ef1 GIT binary patch literal 43 scmZ?wbhEHbWMp7sXkcJ?`t<4l|Nj+#vM_*v4u}BBFfcK>a4}c|01d|pvH$=8 literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_quote2.gif b/plugin/editor/smarteditor2/img/bg_quote2.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb8cd04a7e838830dcace5d90b03bd7d31dd473c GIT binary patch literal 56 zcmZ?wbhEHb!F7Ld^{b=IEYp=7? JRxmJF0|1fQ5BUH9 literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_set.gif b/plugin/editor/smarteditor2/img/bg_set.gif new file mode 100644 index 0000000000000000000000000000000000000000..14d09739d40c56324004c0d8d409d26a0bed8e0b GIT binary patch literal 941 zcmc&y{ZCV87`=1l_R`8I;p;+6L4|UuEOSG#ieos`sc2lnLR`OqZE3p5fXsckA4pJC zC=5mGvKcdnaZ8A7leM=WfV4QWF(~aVA)&Z>@B6;@7A+%wL^2uK58dUj*!k&sPEO7_ z$@9E*=zwll;|JK+*n{KP=owuLEzJc>cUK~_MqP$ms^t4)7 z?+**4D+!K8_H>`cembLTs|Y~4Ly_S!Z}E?u@? zxh&uL>K3U4m&&iHGcqLdT)bA2er=OX@}{IZSN#?3a$i!Zs9jQNS^7IK=nB|X?RvRm0Ylq+Ki+d%=Wdw-?w_Kb)`T$qZH?z=cJ$QBUu?j08~EE_l&g<;htNb<`d0Id z_ZMNZZ%fVfBg2lxz&B+lxS3(+L#DsFM}2gJUYZ-I9W)0=T+5N6_XF3Dj=CR3y(gEs z;OOW4)^X1U|K>g3dGwntf9HjywT~BrS1T^Q)Hd?z(!yZbYH)0H^$DEl$v@`1v$hhS zt5=77WB;x`6$0NK^H;Y0{m;rWVElgZQ*f%^^gPoFPZJu#)GRBH!;a@E6grzxXGP~o z%Rr+=@majF^G+MZcj4y`@-}M3gSt!IalU8U@6^pNO6ILXukMW3aA8lSPPkZwm&E$^ ZWqnv^eqD35UuHX8z7(@7o@EhO#eYNFuiO9t literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_text_tool.gif b/plugin/editor/smarteditor2/img/bg_text_tool.gif new file mode 100644 index 0000000000000000000000000000000000000000..60d61def8e0070f2846866c806e634de9d5d1bfd GIT binary patch literal 1123 zcmZ?wbhEHbWMq(KSj52als47YguJQ{>uF6ifOi{A8 zQ?RM9s>m(KO)W`OsL0L9E4HezRZ2|BPfE1{vO&W7N(x{lCE2!0jvxsIke$x?MX3s= zdIq}524;o|W+r-uCI*%!mO2VX28IUuhDQ1Z=DLOkR;K1w28Ieypait7C?(A*$i)q6 z7m#PGlu=SrV5P5LUS6(OZmgGIl&)`RX=$l%V5DzkqzhD`TU?n}l31aeSF8*(!6mgg zxhS)sBr`ux0c2ugQhsTPtrF0s5HI8wz>Uo-)&qM-FF8L~zap_f-%!s0KQ78XXd5kmluQ8`}$gW<`tJD<|U_ky4WfKP0-8COtCUEFfy`qbv1Ic zuy8XpbTxExa<;T|baON^b2KzGF?WXPb;(aI%}vcKf$2>_=rzWv7nBro3xGDeq!wkC zrKY$Q<>xAZy=;|<+bsq-&4cPq!R;19oO<Vgs zyL#pFrHdENpF4Zz^r@34jvqUEVojbN~+qz}*ri~lcuUorj^{SOC zmM>enWbvYf3+B(8J7@N+nKPzOn>uCkq=^&y`+9r2yE;4C+ge+in;IMH>uPJNt12tX z%Sua%iwXi?qaq{1!$L!Xg8~Em{d|4Ay*xeK-CSLq zog5wP?QCtVtt>6f%}h;V~xOjJZzNKk;E wkC%s=i<5($jg^I&iIIUp@h1zojL-p*pmKzPna6@v=AFthqi)gg7c30c0RDfFr~m)} literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/bg_tool2.gif b/plugin/editor/smarteditor2/img/bg_tool2.gif new file mode 100644 index 0000000000000000000000000000000000000000..f96aafb5bbac1a85b473181582fac41010cfab92 GIT binary patch literal 104 zcmZ?wbhEHb=s>#-~6pTP;w)q8_poZbCD;f82R=Ddtm>(rk}>HI!dlFMJQ?)LU~{|_t>aL|zw HX0QeT_nI%< literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/editor_guideline_698.gif b/plugin/editor/smarteditor2/img/editor_guideline_698.gif new file mode 100644 index 0000000000000000000000000000000000000000..96350892c5785f00554f768d4e4a628b0983d88f GIT binary patch literal 139 zcmV;60CfLHNk%w1VK@Q^0Du7i%*@RH|NkNR1OWg50RSuj0000u0tf&A0%D9GfXnR< zqnxzbi?iOm`wxcVNR}q4OzFwC?hD8AOxN~ZuaS=T{tpZahs0uz!ZRwD%%<}RjW&`F ts`QG@YPVdimGSM0$K-YSA=zdoK06Q_GLn;6O literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/editor_guideline_890.gif b/plugin/editor/smarteditor2/img/editor_guideline_890.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a241e1e4a2c712529b68e98e5aac867147eda79 GIT binary patch literal 155 zcmV;M0A&A1Nk%w1Vfg|G0Du7i%*@RH|NkNR1OWg50RSuj0002_0tf&A0&JmtxX9S( JVQ5$Y06W*+P%{7k literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/ico_extend.png b/plugin/editor/smarteditor2/img/ico_extend.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa88ff68f25ca28ba99905d1e4d439f7c564d10 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^AhrhwGm!jIGvx)4k}PqJC<)F_D=AMbN@Z|N$xljE z@XSq2PYp^FE7t_m-N=ns~Z~||NniTmX`Ma|Nk&; z#xkHX&XOR%U?3L^7=ryPgn)u2o-U3d6}Qgx2XZwyaJaaan}7eO?iZY<{mNXZ<@g5~ zfyvDAs;@3M$tp{RPhVj;b(eRd&5n9Efr|kh*CyRRClI`Hx5%yk_S=*`o806(STwQo zR{VZCf3A#&|BI%XcU12rEPw1%6=2qJ=TsRZ8^gt;qC%q6uLc0^XYh3O Kb6Mw<&;$VU3T+Mm literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/icon_set.gif b/plugin/editor/smarteditor2/img/icon_set.gif new file mode 100644 index 0000000000000000000000000000000000000000..842d3944b3a8193357c84e5994343a46d09ee17f GIT binary patch literal 4611 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
5KBLruV-QJQMb^J4 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

MWvXlQ~*6bA`$_0%9LB3fq^{0OFl!d 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

1R(@7~ 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

(ySrQ4+v^(}t7~h^D=TmB{}-~SXQzAn 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 Za-1U_>uAS2;xUhU+#?_RD8qmN06T$RcvAoX literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/ko_KR/text_tool_set.png b/plugin/editor/smarteditor2/img/ko_KR/text_tool_set.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e5be374ae008c217d47a2b7f3485af8166b4a3 GIT binary patch literal 11403 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 literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/photoQuickPopup/btn_cancel.png b/plugin/editor/smarteditor2/img/photoQuickPopup/btn_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..a39adf821dd58a526ba1c728d7f427953537a8e5 GIT binary patch literal 718 zcmeAS@N?(olHy`uVBq!ia0vp^20$#s!3-n?Hl6taq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6|D&H331KH$oTQ&$4?OY`TzgFe<1Y#=g(h%{{or+fBpXb z_s?IT+@HUHfByRU>(_4}0aEer-@m_q|NQ>*`}Z%P)}KHHASOuu&)+}4e*FZ={QmP7 zsOrz3Cr_RL>0dv8{stQN2PgTDNr=_L+|NsA^Oi~F01LGb~7srr_TX&}1ELv(H$jpkMsYP$D(|T#=MV30O?3wgV~U7kn<*0Hy+TTaiMb&Xx~yvX5u=fXWJCnQG1H?jrKS*{sZ!grtd@IJAm z;Oi!hrNs_140GP8YoGt!>alIU-=3FQCPz3`*M8Ubx|g+UKf^EQdH7uBh)SD r+e#Ck&+7NT+^yetzx-7{12aSRp+{GnA6TydracBvS3j3^P6|6H_V+Po~-c6-^HC332`T>*ufEzkmGr@$<)zzkmP!|M&0Luirm^{QUj< z4^Zsy-+%x9{{8d!FHrjD&mVvO{`vFgH&E!`|Nl>(JOK)UKCw`Sa(gQ>TD( z_Z9C=Vqjp@@pN$vskn7#%I&fy0|8gX=C&1_O;PV}RZo7^^Y8!lsVp9g^`;#?o_CGM zxWLTD(ZsSeS!nLLyB2?y7i*l0&y6`6KJ}ut_;G`)+!kza%8tIeEP0$;V0PHIgq1tZ zE(EL3&N7|#{GMT3!pV041W8jM0GGd)Bo+88sJ&c9yL?A^6`0_ z91jIoCyt|*nvAEmy_~}AsiYtzlVVwTF7XwQ=F}8Erh^hUI8Qknooh{!5t*Ezevm=# k*SX#Qh4=6Nq|6H_V+Po~-c6-^HC332`T>*ufEzkmGr@$<)zzkmP!|M&0Luirm^{QUj< z4^Zsy-+%x9{{8d!FHrjD&mVvO{`vFgH&E!`|Nl>(JOK)UFMb|fBrmm>J(7! z4&R(v3=E7qo-U3d6}Rq8xn0&|AmFOl+_r+VDeC>L>dCKq{{6o`mBnMR-n65~^RDq2 z7ns>Nnpl=53(Y-u*W$18VvTe0xiLq>r(U!cKW=c9+k)*)+0j>*C699p%ntjOuyUu_ zg<$pBS*Ej|-!p8h+$4KVfv@<;ovLp!*Afy=Pt0NOG@kTa=i`l>X*W-;N;KK@)FW;4 zOye(;`5ba)ZQB-KB3XTTrtvYWzrE%?+I*R_l$MFgzh8e#vfWyN?R4+M`-Q@LO&+CI z81^L}xlw-pkaYHC^S=zqJc|nV9HL8 kI=B13@c!MOln*czE;wg6Va8S_V6-xLy85}Sb4q9e0KGst2><{9 literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/photoQuickPopup/btn_del.png b/plugin/editor/smarteditor2/img/photoQuickPopup/btn_del.png new file mode 100644 index 0000000000000000000000000000000000000000..9bbf5957e42acad8653dccc3c6927cbd3a054dec GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^d>}RlGmu=zwB8p;NtU=qlmzFem6RtIr7}3CX0{{R3S@g5*0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUyjZjQfMf>~v!^6YJ$H&IT#>&dd$jHdV z#KghJIG&d$!bxVYir;mOI#rlzLa+S+9>hyuA4M`1$$y_V)IUj*jN$=JE0I^78Wf`uhC*{P*|w z_4W1r{r&Uv^Yrxe{{H>|003B;N3s9_0Ru@yK~#9!tdD7Tf-n$8N2$A3yYEFTkVNSF z|39y0Wm5QLxQEGvH_7Ed^6MvseL>HM-xSI>TF4{=%|=Ig+Yx0a{P2B;%@T%cphy1>l>&SrK?Vx10 z{u`#%(E-@SG+#P|o3jRgshCq%<^zCL?*F12 literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/img/text_tool_set2.png b/plugin/editor/smarteditor2/img/text_tool_set2.png new file mode 100644 index 0000000000000000000000000000000000000000..889a3334f9338350a33c0121978f83b833f55a06 GIT binary patch literal 7271 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"); + }catch(e){ + elIFrame = document.createElement("IFRAME"); + elIFrame.setAttribute("frameborder", "0"); + elIFrame.setAttribute("scrolling", "no"); + } + + elIFrame.style.width = "1px"; + elIFrame.style.height = "1px"; + elPlaceHolder.parentNode.insertBefore(elIFrame, elPlaceHolder.nextSibling); + + attachEvent(elIFrame, "load", function(){ + fCreator = elIFrame.contentWindow[fCreator] || elIFrame.contentWindow.createSEditor2; + +// top.document.title = ((new Date())-window.STime); +// window.STime = new Date(); + + try{ + + nEditorWidth = elIFrame.contentWindow.document.body.scrollWidth || "500px"; + nEditorHeight = elIFrame.contentWindow.document.body.scrollHeight + 12; + elIFrame.style.width = "100%"; + elIFrame.style.height = nEditorHeight+ "px"; + elIFrame.contentWindow.document.body.style.margin = "0"; + }catch(e){ + nhn.husky.EZCreator.hideBlocker(true); + elIFrame.style.border = "5px solid red"; + elIFrame.style.width = "500px"; + elIFrame.style.height = "500px"; + alert("Failed to access "+sSkinURI); + return; + } + + var oApp = fCreator(elPlaceHolder, htParams); // oEditor + + + oApp.elPlaceHolder = elPlaceHolder; + + oAppRef[oAppRef.length] = oApp; + if(!oAppRef.getById) oAppRef.getById = {}; + + if(elPlaceHolder.id) oAppRef.getById[elPlaceHolder.id] = oApp; + + oApp.run({fnOnAppReady:fOnAppLoad}); + +// top.document.title += ", "+((new Date())-window.STime); + nhn.husky.EZCreator.hideBlocker(); + }); +// window.STime = new Date(); + elIFrame.src = sSkinURI; + this.elIFrame = elIFrame; + }; + + this.showBlocker = function(){ + if(this.nBlockerCount<1){ + var elBlocker = document.createElement("DIV"); + elBlocker.style.position = "absolute"; + elBlocker.style.top = 0; + elBlocker.style.left = 0; + elBlocker.style.backgroundColor = "#FFFFFF"; + elBlocker.style.width = "100%"; + + document.body.appendChild(elBlocker); + + nhn.husky.EZCreator.elBlocker = elBlocker; + } + + nhn.husky.EZCreator.elBlocker.style.height = Math.max(document.body.scrollHeight, document.body.clientHeight)+"px"; + + this.nBlockerCount++; + }; + + this.hideBlocker = function(bForce){ + if(!bForce){ + if(--this.nBlockerCount > 0) return; + } + + this.nBlockerCount = 0; + + if(nhn.husky.EZCreator.elBlocker) nhn.husky.EZCreator.elBlocker.style.display = "none"; + } +})(); \ No newline at end of file diff --git a/plugin/editor/smarteditor2/js/SE2B_Configuration_General.js b/plugin/editor/smarteditor2/js/SE2B_Configuration_General.js new file mode 100644 index 000000000..ea8b29aac --- /dev/null +++ b/plugin/editor/smarteditor2/js/SE2B_Configuration_General.js @@ -0,0 +1,52 @@ +/* + * Smart Editor 2 Configuration : This setting must be changed by service + */ +window.nhn = window.nhn || {}; +nhn.husky = nhn.husky || {}; +nhn.husky.SE2M_Configuration = nhn.husky.SE2M_Configuration || {}; + +nhn.husky.SE2M_Configuration.Quote = { + sImageBaseURL : 'http://static.se2.naver.com/static/img' +}; + +nhn.husky.SE2M_Configuration.CustomObject = { + sVersion : 1, + sClassName : '__se_object', + sValueName : 'jsonvalue', + sTagIdPrefix : 'se_object_', + sTailComment : '', + sBlankTemplateURL : nhn.husky.SE2M_Configuration.LinkageDomain.sCommonStatic + '/static/db_attach/iframe_template_for_se1_obj.html', + sAttributeOfEmpty : 's_isempty="true"', + sAttributeOfOldDB : 's_olddb="true"', + sBlock : '

', + sBlockTemplate : '', + sHighlight : '
', + sHighlightTemplate : '', + sHtmlTemplateStartTag : '', + sHtmlTemplateEndTag : '', + sHtmlFilterTag : '{=sType}_{=sSubType}_{=nSeq}', + sTplHtmlFilterTag : '', + sImgComServerPath : nhn.husky.SE2M_Configuration.LinkageDomain.sCommonStatic + '/static/img/reviewitem', + nMaxWidth : 548 +}; + +nhn.husky.SE2M_Configuration.SE2M_ReEditAction = { + bUsed : true, + nSecDisplayDulationReEditMsg : 3, + aReEditGuideMsg : [ + '이미지 파일은 1회 클릭 시 크기 조절, 더블클릭 시 재편집이 가능합니다.', + '첨부한 파일을 더블클릭 시 재편집이 가능합니다.', + '첨부한 글양식 테이블을 드래그시 테이블 재편집이 가능합니다.', + '첨부한 표를 드래그 시 표 재편집이 가능합니다.' + ] +}; + +nhn.husky.SE2M_Configuration.SE2M_ColorPalette = { + bUseRecentColor : false +}; + +nhn.husky.SE2M_Configuration.QuickEditor = { + common : { + bUseConfig : false + } +}; \ No newline at end of file diff --git a/plugin/editor/smarteditor2/js/SE2B_Configuration_Service.js b/plugin/editor/smarteditor2/js/SE2B_Configuration_Service.js new file mode 100644 index 000000000..c42a43b52 --- /dev/null +++ b/plugin/editor/smarteditor2/js/SE2B_Configuration_Service.js @@ -0,0 +1,71 @@ +/* + * Smart Editor 2 Configuration : This setting must be changed by service + */ +window.nhn = window.nhn || {}; +nhn.husky = nhn.husky || {}; +nhn.husky.SE2M_Configuration = nhn.husky.SE2M_Configuration || {}; + +/** + * 스마트에디터2에서 접근하는 JS, IMG 디렉토리 + */ +nhn.husky.SE2M_Configuration.Editor = { + sJsBaseURL : './js_src', + sImageBaseURL : './img/' +}; + +/** + * JS LazyLoad를 위한 경로 + */ +nhn.husky.SE2M_Configuration.LazyLoad = { + sJsBaseURI : "js_lazyload" +}; + +/** + * CSS LazyLoad를 위한 경로 + */ +nhn.husky.SE2M_Configuration.SE2B_CSSLoader = { + sCSSBaseURI : "css" +}; + +/** + * 편집영역 설정 + */ +nhn.husky.SE2M_Configuration.SE_EditingAreaManager = { + sCSSBaseURI : "css", + sBlankPageURL : "smart_editor2_inputarea.html", + sBlankPageURL_EmulateIE7 : "smart_editor2_inputarea_ie8.html", + aAddtionalEmulateIE7 : [] // IE8 default 사용, IE9 ~ 선택적 사용 +}; + +/** + * 스마트에디터2에서 사용하는 도메인 정보 + * http://wiki.nhncorp.com/pages/viewpage.action?pageId=74253685 + */ +nhn.husky.SE2M_Configuration.LinkageDomain = { + sCommonAPI : 'http://api.se2.naver.com', + sCommonStatic : 'http://static.se2.naver.com', + sCommonImage : 'http://images.se2.naver.com' +}; + + +/** + * [웹접근성] + * 단축키 ALT+, ALT+. 을 이용하여 스마트에디터 영역의 이전/이후 요소로 이동할 수 있다. + * sBeforeElementId : 스마트에디터 영역 이전 요소의 id + * sNextElementId : 스마트에디터 영역 이후 요소의 id + * + * 스마트에디터 영역 이외의 제목 영역 (예:스마트에디터가 적용된 블로그 쓰기 페이지에서의 제목 영역) 에 해당하는 엘리먼트에서 Tab키를 누르면 에디팅 영역으로 포커스를 이동시킬 수 있다. + * sTitleElementId : 제목에 해당하는 input 요소의 id. + */ +nhn.husky.SE2M_Configuration.SE2M_Accessibility = { + sBeforeElementId : '', + sNextElementId : '', + sTitleElementId : '' +}; + +/** + * 링크 기능 옵션 + */ +nhn.husky.SE2M_Configuration.SE2M_Hyperlink = { + bAutolink : true // 자동링크기능 사용여부(기본값:true) +}; \ No newline at end of file diff --git a/plugin/editor/smarteditor2/js/SE2BasicCreator.js b/plugin/editor/smarteditor2/js/SE2BasicCreator.js new file mode 100644 index 000000000..42d13d1ee --- /dev/null +++ b/plugin/editor/smarteditor2/js/SE2BasicCreator.js @@ -0,0 +1,91 @@ +function createSEditor2(elIRField, htParams, elSeAppContainer){ + if(!window.$Jindo){ + parent.document.body.innerHTML="진도 프레임웍이 필요합니다.
\n
http://dev.naver.com/projects/jindo/download에서 Jindo 1.5.3 버전의 jindo.min.js를 다운로드 받아 /js 폴더에 복사 해 주세요.\n(아직 Jindo 2 는 지원하지 않습니다.)"; + return; + } + + var elAppContainer = (elSeAppContainer || jindo.$("smart_editor2")); + var elEditingArea = jindo.$$.getSingle("DIV.husky_seditor_editing_area_container", elAppContainer); + var oWYSIWYGIFrame = jindo.$$.getSingle("IFRAME.se2_input_wysiwyg", elEditingArea); + var oIRTextarea = elIRField?elIRField:jindo.$$.getSingle("TEXTAREA.blind", elEditingArea); + var oHTMLSrc = jindo.$$.getSingle("TEXTAREA.se2_input_htmlsrc", elEditingArea); + var oTextArea = jindo.$$.getSingle("TEXTAREA.se2_input_text", elEditingArea); + var sEditorMode = "open"; + + if(!htParams){ + htParams = {}; + htParams.fOnBeforeUnload = null; + } + htParams.elAppContainer = elAppContainer; // 에디터 UI 최상위 element 셋팅 + htParams.oNavigator = jindo.$Agent().navigator(); // navigator 객체 셋팅 + + var oEditor = new nhn.husky.HuskyCore(htParams); + oEditor.registerPlugin(new nhn.husky.CorePlugin(htParams?htParams.fOnAppLoad:null)); + oEditor.registerPlugin(new nhn.husky.StringConverterManager()); + + var htDimension = { + nMinHeight:320, + nMinWidth:parseInt(elIRField.style.minWidth, 10)||570, + nHeight:elIRField.style.height||elIRField.offsetHeight, + nWidth:elIRField.style.width||elIRField.offsetWidth + }; + + var htConversionMode = { + bUseVerticalResizer : htParams.bUseVerticalResizer, + bUseModeChanger : htParams.bUseModeChanger + }; + + var aAdditionalFontList = htParams.aAdditionalFontList; + + oEditor.registerPlugin(new nhn.husky.SE_EditingAreaManager("WYSIWYG", oIRTextarea, htDimension, htParams.fOnBeforeUnload, elAppContainer)); + oEditor.registerPlugin(new nhn.husky.SE_EditingArea_WYSIWYG(oWYSIWYGIFrame)); // Tab Editor 모드 + oEditor.registerPlugin(new nhn.husky.SE_EditingArea_HTMLSrc(oHTMLSrc)); // Tab HTML 모드 + oEditor.registerPlugin(new nhn.husky.SE_EditingArea_TEXT(oTextArea)); // Tab Text 모드 + oEditor.registerPlugin(new nhn.husky.SE2M_EditingModeChanger(elAppContainer, htConversionMode)); // 모드간 변경(Editor, HTML, Text) + oEditor.registerPlugin(new nhn.husky.SE_PasteHandler()); // WYSIWYG Paste Handler + + oEditor.registerPlugin(new nhn.husky.HuskyRangeManager(oWYSIWYGIFrame)); + oEditor.registerPlugin(new nhn.husky.Utils()); + oEditor.registerPlugin(new nhn.husky.SE2M_UtilPlugin()); + oEditor.registerPlugin(new nhn.husky.SE_WYSIWYGStyler()); + oEditor.registerPlugin(new nhn.husky.SE2M_Toolbar(elAppContainer)); + + oEditor.registerPlugin(new nhn.husky.Hotkey()); // 단축키 + oEditor.registerPlugin(new nhn.husky.SE_EditingAreaVerticalResizer(elAppContainer, htConversionMode)); // 편집영역 리사이즈 + oEditor.registerPlugin(new nhn.husky.DialogLayerManager()); + oEditor.registerPlugin(new nhn.husky.ActiveLayerManager()); + oEditor.registerPlugin(new nhn.husky.SE_WYSIWYGStyleGetter()); // 커서 위치 스타일 정보 가져오기 + + oEditor.registerPlugin(new nhn.husky.SE2B_Customize_ToolBar(elAppContainer)); // 상단 툴바 (Basic) + oEditor.registerPlugin(new nhn.husky.SE_WYSIWYGEnterKey("P")); // 엔터 시 처리, 현재는 P로 처리 + + oEditor.registerPlugin(new nhn.husky.SE2M_ColorPalette(elAppContainer)); // 색상 팔레트 + oEditor.registerPlugin(new nhn.husky.SE2M_FontColor(elAppContainer)); // 글자색 + oEditor.registerPlugin(new nhn.husky.SE2M_BGColor(elAppContainer)); // 글자배경색 + oEditor.registerPlugin(new nhn.husky.SE2M_FontNameWithLayerUI(elAppContainer, aAdditionalFontList)); // 글꼴종류 + oEditor.registerPlugin(new nhn.husky.SE2M_FontSizeWithLayerUI(elAppContainer)); // 글꼴크기 + + oEditor.registerPlugin(new nhn.husky.SE2M_LineStyler()); + oEditor.registerPlugin(new nhn.husky.SE2M_ExecCommand(oWYSIWYGIFrame)); + oEditor.registerPlugin(new nhn.husky.SE2M_LineHeightWithLayerUI(elAppContainer)); // 줄간격 + + oEditor.registerPlugin(new nhn.husky.SE2M_Quote(elAppContainer)); // 인용구 + oEditor.registerPlugin(new nhn.husky.SE2M_Hyperlink(elAppContainer)); // 링크 + oEditor.registerPlugin(new nhn.husky.SE2M_SCharacter(elAppContainer)); // 특수문자 + oEditor.registerPlugin(new nhn.husky.SE2M_FindReplacePlugin(elAppContainer)); // 찾기/바꾸기 + oEditor.registerPlugin(new nhn.husky.SE2M_TableCreator(elAppContainer)); // 테이블 생성 + oEditor.registerPlugin(new nhn.husky.SE2M_TableEditor(elAppContainer)); // 테이블 편집 + oEditor.registerPlugin(new nhn.husky.SE2M_TableBlockStyler(elAppContainer)); // 테이블 스타일 + oEditor.registerPlugin(new nhn.husky.SE2M_AttachQuickPhoto(elAppContainer)); // 사진 + + oEditor.registerPlugin(new nhn.husky.MessageManager(oMessageMap)); + oEditor.registerPlugin(new nhn.husky.SE2M_QuickEditor_Common(elAppContainer)); // 퀵에디터 공통(표, 이미지) + + oEditor.registerPlugin(new nhn.husky.SE2B_CSSLoader()); // CSS lazy load + oEditor.registerPlugin(new nhn.husky.SE_OuterIFrameControl(elAppContainer, 100)); + + oEditor.registerPlugin(new nhn.husky.SE_ToolbarToggler(elAppContainer, htParams.bUseToolbar)); + oEditor.registerPlugin(new nhn.husky.SE2M_Accessibility(elAppContainer)); // 에디터내의 웹접근성 관련 기능모음 플러그인 + + return oEditor; +} \ No newline at end of file diff --git a/plugin/editor/smarteditor2/js/jindo.min.js b/plugin/editor/smarteditor2/js/jindo.min.js new file mode 100644 index 000000000..538b50318 --- /dev/null +++ b/plugin/editor/smarteditor2/js/jindo.min.js @@ -0,0 +1 @@ +if(typeof window!="undefined"&&typeof window.nhn=="undefined"){window.nhn={};}if(typeof window!="undefined"){if(typeof window.jindo=="undefined"){window.jindo={};}}else{if(!jindo){jindo={};}}jindo.$Jindo=function(){var cl=arguments.callee;var cc=cl._cached;if(cc){return cc;}if(!(this instanceof cl)){return new cl();}if(!cc){cl._cached=this;}this.version="1.5.2";};jindo.$=function(sID){var ret=[],arg=arguments,nArgLeng=arg.length,lastArgument=arg[nArgLeng-1],doc=document,el=null;var reg=/^<([a-z]+|h[1-5])>$/i;var reg2=/^<([a-z]+|h[1-5])(\s+[^>]+)?>/i;if(nArgLeng>1&&typeof lastArgument!="string"&&lastArgument.body){arg=Array.prototype.slice.apply(arg,[0,nArgLeng-1]);doc=lastArgument;}for(var i=0;i-1){if(reg.test(el)){el=doc.createElement(RegExp.$1);}else{if(reg2.test(el)){var p={thead:"table",tbody:"table",tr:"tbody",td:"tr",dt:"dl",dd:"dl",li:"ul",legend:"fieldset",option:"select"};var tag=RegExp.$1.toLowerCase();var ele=jindo._createEle(p[tag],el,doc);for(var i=0,leng=ele.length;i1?ret:(ret[0]||null);};jindo._createEle=function(sParentTag,sHTML,oDoc,bWantParent){var sId="R"+new Date().getTime()+parseInt(Math.random()*100000,10);var oDummy=oDoc.createElement("div");switch(sParentTag){case"select":case"table":case"dl":case"ul":case"fieldset":oDummy.innerHTML="<"+sParentTag+' class="'+sId+'">'+sHTML+"";break;case"thead":case"tbody":case"col":oDummy.innerHTML="<"+sParentTag+' class="'+sId+'">'+sHTML+"
";break;case"tr":oDummy.innerHTML=''+sHTML+"
";break;default:oDummy.innerHTML='
'+sHTML+"
";break;}var oFound;for(oFound=oDummy.firstChild;oFound;oFound=oFound.firstChild){if(oFound.className==sId){break;}}return bWantParent?oFound:oFound.childNodes;};jindo.$Class=function(oDef){function typeClass(){var t=this;var a=[];var superFunc=function(m,superClass,func){if(m!="constructor"&&func.toString().indexOf("$super")>-1){var funcArg=func.toString().replace(/function\s*\(([^\)]*)[\w\W]*/g,"$1").split(",");var funcStr=func.toString().replace(/function[^{]*{/,"").replace(/(\w|\.?)(this\.\$super|this)/g,function(m,m2,m3){if(!m2){return m3+".$super";}return m;});funcStr=funcStr.substr(0,funcStr.length-1);func=superClass[m]=eval("false||function("+funcArg.join(",")+"){"+funcStr+"}");}return function(){var f=this.$this[m];var t=this.$this;var r=(t[m]=func).apply(t,arguments);t[m]=f;return r;};};while(typeof t._$superClass!="undefined"){t.$super=new Object;t.$super.$this=this;for(var x in t._$superClass.prototype){if(t._$superClass.prototype.hasOwnProperty(x)){if(typeof this[x]=="undefined"&&x!="$init"){this[x]=t._$superClass.prototype[x];}if(x!="constructor"&&x!="_$superClass"&&typeof t._$superClass.prototype[x]=="function"){t.$super[x]=superFunc(x,t._$superClass,t._$superClass.prototype[x]);}else{t.$super[x]=t._$superClass.prototype[x];}}}if(typeof t.$super.$init=="function"){a[a.length]=t;}t=t.$super;}for(var i=a.length-1;i>-1;i--){a[i].$super.$init.apply(a[i].$super,arguments);}if(typeof this.$init=="function"){this.$init.apply(this,arguments);}}if(typeof oDef.$static!="undefined"){var i=0,x;for(x in oDef){if(oDef.hasOwnProperty(x)){x=="$static"||i++;}}for(x in oDef.$static){if(oDef.$static.hasOwnProperty(x)){typeClass[x]=oDef.$static[x];}}if(!i){return oDef.$static;}delete oDef.$static;}typeClass.prototype=oDef;typeClass.prototype.constructor=typeClass;typeClass.extend=jindo.$Class.extend;return typeClass;};jindo.$Class.extend=function(superClass){if(typeof superClass=="undefined"||superClass===null||!superClass.extend){throw new Error("extend시 슈퍼 클래스는 Class여야 합니다.");}this.prototype._$superClass=superClass;for(var x in superClass){if(superClass.hasOwnProperty(x)){if(x=="prototype"){continue;}this[x]=superClass[x];}}return this;};jindo.$$=jindo.cssquery=(function(){var sVersion="3.0";var debugOption={repeat:1};var UID=1;var cost=0;var validUID={};var bSupportByClassName=document.getElementsByClassName?true:false;var safeHTML=false;var getUID4HTML=function(oEl){var nUID=safeHTML?(oEl._cssquery_UID&&oEl._cssquery_UID[0]):oEl._cssquery_UID;if(nUID&&validUID[nUID]==oEl){return nUID;}nUID=UID++;oEl._cssquery_UID=safeHTML?[nUID]:nUID;validUID[nUID]=oEl;return nUID;};var getUID4XML=function(oEl){var oAttr=oEl.getAttribute("_cssquery_UID");var nUID=safeHTML?(oAttr&&oAttr[0]):oAttr;if(!nUID){nUID=UID++;oEl.setAttribute("_cssquery_UID",safeHTML?[nUID]:nUID);}return nUID;};var getUID=getUID4HTML;var uniqid=function(sPrefix){return(sPrefix||"")+new Date().getTime()+parseInt(Math.random()*100000000,10);};function getElementsByClass(searchClass,node,tag){var classElements=new Array();if(node==null){node=document;}if(tag==null){tag="*";}var els=node.getElementsByTagName(tag);var elsLen=els.length;var pattern=new RegExp("(^|\\s)"+searchClass+"(\\s|$)");for(i=0,j=0;i -1)';case"^=":return"("+sVar+" && "+sVar+".indexOf("+sVal+") == 0)";case"$=":return"("+sVar+" && "+sVar+".substr("+sVar+".length - "+oExpr.val.length+") == "+sVal+")";case"*=":return"("+sVar+" && "+sVar+".indexOf("+sVal+") > -1)";case"!=":return"("+sVar+" != "+sVal+")";case"=":return"("+sVar+" == "+sVal+")";}return"("+sVar+")";};var getNodeIndex=function(oEl){var nUID=getUID(oEl);var nIndex=oNodeIndexes[nUID]||0;if(nIndex==0){for(var oSib=(oEl.parentNode||oEl._IE5_parentNode).firstChild;oSib;oSib=oSib.nextSibling){if(oSib.nodeType!=1){continue;}nIndex++;setNodeIndex(oSib,nIndex);}nIndex=oNodeIndexes[nUID];}return nIndex;};var oNodeIndexes={};var setNodeIndex=function(oEl,nIndex){var nUID=getUID(oEl);oNodeIndexes[nUID]=nIndex;};var unsetNodeIndexes=function(){setTimeout(function(){oNodeIndexes={};},0);};var oPseudoes_dontShrink={contains:function(oEl,sOption){return(oEl.innerText||oEl.textContent||"").indexOf(sOption)>-1;},"last-child":function(oEl,sOption){for(oEl=oEl.nextSibling;oEl;oEl=oEl.nextSibling){if(oEl.nodeType==1){return false;}}return true;},"first-child":function(oEl,sOption){for(oEl=oEl.previousSibling;oEl;oEl=oEl.previousSibling){if(oEl.nodeType==1){return false;}}return true;},"only-child":function(oEl,sOption){var nChild=0;for(var oChild=(oEl.parentNode||oEl._IE5_parentNode).firstChild;oChild;oChild=oChild.nextSibling){if(oChild.nodeType==1){nChild++;}if(nChild>1){return false;}}return nChild?true:false;},empty:function(oEl,_){return oEl.firstChild?false:true;},"nth-child":function(oEl,nMul,nAdd){var nIndex=getNodeIndex(oEl);return nIndex%nMul==nAdd;},"nth-last-child":function(oEl,nMul,nAdd){var oLast=(oEl.parentNode||oEl._IE5_parentNode).lastChild;for(;oLast;oLast=oLast.previousSibling){if(oLast.nodeType==1){break;}}var nTotal=getNodeIndex(oLast);var nIndex=getNodeIndex(oEl);var nLastIndex=nTotal-nIndex+1;return nLastIndex%nMul==nAdd;},checked:function(oEl){return !!oEl.checked;},selected:function(oEl){return !!oEl.selected;},enabled:function(oEl){return !oEl.disabled;},disabled:function(oEl){return !!oEl.disabled;}};var getExpression=function(sBody){var oRet={defines:"",returns:"true"};var sBody=restoreKeys(sBody,true);var aExprs=[];var aDefineCode=[],aReturnCode=[];var sId,sTagName;var sBody=sBody.replace(/:([\w-]+)(\(([^)]*)\))?/g,function(_1,sType,_2,sOption){switch(sType){case"not":var oInner=getExpression(sOption);var sFuncDefines=oInner.defines;var sFuncReturns=oInner.returnsID+oInner.returnsTAG+oInner.returns;aReturnCode.push("!(function() { "+sFuncDefines+" return "+sFuncReturns+" })()");break;case"nth-child":case"nth-last-child":sOption=restoreString(sOption);if(sOption=="even"){sOption="2n";}else{if(sOption=="odd"){sOption="2n+1";}}var nMul,nAdd;var matchstr=sOption.match(/([0-9]*)n([+-][0-9]+)*/);if(matchstr){nMul=matchstr[1]||1;nAdd=matchstr[2]||0;}else{nMul=Infinity;nAdd=parseInt(sOption,10);}aReturnCode.push("oPseudoes_dontShrink["+wrapQuot(sType)+"](oEl, "+nMul+", "+nAdd+")");break;case"first-of-type":case"last-of-type":sType=(sType=="first-of-type"?"nth-of-type":"nth-last-of-type");sOption=1;case"nth-of-type":case"nth-last-of-type":sOption=restoreString(sOption);if(sOption=="even"){sOption="2n";}else{if(sOption=="odd"){sOption="2n+1";}}var nMul,nAdd;if(/([0-9]*)n([+-][0-9]+)*/.test(sOption)){nMul=parseInt(RegExp.$1,10)||1;nAdd=parseInt(RegExp.$2,20)||0;}else{nMul=Infinity;nAdd=parseInt(sOption,10);}oRet.nth=[nMul,nAdd,sType];break;default:sOption=sOption?restoreString(sOption):"";aReturnCode.push("oPseudoes_dontShrink["+wrapQuot(sType)+"](oEl, "+wrapQuot(sOption)+")");break;}return"";});var sBody=sBody.replace(/\[(@?[\w-]+)(([!^~$*]?=)([^\]]*))?\]/g,function(_1,sKey,_2,sOp,sVal){sKey=restoreString(sKey);sVal=restoreString(sVal);if(sKey=="checked"||sKey=="disabled"||sKey=="enabled"||sKey=="readonly"||sKey=="selected"){if(!sVal){sOp="=";sVal="true";}}aExprs.push({key:sKey,op:sOp,val:sVal});return"";});var sClassName=null;var sBody=sBody.replace(/\.([\w-]+)/g,function(_,sClass){aExprs.push({key:"class",op:"~=",val:sClass});if(!sClassName){sClassName=sClass;}return"";});var sBody=sBody.replace(/#([\w-]+)/g,function(_,sIdValue){if(bXMLDocument){aExprs.push({key:"id",op:"=",val:sIdValue});}else{sId=sIdValue;}return"";});sTagName=sBody=="*"?"":sBody;var oVars={};for(var i=0,oExpr;oExpr=aExprs[i];i++){var sKey=oExpr.key;if(!oVars[sKey]){aDefineCode.push(getDefineCode(sKey));}aReturnCode.unshift(getReturnCode(oExpr));oVars[sKey]=true;}if(aDefineCode.length){oRet.defines="var "+aDefineCode.join(",")+";";}if(aReturnCode.length){oRet.returns=aReturnCode.join("&&");}oRet.quotID=sId?wrapQuot(sId):"";oRet.quotTAG=sTagName?wrapQuot(bXMLDocument?sTagName:sTagName.toUpperCase()):"";if(bSupportByClassName){oRet.quotCLASS=sClassName?wrapQuot(sClassName):"";}oRet.returnsID=sId?"oEl.id == "+oRet.quotID+" && ":"";oRet.returnsTAG=sTagName&&sTagName!="*"?"oEl.tagName == "+oRet.quotTAG+" && ":"";return oRet;};var splitToParts=function(sQuery){var aParts=[];var sRel=" ";var sBody=sQuery.replace(/(.*?)\s*(!?[+>~ ]|!)\s*/g,function(_,sBody,sRelative){if(sBody){aParts.push({rel:sRel,body:sBody});}sRel=sRelative.replace(/\s+$/g,"")||" ";return"";});if(sBody){aParts.push({rel:sRel,body:sBody});}return aParts;};var isNth_dontShrink=function(oEl,sTagName,nMul,nAdd,sDirection){var nIndex=0;for(var oSib=oEl;oSib;oSib=oSib[sDirection]){if(oSib.nodeType==1&&(!sTagName||sTagName==oSib.tagName)){nIndex++;}}return nIndex%nMul==nAdd;};var compileParts=function(aParts){var aPartExprs=[];for(var i=0,oPart;oPart=aParts[i];i++){aPartExprs.push(getExpression(oPart.body));}var sFunc="";var sPushCode="aRet.push(oEl); if (oOptions.single) { bStop = true; }";for(var i=aParts.length-1,oPart;oPart=aParts[i];i--){var oExpr=aPartExprs[i];var sPush=(debugOption.callback?"cost++;":"")+oExpr.defines;var sReturn="if (bStop) {"+(i==0?"return aRet;":"return;")+"}";if(oExpr.returns=="true"){sPush+=(sFunc?sFunc+"(oEl);":sPushCode)+sReturn;}else{sPush+="if ("+oExpr.returns+") {"+(sFunc?sFunc+"(oEl);":sPushCode)+sReturn+"}";}var sCheckTag="oEl.nodeType != 1";if(oExpr.quotTAG){sCheckTag="oEl.tagName != "+oExpr.quotTAG;}var sTmpFunc="(function(oBase"+(i==0?", oOptions) { var bStop = false; var aRet = [];":") {");if(oExpr.nth){sPush="if (isNth_dontShrink(oEl, "+(oExpr.quotTAG?oExpr.quotTAG:"false")+","+oExpr.nth[0]+","+oExpr.nth[1]+',"'+(oExpr.nth[2]=="nth-of-type"?"previousSibling":"nextSibling")+'")) {'+sPush+"}";}switch(oPart.rel){case" ":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");var oCandi = oEl;for (; oCandi; oCandi = (oCandi.parentNode || oCandi._IE5_parentNode)) {if (oCandi == oBase) break;}if (!oCandi || "+sCheckTag+") return aRet;"+sPush;}else{sTmpFunc+="var aCandi = getChilds_dontShrink(oBase, "+(oExpr.quotTAG||'"*"')+", "+(oExpr.quotCLASS||"null")+");for (var i = 0, oEl; oEl = aCandi[i]; i++) {"+(oExpr.quotCLASS?"if ("+sCheckTag+") continue;":"")+sPush+"}";}break;case">":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");if ((oEl.parentNode || oEl._IE5_parentNode) != oBase || "+sCheckTag+") return aRet;"+sPush;}else{sTmpFunc+="for (var oEl = oBase.firstChild; oEl; oEl = oEl.nextSibling) {if ("+sCheckTag+") { continue; }"+sPush+"}";}break;case"+":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");var oPrev;for (oPrev = oEl.previousSibling; oPrev; oPrev = oPrev.previousSibling) { if (oPrev.nodeType == 1) break; }if (!oPrev || oPrev != oBase || "+sCheckTag+") return aRet;"+sPush;}else{sTmpFunc+="for (var oEl = oBase.nextSibling; oEl; oEl = oEl.nextSibling) { if (oEl.nodeType == 1) break; }if (!oEl || "+sCheckTag+") { return aRet; }"+sPush;}break;case"~":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");var oCandi = oEl;for (; oCandi; oCandi = oCandi.previousSibling) { if (oCandi == oBase) break; }if (!oCandi || "+sCheckTag+") return aRet;"+sPush;}else{sTmpFunc+="for (var oEl = oBase.nextSibling; oEl; oEl = oEl.nextSibling) {if ("+sCheckTag+") { continue; }if (!markElement_dontShrink(oEl, "+i+")) { break; }"+sPush+"}";}break;case"!":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");for (; oBase; oBase = (oBase.parentNode || oBase._IE5_parentNode)) { if (oBase == oEl) break; }if (!oBase || "+sCheckTag+") return aRet;"+sPush;}else{sTmpFunc+="for (var oEl = (oBase.parentNode || oBase._IE5_parentNode); oEl; oEl = (oEl.parentNode || oEl._IE5_parentNode)) {if ("+sCheckTag+") { continue; }"+sPush+"}";}break;case"!>":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");var oRel = (oBase.parentNode || oBase._IE5_parentNode);if (!oRel || oEl != oRel || ("+sCheckTag+")) return aRet;"+sPush;}else{sTmpFunc+="var oEl = (oBase.parentNode || oBase._IE5_parentNode);if (!oEl || "+sCheckTag+") { return aRet; }"+sPush;}break;case"!+":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");var oRel;for (oRel = oBase.previousSibling; oRel; oRel = oRel.previousSibling) { if (oRel.nodeType == 1) break; }if (!oRel || oEl != oRel || ("+sCheckTag+")) return aRet;"+sPush;}else{sTmpFunc+="for (oEl = oBase.previousSibling; oEl; oEl = oEl.previousSibling) { if (oEl.nodeType == 1) break; }if (!oEl || "+sCheckTag+") { return aRet; }"+sPush;}break;case"!~":if(oExpr.quotID){sTmpFunc+="var oEl = oDocument_dontShrink.getElementById("+oExpr.quotID+");var oRel;for (oRel = oBase.previousSibling; oRel; oRel = oRel.previousSibling) { if (oRel.nodeType != 1) { continue; }if (oRel == oEl) { break; }}if (!oRel || ("+sCheckTag+")) return aRet;"+sPush;}else{sTmpFunc+="for (oEl = oBase.previousSibling; oEl; oEl = oEl.previousSibling) {if ("+sCheckTag+") { continue; }if (!markElement_dontShrink(oEl, "+i+")) { break; }"+sPush+"}";}break;}sTmpFunc+=(i==0?"return aRet;":"")+"})";sFunc=sTmpFunc;}eval("var fpCompiled = "+sFunc+";");return fpCompiled;};var parseQuery=function(sQuery){var sCacheKey=sQuery;var fpSelf=arguments.callee;var fpFunction=fpSelf._cache[sCacheKey];if(!fpFunction){sQuery=backupKeys(sQuery);var aParts=splitToParts(sQuery);fpFunction=fpSelf._cache[sCacheKey]=compileParts(aParts);fpFunction.depth=aParts.length;}return fpFunction;};parseQuery._cache={};var parseTestQuery=function(sQuery){var fpSelf=arguments.callee;var aSplitQuery=backupKeys(sQuery).split(/\s*,\s*/);var aResult=[];var nLen=aSplitQuery.length;var aFunc=[];for(var i=0;i"+sTag+":nth-of-type("+sTh+")";});return old_cssquery(sXPath,oParent);};cssquery.debug=function(fpCallback,nRepeat){debugOption.callback=fpCallback;debugOption.repeat=nRepeat||1;};cssquery.safeHTML=function(bFlag){var bIE=/MSIE/.test(window.navigator.userAgent);if(arguments.length>0){safeHTML=bFlag&&bIE;}return safeHTML||!bIE;};cssquery.version=sVersion;cssquery.release=function(){if(/MSIE/.test(window.navigator.userAgent)){delete validUID;validUID={};if(bUseResultCache){cssquery.clearCache();}}};cssquery._getCacheInfo=function(){return{uidCache:validUID,eleCache:oResultCache};};cssquery._resetUID=function(){UID=0;};cssquery.extreme=function(bExtreme){if(arguments.length==0){bExtreme=true;}bExtremeMode=bExtreme;};return cssquery;})();jindo.$Agent=function(){var cl=arguments.callee;var cc=cl._cached;if(cc){return cc;}if(!(this instanceof cl)){return new cl;}if(!cc){cl._cached=this;}this._navigator=navigator;this._dm=document.documentMode;};jindo.$Agent.prototype.navigator=function(){var info={},ver=-1,nativeVersion=-1,u=this._navigator.userAgent,v=this._navigator.vendor||"",dm=this._dm;function f(s,h){return((h||"").indexOf(s)>-1);}info.getName=function(){var name="";for(x in info){if(typeof info[x]=="boolean"&&info[x]&&info.hasOwnProperty(x)){name=x;}}return name;};info.webkit=f("WebKit",u);info.opera=(window.opera!==undefined)||f("Opera",u);info.ie=!info.opera&&(f("MSIE",u)||f("Trident",u));info.chrome=info.webkit&&f("Chrome",u);info.safari=info.webkit&&!info.chrome&&f("Apple",v);info.firefox=f("Firefox",u);info.mozilla=f("Gecko",u)&&!info.safari&&!info.chrome&&!info.firefox&&!info.ie;info.camino=f("Camino",v);info.netscape=f("Netscape",u);info.omniweb=f("OmniWeb",u);info.icab=f("iCab",v);info.konqueror=f("KDE",v);info.mobile=(f("Mobile",u)||f("Android",u)||f("Nokia",u)||f("webOS",u)||f("Opera Mini",u)||f("BlackBerry",u)||(f("Windows",u)&&f("PPC",u))||f("Smartphone",u)||f("IEMobile",u))&&!f("iPad",u);info.msafari=(!f("IEMobile",u)&&f("Mobile",u))||(f("iPad",u)&&f("Safari",u));info.mopera=f("Opera Mini",u);info.mie=f("PPC",u)||f("Smartphone",u)||f("IEMobile",u);try{if(info.ie){if(dm>0){ver=dm;if(u.match(/(?:Trident)\/([0-9.]+)/)){var nTridentNum=parseFloat(RegExp.$1,10);if(nTridentNum>3){nativeVersion=nTridentNum+4;}}else{nativeVersion=ver;}}else{nativeVersion=ver=u.match(/(?:MSIE) ([0-9.]+)/)[1];}}else{if(info.safari||info.msafari){ver=parseFloat(u.match(/Safari\/([0-9.]+)/)[1]);if(ver==100){ver=1.1;}else{if(u.match(/Version\/([0-9.]+)/)){ver=RegExp.$1;}else{ver=[1,1.2,-1,1.3,2,3][Math.floor(ver/100)];}}}else{if(info.mopera){ver=u.match(/(?:Opera\sMini)\/([0-9.]+)/)[1];}else{if(info.firefox||info.opera||info.omniweb){ver=u.match(/(?:Firefox|Opera|OmniWeb)\/([0-9.]+)/)[1];}else{if(info.mozilla){ver=u.match(/rv:([0-9.]+)/)[1];}else{if(info.icab){ver=u.match(/iCab[ \/]([0-9.]+)/)[1];}else{if(info.chrome){ver=u.match(/Chrome[ \/]([0-9.]+)/)[1];}}}}}}}info.version=parseFloat(ver);info.nativeVersion=parseFloat(nativeVersion);if(isNaN(info.version)){info.version=-1;}}catch(e){info.version=-1;}this.navigator=function(){return info;};return info;};jindo.$Agent.prototype.os=function(){var info=new Object;var u=this._navigator.userAgent;var p=this._navigator.platform;var f=function(s,h){return(h.indexOf(s)>-1);};info.getName=function(){var name="";for(x in info){if(typeof info[x]=="boolean"&&info[x]&&info.hasOwnProperty(x)){name=x;}}return name;};info.win=f("Win",p);info.mac=f("Mac",p);info.linux=f("Linux",p);info.win2000=info.win&&(f("NT 5.0",u)||f("2000",u));info.winxp=info.win&&f("NT 5.1",u);info.xpsp2=info.winxp&&f("SV1",u);info.vista=info.win&&f("NT 6.0",u);info.win7=info.win&&f("NT 6.1",u);info.ipad=f("iPad",u);info.iphone=f("iPhone",u)&&!info.ipad;info.android=f("Android",u);info.nokia=f("Nokia",u);info.webos=f("webOS",u);info.blackberry=f("BlackBerry",u);info.mwin=f("PPC",u)||f("Smartphone",u)||f("IEMobile",u);this.os=function(){return info;};return info;};jindo.$Agent.prototype.flash=function(){var info=new Object;var p=this._navigator.plugins;var m=this._navigator.mimeTypes;var f=null;info.installed=false;info.version=-1;if(typeof p!="undefined"&&p.length){f=p["Shockwave Flash"];if(f){info.installed=true;if(f.description){info.version=parseFloat(f.description.match(/[0-9.]+/)[0]);}}if(p["Shockwave Flash 2.0"]){info.installed=true;info.version=2;}}else{if(typeof m!="undefined"&&m.length){f=m["application/x-shockwave-flash"];info.installed=(f&&f.enabledPlugin);}else{for(var i=10;i>1;i--){try{f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+i);info.installed=true;info.version=i;break;}catch(e){}}}}this.flash=function(){return info;};this.info=this.flash;return info;};jindo.$Agent.prototype.silverlight=function(){var info=new Object;var p=this._navigator.plugins;var s=null;info.installed=false;info.version=-1;if(typeof p!="undefined"&&p.length){s=p["Silverlight Plug-In"];if(s){info.installed=true;info.version=parseInt(s.description.split(".")[0],10);if(s.description=="1.0.30226.2"){info.version=2;}}}else{try{s=new ActiveXObject("AgControl.AgControl");info.installed=true;if(s.isVersionSupported("3.0")){info.version=3;}else{if(s.isVersionSupported("2.0")){info.version=2;}else{if(s.isVersionSupported("1.0")){info.version=1;}}}}catch(e){}}this.silverlight=function(){return info;};return info;};jindo.$A=function(array){var cl=arguments.callee;if(typeof array=="undefined"||array==null){array=[];}if(array instanceof cl){return array;}if(!(this instanceof cl)){return new cl(array);}this._array=[];if(array.constructor!=String){this._array=[];for(var i=0;i-1);};jindo.$A.prototype.indexOf=function(oValue){if(typeof this._array.indexOf!="undefined"){jindo.$A.prototype.indexOf=function(oValue){return this._array.indexOf(oValue);};}else{jindo.$A.prototype.indexOf=function(oValue){for(var i=0;iMath.random()?1:-1;});return this;};jindo.$A.prototype.reverse=function(){this._array.reverse();return this;};jindo.$A.prototype.empty=function(){return this.length(0);};jindo.$A.Break=function(){if(!(this instanceof arguments.callee)){throw new arguments.callee;}};jindo.$A.Continue=function(){if(!(this instanceof arguments.callee)){throw new arguments.callee;}};jindo.$A.prototype.map=function(fCallback,oThis){if(typeof this._array.map=="function"){jindo.$A.prototype.map=function(fCallback,oThis){var arr=this._array;var errBreak=this.constructor.Break;var errContinue=this.constructor.Continue;function f(v,i,a){try{return fCallback.call(oThis,v,i,a);}catch(e){if(e instanceof errContinue){return v;}else{throw e;}}}try{this._array=this._array.map(f);}catch(e){if(!(e instanceof errBreak)){throw e;}}return this;};}else{jindo.$A.prototype.map=function(fCallback,oThis){var arr=this._array;var returnArr=[];var errBreak=this.constructor.Break;var errContinue=this.constructor.Continue;function f(v,i,a){try{return fCallback.call(oThis,v,i,a);}catch(e){if(e instanceof errContinue){return v;}else{throw e;}}}for(var i=0;i=b.length){b[j]=a[i];}}this._array=b;return this;};jindo.$Ajax=function(url,option){var cl=arguments.callee;if(!(this instanceof cl)){return new cl(url,option);}function _getXHR(){if(window.XMLHttpRequest){return new XMLHttpRequest();}else{if(ActiveXObject){try{return new ActiveXObject("MSXML2.XMLHTTP");}catch(e){return new ActiveXObject("Microsoft.XMLHTTP");}return null;}}}var loc=location.toString();var domain="";try{domain=loc.match(/^https?:\/\/([a-z0-9_\-\.]+)/i)[1];}catch(e){}this._status=0;this._url=url;this._options=new Object;this._headers=new Object;this._options={type:"xhr",method:"post",proxy:"",timeout:0,onload:function(req){},onerror:null,ontimeout:function(req){},jsonp_charset:"utf-8",callbackid:"",callbackname:"",sendheader:true,async:true,decode:true,postBody:false};this.option(option);if(jindo.$Ajax.CONFIG){this.option(jindo.$Ajax.CONFIG);}var _opt=this._options;_opt.type=_opt.type.toLowerCase();_opt.method=_opt.method.toLowerCase();if(typeof window.__jindo2_callback=="undefined"){window.__jindo2_callback=new Array();}switch(_opt.type){case"put":case"delete":case"get":case"post":_opt.method=_opt.type;_opt.type="xhr";case"xhr":this._request=_getXHR();break;case"flash":if(!jindo.$Ajax.SWFRequest){throw Error("Require jindo.$Ajax.SWFRequest");}this._request=new jindo.$Ajax.SWFRequest(jindo.$Fn(this.option,this).bind());break;case"jsonp":if(!jindo.$Ajax.JSONPRequest){throw Error("Require jindo.$Ajax.JSONPRequest");}_opt.method="get";this._request=new jindo.$Ajax.JSONPRequest(jindo.$Fn(this.option,this).bind());break;case"iframe":if(!jindo.$Ajax.FrameRequest){throw Error("Require jindo.$Ajax.FrameRequest");}this._request=new jindo.$Ajax.FrameRequest(jindo.$Fn(this.option,this).bind());break;}};jindo.$Ajax.prototype._onload=(function(isIE){if(isIE){return function(){var bSuccess=this._request.readyState==4&&this._request.status==200;var oResult;if(this._request.readyState==4){try{if(this._request.status!=200&&typeof this._options.onerror=="function"){if(!this._request.status==0){this._options.onerror(jindo.$Ajax.Response(this._request));}}else{if(!this._is_abort){oResult=this._options.onload(jindo.$Ajax.Response(this._request));}}}finally{if(typeof this._oncompleted=="function"){this._oncompleted(bSuccess,oResult);}if(this._options.type=="xhr"){this.abort();try{delete this._request.onload;}catch(e){this._request.onload=undefined;}}delete this._request.onreadystatechange;}}};}else{return function(){var bSuccess=this._request.readyState==4&&this._request.status==200;var oResult;if(this._request.readyState==4){try{if(this._request.status!=200&&typeof this._options.onerror=="function"){this._options.onerror(jindo.$Ajax.Response(this._request));}else{oResult=this._options.onload(jindo.$Ajax.Response(this._request));}}finally{this._status--;if(typeof this._oncompleted=="function"){this._oncompleted(bSuccess,oResult);}}}};}})(/MSIE/.test(window.navigator.userAgent));jindo.$Ajax.prototype.request=function(oData){this._status++;var t=this;var req=this._request;var opt=this._options;var data,v,a=[],data="";var _timer=null;var url=this._url;this._is_abort=false;if(opt.postBody&&opt.type.toUpperCase()=="XHR"&&opt.method.toUpperCase()!="GET"){if(typeof oData=="string"){data=oData;}else{data=jindo.$Json(oData).toString();}}else{if(typeof oData=="undefined"||!oData){data=null;}else{for(var k in oData){if(oData.hasOwnProperty(k)){v=oData[k];if(typeof v=="function"){v=v();}if(v instanceof Array||v instanceof jindo.$A){jindo.$A(v).forEach(function(value,index,array){a[a.length]=k+"="+encodeURIComponent(value);});}else{a[a.length]=k+"="+encodeURIComponent(v);}}}data=a.join("&");}}if(data&&opt.type.toUpperCase()=="XHR"&&opt.method.toUpperCase()=="GET"){if(url.indexOf("?")==-1){url+="?";}else{url+="&";}url+=data;data=null;}req.open(opt.method.toUpperCase(),url,opt.async);if(opt.type.toUpperCase()=="XHR"&&opt.method.toUpperCase()=="GET"&&/MSIE/.test(window.navigator.userAgent)){req.setRequestHeader("If-Modified-Since","Thu, 1 Jan 1970 00:00:00 GMT");}if(opt.sendheader){if(!this._headers["Content-Type"]){req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");}req.setRequestHeader("charset","utf-8");for(var x in this._headers){if(this._headers.hasOwnProperty(x)){if(typeof this._headers[x]=="function"){continue;}req.setRequestHeader(x,String(this._headers[x]));}}}var navi=navigator.userAgent;if(req.addEventListener&&!(navi.indexOf("Opera")>-1)&&!(navi.indexOf("MSIE")>-1)){if(this._loadFunc){req.removeEventListener("load",this._loadFunc,false);}this._loadFunc=function(rq){clearTimeout(_timer);_timer=undefined;t._onload(rq);};req.addEventListener("load",this._loadFunc,false);}else{if(typeof req.onload!="undefined"){req.onload=function(rq){if(req.readyState==4&&!t._is_abort){clearTimeout(_timer);_timer=undefined;t._onload(rq);}};}else{if(window.navigator.userAgent.match(/(?:MSIE) ([0-9.]+)/)[1]==6&&opt.async){var onreadystatechange=function(rq){if(req.readyState==4&&!t._is_abort){if(_timer){clearTimeout(_timer);_timer=undefined;}t._onload(rq);clearInterval(t._interval);t._interval=undefined;}};this._interval=setInterval(onreadystatechange,300);}else{req.onreadystatechange=function(rq){if(req.readyState==4){clearTimeout(_timer);_timer=undefined;t._onload(rq);}};}}}if(opt.timeout>0){if(this._timer){clearTimeout(this._timer);}_timer=setTimeout(function(){t._is_abort=true;if(t._interval){clearInterval(t._interval);t._interval=undefined;}try{req.abort();}catch(e){}opt.ontimeout(req);if(typeof t._oncompleted=="function"){t._oncompleted(false);}},opt.timeout*1000);this._timer=_timer;}this._test_url=url;req.send(data);return this;};jindo.$Ajax.prototype.isIdle=function(){return this._status==0;};jindo.$Ajax.prototype.abort=function(){try{if(this._interval){clearInterval(this._interval);}if(this._timer){clearTimeout(this._timer);}this._interval=undefined;this._timer=undefined;this._is_abort=true;this._request.abort();}finally{this._status--;}return this;};jindo.$Ajax.prototype.option=function(name,value){if(typeof name=="undefined"){return"";}if(typeof name=="string"){if(typeof value=="undefined"){return this._options[name];}this._options[name]=value;return this;}try{for(var x in name){if(name.hasOwnProperty(x)){this._options[x]=name[x];}}}catch(e){}return this;};jindo.$Ajax.prototype.header=function(name,value){if(typeof name=="undefined"){return"";}if(typeof name=="string"){if(typeof value=="undefined"){return this._headers[name];}this._headers[name]=value;return this;}try{for(var x in name){if(name.hasOwnProperty(x)){this._headers[x]=name[x];}}}catch(e){}return this;};jindo.$Ajax.Response=function(req){if(this===jindo.$Ajax){return new jindo.$Ajax.Response(req);}this._response=req;};jindo.$Ajax.Response.prototype.xml=function(){return this._response.responseXML;};jindo.$Ajax.Response.prototype.text=function(){return this._response.responseText;};jindo.$Ajax.Response.prototype.status=function(){return this._response.status;};jindo.$Ajax.Response.prototype.readyState=function(){return this._response.readyState;};jindo.$Ajax.Response.prototype.json=function(){if(this._response.responseJSON){return this._response.responseJSON;}else{if(this._response.responseText){try{return eval("("+this._response.responseText+")");}catch(e){return{};}}}return{};};jindo.$Ajax.Response.prototype.header=function(name){if(typeof name=="string"){return this._response.getResponseHeader(name);}return this._response.getAllResponseHeaders();};jindo.$Ajax.RequestBase=jindo.$Class({_respHeaderString:"",callbackid:"",callbackname:"",responseXML:null,responseJSON:null,responseText:"",status:404,readyState:0,$init:function(fpOption){},onload:function(){},abort:function(){},open:function(){},send:function(){},setRequestHeader:function(sName,sValue){this._headers[sName]=sValue;},getResponseHeader:function(sName){return this._respHeaders[sName]||"";},getAllResponseHeaders:function(){return this._respHeaderString;},_getCallbackInfo:function(){var id="";if(this.option("callbackid")!=""){var idx=0;do{id="_"+this.option("callbackid")+"_"+idx;idx++;}while(window.__jindo2_callback[id]);}else{do{id="_"+Math.floor(Math.random()*10000);}while(window.__jindo2_callback[id]);}if(this.option("callbackname")==""){this.option("callbackname","_callback");}return{callbackname:this.option("callbackname"),id:id,name:"window.__jindo2_callback."+id};}});jindo.$Ajax.JSONPRequest=jindo.$Class({_headers:{},_respHeaders:{},_script:null,_onerror:null,$init:function(fpOption){this.option=fpOption;},_callback:function(data){if(this._onerror){clearTimeout(this._onerror);this._onerror=null;}var self=this;this.responseJSON=data;this.onload(this);setTimeout(function(){self.abort();},10);},abort:function(){if(this._script){try{this._script.parentNode.removeChild(this._script);}catch(e){}}},open:function(method,url){this.responseJSON=null;this._url=url;},send:function(data){var t=this;var info=this._getCallbackInfo();var head=document.getElementsByTagName("head")[0];this._script=jindo.$(" + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/jindo.fileuploader.js b/plugin/editor/smarteditor2/photo_uploader/popup/jindo.fileuploader.js new file mode 100644 index 000000000..350cbd232 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/jindo.fileuploader.js @@ -0,0 +1,390 @@ +/** + * Jindo Component + * @version 1.0.3 + * NHN_Library:Jindo_Component-1.0.3;JavaScript Components for Jindo; + * @include Component, UIComponent, FileUploader + */ +jindo.Component = jindo.$Class({ + _htEventHandler: null, + _htOption: null, + $init: function () { + var aInstance = this.constructor.getInstance(); + aInstance.push(this); + this._htEventHandler = {}; + this._htOption = {}; + this._htOption._htSetter = {}; + }, + option: function (sName, vValue) { + switch (typeof sName) { + case "undefined": + return this._htOption; + case "string": + if (typeof vValue != "undefined") { + if (sName == "htCustomEventHandler") { + if (typeof this._htOption[sName] == "undefined") { + this.attach(vValue); + } else { + return this; + } + } + this._htOption[sName] = vValue; + if (typeof this._htOption._htSetter[sName] == "function") { + this._htOption._htSetter[sName](vValue); + } + } else { + return this._htOption[sName]; + } + break; + case "object": + for (var sKey in sName) { + if (sKey == "htCustomEventHandler") { + if (typeof this._htOption[sKey] == "undefined") { + this.attach(sName[sKey]); + } else { + continue; + } + } + this._htOption[sKey] = sName[sKey]; + if (typeof this._htOption._htSetter[sKey] == "function") { + this._htOption._htSetter[sKey](sName[sKey]); + } + } + break; + } + return this; + }, + optionSetter: function (sName, fSetter) { + switch (typeof sName) { + case "undefined": + return this._htOption._htSetter; + case "string": + if (typeof fSetter != "undefined") { + this._htOption._htSetter[sName] = jindo.$Fn(fSetter, this).bind(); + } else { + return this._htOption._htSetter[sName]; + } + break; + case "object": + for (var sKey in sName) { + this._htOption._htSetter[sKey] = jindo.$Fn(sName[sKey], this).bind(); + } + break; + } + return this; + }, + fireEvent: function (sEvent, oEvent) { + oEvent = oEvent || {}; + var fInlineHandler = this['on' + sEvent], + aHandlerList = this._htEventHandler[sEvent] || [], + bHasInlineHandler = typeof fInlineHandler == "function", + bHasHandlerList = aHandlerList.length > 0; + if (!bHasInlineHandler && !bHasHandlerList) { + return true; + } + aHandlerList = aHandlerList.concat(); + oEvent.sType = sEvent; + if (typeof oEvent._aExtend == 'undefined') { + oEvent._aExtend = []; + oEvent.stop = function () { + if (oEvent._aExtend.length > 0) { + oEvent._aExtend[oEvent._aExtend.length - 1].bCanceled = true; + } + }; + } + oEvent._aExtend.push({ + sType: sEvent, + bCanceled: false + }); + var aArg = [oEvent], + i, nLen; + for (i = 2, nLen = arguments.length; i < nLen; i++) { + aArg.push(arguments[i]); + } + if (bHasInlineHandler) { + fInlineHandler.apply(this, aArg); + } + if (bHasHandlerList) { + var fHandler; + for (i = 0, fHandler; + (fHandler = aHandlerList[i]); i++) { + fHandler.apply(this, aArg); + } + } + return !oEvent._aExtend.pop().bCanceled; + }, + attach: function (sEvent, fHandlerToAttach) { + if (arguments.length == 1) { + jindo.$H(arguments[0]).forEach(jindo.$Fn(function (fHandler, sEvent) { + this.attach(sEvent, fHandler); + }, this).bind()); + return this; + } + var aHandler = this._htEventHandler[sEvent]; + if (typeof aHandler == 'undefined') { + aHandler = this._htEventHandler[sEvent] = []; + } + aHandler.push(fHandlerToAttach); + return this; + }, + detach: function (sEvent, fHandlerToDetach) { + if (arguments.length == 1) { + jindo.$H(arguments[0]).forEach(jindo.$Fn(function (fHandler, sEvent) { + this.detach(sEvent, fHandler); + }, this).bind()); + return this; + } + var aHandler = this._htEventHandler[sEvent]; + if (aHandler) { + for (var i = 0, fHandler; + (fHandler = aHandler[i]); i++) { + if (fHandler === fHandlerToDetach) { + aHandler = aHandler.splice(i, 1); + break; + } + } + } + return this; + }, + detachAll: function (sEvent) { + var aHandler = this._htEventHandler; + if (arguments.length) { + if (typeof aHandler[sEvent] == 'undefined') { + return this; + } + delete aHandler[sEvent]; + return this; + } + for (var o in aHandler) { + delete aHandler[o]; + } + return this; + } +}); +jindo.Component.factory = function (aObject, htOption) { + var aReturn = [], + oInstance; + if (typeof htOption == "undefined") { + htOption = {}; + } + for (var i = 0, el; + (el = aObject[i]); i++) { + oInstance = new this(el, htOption); + aReturn[aReturn.length] = oInstance; + } + return aReturn; +}; +jindo.Component.getInstance = function () { + if (typeof this._aInstance == "undefined") { + this._aInstance = []; + } + return this._aInstance; +}; +jindo.UIComponent = jindo.$Class({ + $init: function () { + this._bIsActivating = false; + }, + isActivating: function () { + return this._bIsActivating; + }, + activate: function () { + if (this.isActivating()) { + return this; + } + this._bIsActivating = true; + if (arguments.length > 0) { + this._onActivate.apply(this, arguments); + } else { + this._onActivate(); + } + return this; + }, + deactivate: function () { + if (!this.isActivating()) { + return this; + } + this._bIsActivating = false; + if (arguments.length > 0) { + this._onDeactivate.apply(this, arguments); + } else { + this._onDeactivate(); + } + return this; + } +}).extend(jindo.Component); +jindo.FileUploader = jindo.$Class({ + _bIsActivating: false, + _aHiddenInput: [], + $init: function (elFileSelect, htOption) { + var htDefaultOption = { + sUrl: '', + sCallback: '', + htData: {}, + sFiletype: '*', + sMsgNotAllowedExt: "업로드가 허용되지 않는 파일형식입니다", + bAutoUpload: false, + bAutoReset: true, + bActivateOnload: true + }; + this.option(htDefaultOption); + this.option(htOption || {}); + this._el = jindo.$(elFileSelect); + this._wel = jindo.$Element(this._el); + this._elForm = this._el.form; + this._aHiddenInput = []; + this.constructor._oCallback = {}; + this._wfChange = jindo.$Fn(this._onFileSelectChange, this); + if (this.option("bActivateOnload")) { + this.activate(); + } + }, + _appendIframe: function () { + var sIframeName = 'tmpFrame_' + this._makeUniqueId(); + this._welIframe = jindo.$Element(jindo.$('' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + // Remove the HTML5 form attribute from the input(s): + options.fileInput.removeAttr('form'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + // Restore the original name and form properties: + $(input) + .prop('name', clone.prop('name')) + .attr('form', clone.attr('form')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', initialIframeSrc); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && $.parseJSON($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.ui.widget.js b/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.ui.widget.js new file mode 100644 index 000000000..c43041997 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.ui.widget.js @@ -0,0 +1,530 @@ +/*! + * jQuery UI Widget 1.10.4+amd + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + +(function (factory) { + if (typeof define === "function" && define.amd) { + // Register as an anonymous AMD module: + define(["jquery"], factory); + } else { + // Browser globals: + factory(jQuery); + } +}(function( $, undefined ) { + +var uuid = 0, + slice = Array.prototype.slice, + _cleanData = $.cleanData; +$.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); +}; + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); +}; + +$.widget.extend = function( target ) { + var input = slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.widget.extend.apply( null, [ options ].concat(args) ) : + options; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + // 1.9 BC for #7810 + // TODO remove dual storage + .removeData( this.widgetName ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + // accept selectors, DOM elements + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^(\w+)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +})); diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/photo_uploader.html b/plugin/editor/smarteditor2/photo_uploader/popup/photo_uploader.html new file mode 100644 index 000000000..b2a884399 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/photo_uploader.html @@ -0,0 +1,100 @@ + + + + + + +사진 첨부하기 :: SmartEditor2 + + + +
+ +
+

사진 첨부하기

+
+ + + + +
+ +
+
+ +

10MB이하의 이미지 파일만 등록할 수 있습니다.
(JPG, GIF, PNG, BMP)

+
+
+ +
+ + + + + + +
+ + + + + + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php b/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php new file mode 100644 index 000000000..08420426e --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php @@ -0,0 +1,1392 @@ + 'The uploaded file exceeds the upload_max_filesize directive in php.ini', + 2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form', + 3 => 'The uploaded file was only partially uploaded', + 4 => 'No file was uploaded', + 6 => 'Missing a temporary folder', + 7 => 'Failed to write file to disk', + 8 => 'A PHP extension stopped the file upload', + 'post_max_size' => 'The uploaded file exceeds the post_max_size directive in php.ini', + 'max_file_size' => 'File is too big', + 'min_file_size' => 'File is too small', + 'accept_file_types' => 'Filetype not allowed', + 'max_number_of_files' => 'Maximum number of files exceeded', + 'max_width' => 'Image exceeds maximum width', + 'min_width' => 'Image requires a minimum width', + 'max_height' => 'Image exceeds maximum height', + 'min_height' => 'Image requires a minimum height', + 'abort' => 'File upload aborted', + 'image_resize' => 'Failed to resize image' + ); + + protected $image_objects = array(); + + function __construct($options = null, $initialize = true, $error_messages = null) { + $this->options = array( + 'script_url' => $this->get_full_url().'/', + 'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/', + 'upload_url' => $this->get_full_url().'/files/', + 'user_dirs' => false, + 'mkdir_mode' => 0755, + 'param_name' => 'files', + // Set the following option to 'POST', if your server does not support + // DELETE requests. This is a parameter sent to the client: + 'delete_type' => 'DELETE', + 'access_control_allow_origin' => '*', + 'access_control_allow_credentials' => false, + 'access_control_allow_methods' => array( + 'OPTIONS', + 'HEAD', + 'GET', + 'POST', + 'PUT', + 'PATCH', + 'DELETE' + ), + 'access_control_allow_headers' => array( + 'Content-Type', + 'Content-Range', + 'Content-Disposition' + ), + // Enable to provide file downloads via GET requests to the PHP script: + // 1. Set to 1 to download files via readfile method through PHP + // 2. Set to 2 to send a X-Sendfile header for lighttpd/Apache + // 3. Set to 3 to send a X-Accel-Redirect header for nginx + // If set to 2 or 3, adjust the upload_url option to the base path of + // the redirect parameter, e.g. '/files/'. + 'download_via_php' => false, + // Read files in chunks to avoid memory limits when download_via_php + // is enabled, set to 0 to disable chunked reading of files: + 'readfile_chunk_size' => 10 * 1024 * 1024, // 10 MiB + // Defines which files can be displayed inline when downloaded: + 'inline_file_types' => '/\.(gif|jpe?g|bmp|png)$/i', + // Defines which files (based on their names) are accepted for upload: + //'accept_file_types' => '/.+$/i', + 'accept_file_types' => '/\.(gif|jpe?g|bmp|png)$/i', + // The php.ini settings upload_max_filesize and post_max_size + // take precedence over the following max_file_size setting: + 'max_file_size' => null, + 'min_file_size' => 1, + // The maximum number of files for the upload directory: + 'max_number_of_files' => null, + // Defines which files are handled as image files: + 'image_file_types' => '/\.(gif|jpe?g|bmp|png)$/i', + // Image resolution restrictions: + 'max_width' => null, + 'max_height' => null, + 'min_width' => 1, + 'min_height' => 1, + // Set the following option to false to enable resumable uploads: + 'discard_aborted_uploads' => true, + // Set to 0 to use the GD library to scale and orient images, + // set to 1 to use imagick (if installed, falls back to GD), + // set to 2 to use the ImageMagick convert binary directly: + 'image_library' => 1, + // Uncomment the following to define an array of resource limits + // for imagick: + /* + 'imagick_resource_limits' => array( + imagick::RESOURCETYPE_MAP => 32, + imagick::RESOURCETYPE_MEMORY => 32 + ), + */ + // Command or path for to the ImageMagick convert binary: + 'convert_bin' => 'convert', + // Uncomment the following to add parameters in front of each + // ImageMagick convert call (the limit constraints seem only + // to have an effect if put in front): + /* + 'convert_params' => '-limit memory 32MiB -limit map 32MiB', + */ + // Command or path for to the ImageMagick identify binary: + 'identify_bin' => 'identify', + 'image_versions' => array( + // The empty image version key defines options for the original image: + '' => array( + // Automatically rotate images based on EXIF meta data: + 'auto_orient' => true + ), + // Uncomment the following to create medium sized images: + /* + 'medium' => array( + 'max_width' => 800, + 'max_height' => 600 + ), + */ + 'thumbnail' => array( + // Uncomment the following to use a defined directory for the thumbnails + // instead of a subdirectory based on the version identifier. + // Make sure that this directory doesn't allow execution of files if you + // don't pose any restrictions on the type of uploaded files, e.g. by + // copying the .htaccess file from the files directory for Apache: + //'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/thumb/', + //'upload_url' => $this->get_full_url().'/thumb/', + // Uncomment the following to force the max + // dimensions and e.g. create square thumbnails: + //'crop' => true, + 'max_width' => 80, + 'max_height' => 80 + ) + ) + ); + if ($options) { + $this->options = $options + $this->options; + } + if ($error_messages) { + $this->error_messages = $error_messages + $this->error_messages; + } + if ($initialize) { + $this->initialize(); + } + } + + protected function initialize() { + switch ($this->get_server_var('REQUEST_METHOD')) { + case 'OPTIONS': + case 'HEAD': + $this->head(); + break; + case 'GET': + if( $_GET['del'] ){ + $this->delete(); + } else { + $this->get(); + } + break; + case 'PATCH': + case 'PUT': + case 'POST': + $this->post(); + break; + case 'DELETE': + $this->delete(); + break; + default: + $this->header('HTTP/1.1 405 Method Not Allowed'); + } + } + + protected function get_full_url() { + $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0; + return + ($https ? 'https://' : 'http://'). + (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : ''). + (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME']. + ($https && $_SERVER['SERVER_PORT'] === 443 || + $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))). + substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/')); + } + + protected function get_user_id() { + @session_start(); + return session_id(); + } + + protected function get_user_path() { + if ($this->options['user_dirs']) { + return $this->get_user_id().'/'; + } + return ''; + } + + protected function get_upload_path($file_name = null, $version = null) { + $file_name = $file_name ? $file_name : ''; + if (empty($version)) { + $version_path = ''; + } else { + $version_dir = @$this->options['image_versions'][$version]['upload_dir']; + if ($version_dir) { + return $version_dir.$this->get_user_path().$file_name; + } + $version_path = $version.'/'; + } + return $this->options['upload_dir'].$this->get_user_path() + .$version_path.$file_name; + } + + protected function get_query_separator($url) { + return strpos($url, '?') === false ? '?' : '&'; + } + + protected function get_download_url($file_name, $version = null, $direct = false) { + if (!$direct && $this->options['download_via_php']) { + $url = $this->options['script_url'] + .$this->get_query_separator($this->options['script_url']) + .$this->get_singular_param_name() + .'='.rawurlencode($file_name); + if ($version) { + $url .= '&version='.rawurlencode($version); + } + return $url.'&download=1'; + } + if (empty($version)) { + $version_path = ''; + } else { + $version_url = @$this->options['image_versions'][$version]['upload_url']; + if ($version_url) { + return $version_url.$this->get_user_path().rawurlencode($file_name); + } + $version_path = rawurlencode($version).'/'; + } + return $this->options['upload_url'].$this->get_user_path() + .$version_path.rawurlencode($file_name); + } + + protected function set_additional_file_properties($file) { + $file->deleteUrl = $this->options['script_url'] + .$this->get_query_separator($this->options['script_url']) + .$this->get_singular_param_name() + .'='.rawurlencode($file->name); + $file->deleteType = $this->options['delete_type']; + if ($file->deleteType !== 'DELETE') { + $file->deleteUrl .= '&_method=DELETE'; + } + if ($this->options['access_control_allow_credentials']) { + $file->deleteWithCredentials = true; + } + } + + // Fix for overflowing signed 32 bit integers, + // works for sizes up to 2^32-1 bytes (4 GiB - 1): + protected function fix_integer_overflow($size) { + if ($size < 0) { + $size += 2.0 * (PHP_INT_MAX + 1); + } + return $size; + } + + protected function get_file_size($file_path, $clear_stat_cache = false) { + if ($clear_stat_cache) { + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + clearstatcache(true, $file_path); + } else { + clearstatcache(); + } + } + return $this->fix_integer_overflow(filesize($file_path)); + } + + protected function is_valid_file_object($file_name) { + $file_path = $this->get_upload_path($file_name); + if (is_file($file_path) && $file_name[0] !== '.') { + return true; + } + return false; + } + + protected function get_file_object($file_name) { + if ($this->is_valid_file_object($file_name)) { + $file = new \stdClass(); + $file->name = iconv('UTF-8', 'UTF-8//IGNORE', $file_name); + $file->size = $this->get_file_size( + $this->get_upload_path($file_name) + ); + $img_width_height = $this->get_image_size($this->get_upload_path($file_name)); + $file->width = $img_width_height[0]; + $file->height = $img_width_height[1]; + $file->url = $this->get_download_url($file->name); + foreach($this->options['image_versions'] as $version => $options) { + if (!empty($version)) { + if (is_file($this->get_upload_path($file_name, $version))) { + $file->{$version.'Url'} = $this->get_download_url( + $file->name, + $version + ); + } + } + } + $this->set_additional_file_properties($file); + return $file; + } + return null; + } + + protected function get_file_objects($iteration_method = 'get_file_object') { + $upload_dir = $this->get_upload_path(); + if (!is_dir($upload_dir)) { + return array(); + } + return array_values(array_filter(array_map( + array($this, $iteration_method), + scandir($upload_dir) + ))); + } + + protected function count_file_objects() { + return count($this->get_file_objects('is_valid_file_object')); + } + + protected function get_error_message($error) { + return array_key_exists($error, $this->error_messages) ? + $this->error_messages[$error] : $error; + } + + function get_config_bytes($val) { + $val = trim($val); + $last = strtolower($val[strlen($val)-1]); + switch($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + return $this->fix_integer_overflow($val); + } + + protected function validate($uploaded_file, $file, $error, $index) { + if ($error) { + $file->error = $this->get_error_message($error); + return false; + } + $content_length = $this->fix_integer_overflow(intval( + $this->get_server_var('CONTENT_LENGTH') + )); + $post_max_size = $this->get_config_bytes(ini_get('post_max_size')); + if ($post_max_size && ($content_length > $post_max_size)) { + $file->error = $this->get_error_message('post_max_size'); + return false; + } + if (!preg_match($this->options['accept_file_types'], $file->name)) { + $file->error = $this->get_error_message('accept_file_types'); + return false; + } + if ($uploaded_file && is_uploaded_file($uploaded_file)) { + $file_size = $this->get_file_size($uploaded_file); + } else { + $file_size = $content_length; + } + if ($this->options['max_file_size'] && ( + $file_size > $this->options['max_file_size'] || + $file->size > $this->options['max_file_size']) + ) { + $file->error = $this->get_error_message('max_file_size'); + return false; + } + if ($this->options['min_file_size'] && + $file_size < $this->options['min_file_size']) { + $file->error = $this->get_error_message('min_file_size'); + return false; + } + if (is_int($this->options['max_number_of_files']) && + ($this->count_file_objects() >= $this->options['max_number_of_files']) && + // Ignore additional chunks of existing files: + !is_file($this->get_upload_path($file->name))) { + $file->error = $this->get_error_message('max_number_of_files'); + return false; + } + $max_width = @$this->options['max_width']; + $max_height = @$this->options['max_height']; + $min_width = @$this->options['min_width']; + $min_height = @$this->options['min_height']; + if (($max_width || $max_height || $min_width || $min_height) + && preg_match($this->options['image_file_types'], $file->name)) { + list($img_width, $img_height) = $this->get_image_size($uploaded_file); + } + + if (!empty($img_width)) { + if ($max_width && $img_width > $max_width) { + $file->error = $this->get_error_message('max_width'); + return false; + } + if ($max_height && $img_height > $max_height) { + $file->error = $this->get_error_message('max_height'); + return false; + } + if ($min_width && $img_width < $min_width) { + $file->error = $this->get_error_message('min_width'); + return false; + } + if ($min_height && $img_height < $min_height) { + $file->error = $this->get_error_message('min_height'); + return false; + } + } + return true; + } + + protected function upcount_name_callback($matches) { + $index = isset($matches[1]) ? intval($matches[1]) + 1 : 1; + $ext = isset($matches[2]) ? $matches[2] : ''; + return ' ('.$index.')'.$ext; + } + + protected function upcount_name($name) { + return preg_replace_callback( + '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/', + array($this, 'upcount_name_callback'), + $name, + 1 + ); + } + + protected function get_unique_filename($file_path, $name, $size, $type, $error, + $index, $content_range) { + while(is_dir($this->get_upload_path($name))) { + $name = $this->upcount_name($name); + } + // Keep an existing filename if this is part of a chunked upload: + $uploaded_bytes = $this->fix_integer_overflow(intval($content_range[1])); + while(is_file($this->get_upload_path($name))) { + if ($uploaded_bytes === $this->get_file_size( + $this->get_upload_path($name))) { + break; + } + $name = $this->upcount_name($name); + } + return $name; + } + + protected function trim_file_name($file_path, $name, $size, $type, $error, + $index, $content_range) { + // Remove path information and dots around the filename, to prevent uploading + // into different directories or replacing hidden system files. + // Also remove control characters and spaces (\x00..\x20) around the filename: + $name = trim(basename(stripslashes($name)), ".\x00..\x20"); + // Use a timestamp for empty filenames: + if (!$name) { + $name = str_replace('.', '-', microtime(true)); + } + // Add missing file extension for known image types: + if (strpos($name, '.') === false && + preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) { + $name .= '.'.$matches[1]; + } + if (function_exists('exif_imagetype')) { + switch(@exif_imagetype($file_path)){ + case IMAGETYPE_JPEG: + $extensions = array('jpg', 'jpeg'); + break; + case IMAGETYPE_PNG: + $extensions = array('png'); + break; + case IMAGETYPE_GIF: + $extensions = array('gif'); + break; + } + // Adjust incorrect image file extensions: + if (!empty($extensions)) { + $parts = explode('.', $name); + $extIndex = count($parts) - 1; + $ext = strtolower(@$parts[$extIndex]); + if (!in_array($ext, $extensions)) { + $parts[$extIndex] = $extensions[0]; + $name = implode('.', $parts); + } + } + } + return $name; + } + + protected function get_file_name($file_path, $name, $size, $type, $error, + $index, $content_range) { + return $this->get_unique_filename( + $file_path, + $this->trim_file_name($file_path, $name, $size, $type, $error, + $index, $content_range), + $size, + $type, + $error, + $index, + $content_range + ); + } + + protected function handle_form_data($file, $index) { + // Handle form data, e.g. $_REQUEST['description'][$index] + } + + protected function get_scaled_image_file_paths($file_name, $version) { + $file_path = $this->get_upload_path($file_name); + if (!empty($version)) { + $version_dir = $this->get_upload_path(null, $version); + if (!is_dir($version_dir)) { + mkdir($version_dir, $this->options['mkdir_mode'], true); + } + $new_file_path = $version_dir.'/'.$file_name; + } else { + $new_file_path = $file_path; + } + return array($file_path, $new_file_path); + } + + protected function gd_get_image_object($file_path, $func, $no_cache = false) { + if (empty($this->image_objects[$file_path]) || $no_cache) { + $this->gd_destroy_image_object($file_path); + $this->image_objects[$file_path] = $func($file_path); + } + return $this->image_objects[$file_path]; + } + + protected function gd_set_image_object($file_path, $image) { + $this->gd_destroy_image_object($file_path); + $this->image_objects[$file_path] = $image; + } + + protected function gd_destroy_image_object($file_path) { + $image = @$this->image_objects[$file_path]; + return $image && imagedestroy($image); + } + + protected function gd_imageflip($image, $mode) { + if (function_exists('imageflip')) { + return imageflip($image, $mode); + } + $new_width = $src_width = imagesx($image); + $new_height = $src_height = imagesy($image); + $new_img = imagecreatetruecolor($new_width, $new_height); + $src_x = 0; + $src_y = 0; + switch ($mode) { + case '1': // flip on the horizontal axis + $src_y = $new_height - 1; + $src_height = -$new_height; + break; + case '2': // flip on the vertical axis + $src_x = $new_width - 1; + $src_width = -$new_width; + break; + case '3': // flip on both axes + $src_y = $new_height - 1; + $src_height = -$new_height; + $src_x = $new_width - 1; + $src_width = -$new_width; + break; + default: + return $image; + } + imagecopyresampled( + $new_img, + $image, + 0, + 0, + $src_x, + $src_y, + $new_width, + $new_height, + $src_width, + $src_height + ); + return $new_img; + } + + protected function gd_orient_image($file_path, $src_img) { + if (!function_exists('exif_read_data')) { + return false; + } + $exif = @exif_read_data($file_path); + if ($exif === false) { + return false; + } + $orientation = intval(@$exif['Orientation']); + if ($orientation < 2 || $orientation > 8) { + return false; + } + switch ($orientation) { + case 2: + $new_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 + ); + break; + case 3: + $new_img = imagerotate($src_img, 180, 0); + break; + case 4: + $new_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 + ); + break; + case 5: + $tmp_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1 + ); + $new_img = imagerotate($tmp_img, 270, 0); + imagedestroy($tmp_img); + break; + case 6: + $new_img = imagerotate($src_img, 270, 0); + break; + case 7: + $tmp_img = $this->gd_imageflip( + $src_img, + defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2 + ); + $new_img = imagerotate($tmp_img, 270, 0); + imagedestroy($tmp_img); + break; + case 8: + $new_img = imagerotate($src_img, 90, 0); + break; + default: + return false; + } + $this->gd_set_image_object($file_path, $new_img); + return true; + } + + protected function gd_create_scaled_image($file_name, $version, $options) { + if (!function_exists('imagecreatetruecolor')) { + error_log('Function not found: imagecreatetruecolor'); + return false; + } + list($file_path, $new_file_path) = + $this->get_scaled_image_file_paths($file_name, $version); + $type = strtolower(substr(strrchr($file_name, '.'), 1)); + switch ($type) { + case 'jpg': + case 'jpeg': + $src_func = 'imagecreatefromjpeg'; + $write_func = 'imagejpeg'; + $image_quality = isset($options['jpeg_quality']) ? + $options['jpeg_quality'] : 75; + break; + case 'gif': + $src_func = 'imagecreatefromgif'; + $write_func = 'imagegif'; + $image_quality = null; + break; + case 'png': + $src_func = 'imagecreatefrompng'; + $write_func = 'imagepng'; + $image_quality = isset($options['png_quality']) ? + $options['png_quality'] : 9; + break; + default: + return false; + } + $src_img = $this->gd_get_image_object( + $file_path, + $src_func, + !empty($options['no_cache']) + ); + $image_oriented = false; + if (!empty($options['auto_orient']) && $this->gd_orient_image( + $file_path, + $src_img + )) { + $image_oriented = true; + $src_img = $this->gd_get_image_object( + $file_path, + $src_func + ); + } + $max_width = $img_width = imagesx($src_img); + $max_height = $img_height = imagesy($src_img); + if (!empty($options['max_width'])) { + $max_width = $options['max_width']; + } + if (!empty($options['max_height'])) { + $max_height = $options['max_height']; + } + $scale = min( + $max_width / $img_width, + $max_height / $img_height + ); + if ($scale >= 1) { + if ($image_oriented) { + return $write_func($src_img, $new_file_path, $image_quality); + } + if ($file_path !== $new_file_path) { + return copy($file_path, $new_file_path); + } + return true; + } + if (empty($options['crop'])) { + $new_width = $img_width * $scale; + $new_height = $img_height * $scale; + $dst_x = 0; + $dst_y = 0; + $new_img = imagecreatetruecolor($new_width, $new_height); + } else { + if (($img_width / $img_height) >= ($max_width / $max_height)) { + $new_width = $img_width / ($img_height / $max_height); + $new_height = $max_height; + } else { + $new_width = $max_width; + $new_height = $img_height / ($img_width / $max_width); + } + $dst_x = 0 - ($new_width - $max_width) / 2; + $dst_y = 0 - ($new_height - $max_height) / 2; + $new_img = imagecreatetruecolor($max_width, $max_height); + } + // Handle transparency in GIF and PNG images: + switch ($type) { + case 'gif': + case 'png': + imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0)); + case 'png': + imagealphablending($new_img, false); + imagesavealpha($new_img, true); + break; + } + $success = imagecopyresampled( + $new_img, + $src_img, + $dst_x, + $dst_y, + 0, + 0, + $new_width, + $new_height, + $img_width, + $img_height + ) && $write_func($new_img, $new_file_path, $image_quality); + $this->gd_set_image_object($file_path, $new_img); + return $success; + } + + protected function imagick_get_image_object($file_path, $no_cache = false) { + if (empty($this->image_objects[$file_path]) || $no_cache) { + $this->imagick_destroy_image_object($file_path); + $image = new \Imagick(); + if (!empty($this->options['imagick_resource_limits'])) { + foreach ($this->options['imagick_resource_limits'] as $type => $limit) { + $image->setResourceLimit($type, $limit); + } + } + $image->readImage($file_path); + $this->image_objects[$file_path] = $image; + } + return $this->image_objects[$file_path]; + } + + protected function imagick_set_image_object($file_path, $image) { + $this->imagick_destroy_image_object($file_path); + $this->image_objects[$file_path] = $image; + } + + protected function imagick_destroy_image_object($file_path) { + $image = @$this->image_objects[$file_path]; + return $image && $image->destroy(); + } + + protected function imagick_orient_image($image) { + $orientation = $image->getImageOrientation(); + $background = new \ImagickPixel('none'); + switch ($orientation) { + case \imagick::ORIENTATION_TOPRIGHT: // 2 + $image->flopImage(); // horizontal flop around y-axis + break; + case \imagick::ORIENTATION_BOTTOMRIGHT: // 3 + $image->rotateImage($background, 180); + break; + case \imagick::ORIENTATION_BOTTOMLEFT: // 4 + $image->flipImage(); // vertical flip around x-axis + break; + case \imagick::ORIENTATION_LEFTTOP: // 5 + $image->flopImage(); // horizontal flop around y-axis + $image->rotateImage($background, 270); + break; + case \imagick::ORIENTATION_RIGHTTOP: // 6 + $image->rotateImage($background, 90); + break; + case \imagick::ORIENTATION_RIGHTBOTTOM: // 7 + $image->flipImage(); // vertical flip around x-axis + $image->rotateImage($background, 270); + break; + case \imagick::ORIENTATION_LEFTBOTTOM: // 8 + $image->rotateImage($background, 270); + break; + default: + return false; + } + $image->setImageOrientation(\imagick::ORIENTATION_TOPLEFT); // 1 + return true; + } + + protected function imagick_create_scaled_image($file_name, $version, $options) { + list($file_path, $new_file_path) = + $this->get_scaled_image_file_paths($file_name, $version); + $image = $this->imagick_get_image_object( + $file_path, + !empty($options['no_cache']) + ); + if ($image->getImageFormat() === 'GIF') { + // Handle animated GIFs: + $images = $image->coalesceImages(); + foreach ($images as $frame) { + $image = $frame; + $this->imagick_set_image_object($file_name, $image); + break; + } + } + $image_oriented = false; + if (!empty($options['auto_orient'])) { + $image_oriented = $this->imagick_orient_image($image); + } + $new_width = $max_width = $img_width = $image->getImageWidth(); + $new_height = $max_height = $img_height = $image->getImageHeight(); + if (!empty($options['max_width'])) { + $new_width = $max_width = $options['max_width']; + } + if (!empty($options['max_height'])) { + $new_height = $max_height = $options['max_height']; + } + if (!($image_oriented || $max_width < $img_width || $max_height < $img_height)) { + if ($file_path !== $new_file_path) { + return copy($file_path, $new_file_path); + } + return true; + } + $crop = !empty($options['crop']); + if ($crop) { + $x = 0; + $y = 0; + if (($img_width / $img_height) >= ($max_width / $max_height)) { + $new_width = 0; // Enables proportional scaling based on max_height + $x = ($img_width / ($img_height / $max_height) - $max_width) / 2; + } else { + $new_height = 0; // Enables proportional scaling based on max_width + $y = ($img_height / ($img_width / $max_width) - $max_height) / 2; + } + } + $success = $image->resizeImage( + $new_width, + $new_height, + isset($options['filter']) ? $options['filter'] : \imagick::FILTER_LANCZOS, + isset($options['blur']) ? $options['blur'] : 1, + $new_width && $new_height // fit image into constraints if not to be cropped + ); + if ($success && $crop) { + $success = $image->cropImage( + $max_width, + $max_height, + $x, + $y + ); + if ($success) { + $success = $image->setImagePage($max_width, $max_height, 0, 0); + } + } + $type = strtolower(substr(strrchr($file_name, '.'), 1)); + switch ($type) { + case 'jpg': + case 'jpeg': + if (!empty($options['jpeg_quality'])) { + $image->setImageCompression(\imagick::COMPRESSION_JPEG); + $image->setImageCompressionQuality($options['jpeg_quality']); + } + break; + } + if (!empty($options['strip'])) { + $image->stripImage(); + } + return $success && $image->writeImage($new_file_path); + } + + protected function imagemagick_create_scaled_image($file_name, $version, $options) { + list($file_path, $new_file_path) = + $this->get_scaled_image_file_paths($file_name, $version); + $resize = @$options['max_width'] + .(empty($options['max_height']) ? '' : 'X'.$options['max_height']); + if (!$resize && empty($options['auto_orient'])) { + if ($file_path !== $new_file_path) { + return copy($file_path, $new_file_path); + } + return true; + } + $cmd = $this->options['convert_bin']; + if (!empty($this->options['convert_params'])) { + $cmd .= ' '.$this->options['convert_params']; + } + $cmd .= ' '.escapeshellarg($file_path); + if (!empty($options['auto_orient'])) { + $cmd .= ' -auto-orient'; + } + if ($resize) { + // Handle animated GIFs: + $cmd .= ' -coalesce'; + if (empty($options['crop'])) { + $cmd .= ' -resize '.escapeshellarg($resize.'>'); + } else { + $cmd .= ' -resize '.escapeshellarg($resize.'^'); + $cmd .= ' -gravity center'; + $cmd .= ' -crop '.escapeshellarg($resize.'+0+0'); + } + // Make sure the page dimensions are correct (fixes offsets of animated GIFs): + $cmd .= ' +repage'; + } + if (!empty($options['convert_params'])) { + $cmd .= ' '.$options['convert_params']; + } + $cmd .= ' '.escapeshellarg($new_file_path); + exec($cmd, $output, $error); + if ($error) { + error_log(implode('\n', $output)); + return false; + } + return true; + } + + protected function get_image_size($file_path) { + if ($this->options['image_library']) { + if (extension_loaded('imagick')) { + $image = new \Imagick(); + try { + if (@$image->pingImage($file_path)) { + $dimensions = array($image->getImageWidth(), $image->getImageHeight()); + $image->destroy(); + return $dimensions; + } + return false; + } catch (Exception $e) { + error_log($e->getMessage()); + } + } + if ($this->options['image_library'] === 2) { + $cmd = $this->options['identify_bin']; + $cmd .= ' -ping '.escapeshellarg($file_path); + exec($cmd, $output, $error); + if (!$error && !empty($output)) { + // image.jpg JPEG 1920x1080 1920x1080+0+0 8-bit sRGB 465KB 0.000u 0:00.000 + $infos = preg_split('/\s+/', $output[0]); + $dimensions = preg_split('/x/', $infos[2]); + return $dimensions; + } + return false; + } + } + if (!function_exists('getimagesize')) { + error_log('Function not found: getimagesize'); + return false; + } + return @getimagesize($file_path); + } + + protected function create_scaled_image($file_name, $version, $options) { + if ($this->options['image_library'] === 2) { + return $this->imagemagick_create_scaled_image($file_name, $version, $options); + } + if ($this->options['image_library'] && extension_loaded('imagick')) { + return $this->imagick_create_scaled_image($file_name, $version, $options); + } + return $this->gd_create_scaled_image($file_name, $version, $options); + } + + protected function destroy_image_object($file_path) { + if ($this->options['image_library'] && extension_loaded('imagick')) { + return $this->imagick_destroy_image_object($file_path); + } + } + + protected function is_valid_image_file($file_path) { + if (!preg_match($this->options['image_file_types'], $file_path)) { + return false; + } + if (function_exists('exif_imagetype')) { + return @exif_imagetype($file_path); + } + $image_info = $this->get_image_size($file_path); + return $image_info && $image_info[0] && $image_info[1]; + } + + protected function handle_image_file($file_path, $file) { + $failed_versions = array(); + foreach($this->options['image_versions'] as $version => $options) { + if ($this->create_scaled_image($file->name, $version, $options)) { + if (!empty($version)) { + $file->{$version.'Url'} = $this->get_download_url( + $file->name, + $version + ); + } else { + $file->size = $this->get_file_size($file_path, true); + } + } else { + $failed_versions[] = $version ? $version : 'original'; + } + } + if (count($failed_versions)) { + $file->error = $this->get_error_message('image_resize') + .' ('.implode($failed_versions,', ').')'; + } + // Free memory: + $this->destroy_image_object($file_path); + } + + protected function get_microtime(){ + list($usec, $sec) = explode(" ",microtime()); + return ((float)$usec + (float)$sec); + } + + protected function get_file_passname(){ + $tmp_name = $this->get_user_id().$_SERVER['REMOTE_ADDR']; + $tmp_name = md5(sha1($tmp_name)); + return $tmp_name; + } + + protected function handle_file_upload($uploaded_file, $name, $size, $type, $error, + $index = null, $content_range = null) { + $file = new \stdClass(); + $file->oriname = $this->get_file_name($uploaded_file, $name, $size, $type, $error, + $index, $content_range); + + $filename_ext = pathinfo($name, PATHINFO_EXTENSION); + $file->name = $this->get_file_passname().'_'.str_replace(".", "_", $this->get_microtime()).".".$filename_ext; + + //$file->name = iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($file->name)); + $file->size = $this->fix_integer_overflow(intval($size)); + $file->type = $type; + if ($this->validate($uploaded_file, $file, $error, $index)) { + $this->handle_form_data($file, $index); + $upload_dir = $this->get_upload_path(); + if (!is_dir($upload_dir)) { + mkdir($upload_dir, $this->options['mkdir_mode'], true); + } + $file_path = $this->get_upload_path($file->name); + $append_file = $content_range && is_file($file_path) && + $file->size > $this->get_file_size($file_path); + if ($uploaded_file && is_uploaded_file($uploaded_file)) { + // multipart/formdata uploads (POST method uploads) + if ($append_file) { + file_put_contents( + $file_path, + fopen($uploaded_file, 'r'), + FILE_APPEND + ); + } else { + move_uploaded_file($uploaded_file, $file_path); + } + } else { + // Non-multipart uploads (PUT method support) + file_put_contents( + $file_path, + fopen('php://input', 'r'), + $append_file ? FILE_APPEND : 0 + ); + } + $file_size = $this->get_file_size($file_path, $append_file); + if ($file_size === $file->size) { + $file->url = $this->get_download_url($file->name); + if ($this->is_valid_image_file($file_path)) { + $this->handle_image_file($file_path, $file); + $image_width_height = $this->get_image_size($file_path); + $file->width = $image_width_height[0]; + $file->height = $image_width_height[1]; + } + } else { + $file->size = $file_size; + if (!$content_range && $this->options['discard_aborted_uploads']) { + unlink($file_path); + $file->error = $this->get_error_message('abort'); + } + } + $this->set_additional_file_properties($file); + } + return $file; + } + + protected function readfile($file_path) { + $file_size = $this->get_file_size($file_path); + $chunk_size = $this->options['readfile_chunk_size']; + if ($chunk_size && $file_size > $chunk_size) { + $handle = fopen($file_path, 'rb'); + while (!feof($handle)) { + echo fread($handle, $chunk_size); + ob_flush(); + flush(); + } + fclose($handle); + return $file_size; + } + return readfile($file_path); + } + + protected function body($str) { + echo $str; + } + + protected function header($str) { + header($str); + } + + protected function get_server_var($id) { + return isset($_SERVER[$id]) ? $_SERVER[$id] : ''; + } + + protected function generate_response($content, $print_response = true) { + if ($print_response) { + $json = json_encode($content); + + if ( json_last_error() ){ + switch (json_last_error()) { + case JSON_ERROR_NONE: + echo ' - No errors'; + break; + case JSON_ERROR_DEPTH: + echo ' - Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + echo ' - Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + echo ' - Unexpected control character found'; + break; + case JSON_ERROR_SYNTAX: + echo ' - Syntax error, malformed JSON'; + break; + case JSON_ERROR_UTF8: + echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + echo ' - Unknown error'; + break; + } + + echo PHP_EOL; + } + $redirect = isset($_REQUEST['redirect']) ? + stripslashes($_REQUEST['redirect']) : null; + if ($redirect) { + $this->header('Location: '.sprintf($redirect, rawurlencode($json))); + return; + } + $this->head(); + if ($this->get_server_var('HTTP_CONTENT_RANGE')) { + $files = isset($content[$this->options['param_name']]) ? + $content[$this->options['param_name']] : null; + if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) { + $this->header('Range: 0-'.( + $this->fix_integer_overflow(intval($files[0]->size)) - 1 + )); + } + } + $this->body($json); + } + return $content; + } + + protected function get_version_param() { + return isset($_GET['version']) ? basename(stripslashes($_GET['version'])) : null; + } + + protected function get_singular_param_name() { + return substr($this->options['param_name'], 0, -1); + } + + protected function get_file_name_param() { + $name = $this->get_singular_param_name(); + return isset($_GET[$name]) ? basename(stripslashes($_GET[$name])) : null; + } + + protected function get_file_names_params() { + $params = isset($_GET[$this->options['param_name']]) ? + $_GET[$this->options['param_name']] : array(); + foreach ($params as $key => $value) { + $params[$key] = basename(stripslashes($value)); + } + return $params; + } + + protected function get_file_type($file_path) { + switch (strtolower(pathinfo($file_path, PATHINFO_EXTENSION))) { + case 'jpeg': + case 'jpg': + return 'image/jpeg'; + case 'png': + return 'image/png'; + case 'gif': + return 'image/gif'; + default: + return ''; + } + } + + protected function download() { + switch ($this->options['download_via_php']) { + case 1: + $redirect_header = null; + break; + case 2: + $redirect_header = 'X-Sendfile'; + break; + case 3: + $redirect_header = 'X-Accel-Redirect'; + break; + default: + return $this->header('HTTP/1.1 403 Forbidden'); + } + $file_name = $this->get_file_name_param(); + if (!$this->is_valid_file_object($file_name)) { + return $this->header('HTTP/1.1 404 Not Found'); + } + if ($redirect_header) { + return $this->header( + $redirect_header.': '.$this->get_download_url( + $file_name, + $this->get_version_param(), + true + ) + ); + } + $file_path = $this->get_upload_path($file_name, $this->get_version_param()); + // Prevent browsers from MIME-sniffing the content-type: + $this->header('X-Content-Type-Options: nosniff'); + if (!preg_match($this->options['inline_file_types'], $file_name)) { + $this->header('Content-Type: application/octet-stream'); + $this->header('Content-Disposition: attachment; filename="'.$file_name.'"'); + } else { + $this->header('Content-Type: '.$this->get_file_type($file_path)); + $this->header('Content-Disposition: inline; filename="'.$file_name.'"'); + } + $this->header('Content-Length: '.$this->get_file_size($file_path)); + $this->header('Last-Modified: '.gmdate('D, d M Y H:i:s T', filemtime($file_path))); + $this->readfile($file_path); + } + + protected function send_content_type_header() { + $this->header('Vary: Accept'); + if (strpos($this->get_server_var('HTTP_ACCEPT'), 'application/json') !== false) { + $this->header('Content-type: application/json'); + } else { + $this->header('Content-type: text/plain'); + } + } + + protected function send_access_control_headers() { + $this->header('Access-Control-Allow-Origin: '.$this->options['access_control_allow_origin']); + $this->header('Access-Control-Allow-Credentials: ' + .($this->options['access_control_allow_credentials'] ? 'true' : 'false')); + $this->header('Access-Control-Allow-Methods: ' + .implode(', ', $this->options['access_control_allow_methods'])); + $this->header('Access-Control-Allow-Headers: ' + .implode(', ', $this->options['access_control_allow_headers'])); + } + + public function head() { + $this->header('Pragma: no-cache'); + $this->header('Cache-Control: no-store, no-cache, must-revalidate'); + $this->header('Content-Disposition: inline; filename="files.json"'); + // Prevent Internet Explorer from MIME-sniffing the content-type: + $this->header('X-Content-Type-Options: nosniff'); + if ($this->options['access_control_allow_origin']) { + $this->send_access_control_headers(); + } + $this->send_content_type_header(); + } + + public function get($print_response = true) { + //보안 이슈로 인해 사용하지 않습니다. + /* + if ($print_response && isset($_GET['download'])) { + return $this->download(); + } + $file_name = $this->get_file_name_param(); + if ($file_name) { + $response = array( + $this->get_singular_param_name() => $this->get_file_object($file_name) + ); + } else { + $response = array( + $this->options['param_name'] => $this->get_file_objects() + ); + } + return $this->generate_response($response, $print_response); + */ + } + + public function post($print_response = true) { + if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') { + return $this->delete($print_response); + } + $upload = isset($_FILES[$this->options['param_name']]) ? + $_FILES[$this->options['param_name']] : null; + // Parse the Content-Disposition header, if available: + $file_name = $this->get_server_var('HTTP_CONTENT_DISPOSITION') ? + rawurldecode(preg_replace( + '/(^[^"]+")|("$)/', + '', + $this->get_server_var('HTTP_CONTENT_DISPOSITION') + )) : null; + // Parse the Content-Range header, which has the following form: + // Content-Range: bytes 0-524287/2000000 + $content_range = $this->get_server_var('HTTP_CONTENT_RANGE') ? + preg_split('/[^0-9]+/', $this->get_server_var('HTTP_CONTENT_RANGE')) : null; + $size = $content_range ? $content_range[3] : null; + $files = array(); + if ($upload && is_array($upload['tmp_name'])) { + // param_name is an array identifier like "files[]", + // $_FILES is a multi-dimensional array: + foreach ($upload['tmp_name'] as $index => $value) { + $files[] = $this->handle_file_upload( + $upload['tmp_name'][$index], + $file_name ? $file_name : $upload['name'][$index], + $size ? $size : $upload['size'][$index], + $upload['type'][$index], + $upload['error'][$index], + $index, + $content_range + ); + } + } else { + // param_name is a single object identifier like "file", + // $_FILES is a one-dimensional array: + $files[] = $this->handle_file_upload( + isset($upload['tmp_name']) ? $upload['tmp_name'] : null, + $file_name ? $file_name : (isset($upload['name']) ? + $upload['name'] : null), + $size ? $size : (isset($upload['size']) ? + $upload['size'] : $this->get_server_var('CONTENT_LENGTH')), + isset($upload['type']) ? + $upload['type'] : $this->get_server_var('CONTENT_TYPE'), + isset($upload['error']) ? $upload['error'] : null, + null, + $content_range + ); + } + return $this->generate_response( + array($this->options['param_name'] => $files), + $print_response + ); + } + + public function delete($print_response = true) { + /* 보안 이슈 url을 참고 https://github.com/blueimp/jQuery-File-Upload/issues/2426 */ + $file_names = $this->get_file_names_params(); + if (empty($file_names)) { + $file_names = array($this->get_file_name_param()); + } + $response = array(); + foreach($file_names as $file_name) { + if( substr($file_name, 0 , 32) != $this->get_file_passname() ) continue; //session_id() 와 비교하여 틀리면 지우지 않음 + $file_path = $this->get_upload_path($file_name); + $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path); + if ($success) { + foreach($this->options['image_versions'] as $version => $options) { + if (!empty($version)) { + $file = $this->get_upload_path($file_name, $version); + if (is_file($file)) { + unlink($file); + } + } + } + } + $response[$file_name] = $success; + } + return $this->generate_response($response, $print_response); + } + +} diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/php/index.php b/plugin/editor/smarteditor2/photo_uploader/popup/php/index.php new file mode 100644 index 000000000..7afd9da51 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/php/index.php @@ -0,0 +1,32 @@ + $data_dir, + 'upload_url' => $data_url, + // This option will disable creating thumbnail images and will not create that extra folder. + // However, due to this, the images preview will not be displayed after upload + 'image_versions' => array() +); + +$upload_handler = new UploadHandler($options); \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/XPButtonUploadText_61x22.png b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/XPButtonUploadText_61x22.png new file mode 100644 index 0000000000000000000000000000000000000000..df7aa6eab8cb94069d2bc5d640eba51bc9ce5fc4 GIT binary patch literal 1855 zcmV-F2f+A=P)?00007bV*G`2iOS* z76>od-3GY;000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP000KgNkl4+2tEi3zEmZMMSKzj zse<%DBKYJ5gah8i}0n|dlOd0|w-qe(W#l`t$ z?~{|JD&r|gD+XETf+z4|zrVOYm;2(iPi>~L;&u_ElzOsP8|MX1eWG74CDMAu&44PA zZfR+Ug@qY@)PZ%Y_Hv9l&Wq0*Y4D%4KB)QmJ7t5E>ll|xb(Go6adtkdc4+fD(~2WY zk1!7^iYQ&v<;O~(4tDC$#yKvPT3bW^c4IRwWPYZ%m0z|w#kIDsgSolsGCSJb_HQ>f zi-k;gRwg_MT4K|E~ab4#2jCyg@7xrwW=^`RDaQ(k0r*&nHn zbmsCXEG|S#a^epg?12gik6)kRvJrXn(_xyqc?XW{-3$X;I>H{K|D-`I+Y>kE;rPfU z*w))6@_6X$AL+NhosYdR`0{go@cBDO2)_*#%1Qi@F9_X$tD)_6^YGe%$Dw_VT4T4- z#gdwYFMj$PX7jB;wjchOo;lVBt&4vFsc)~n_lSb#W?-)A2^c(jL8zhaiD|xr(QWTS zB==cAF!~|1CI2(jP$-K1%h1Z=2FjnIiJIdzaYt6n#hNtk)r!PZ%(S{Zq{CE0Wu8Jg zQI~Xg#j>*1P~<6z{ghXTFCs#5rH2IO9p8u+;csk6|07_Y$iNR(Me}n0{Ao2 zQB^}BkJ*fI&8t`q<<~TED%8U&#N_UkF zh8nt2JqxdPd=~Z)1ILN!x8YXf-~%-@_9#D6E-9imL`qD0VYWsRfBsPE5o5-<%R^=+k`Lrv*rNzB)6$c4l>BaS|| z5UV!kQOD}^h;Q+k^hDZ4@X{Uuc6s|3$8?X)^q zT6yjIkmIcS*XxyhUO>*AI!PbfwY#cs%#5IC-4C2U_s{CQIa!^gQAR;k!4E_|wUH;6 tgHbm^8RhQXg|NpIIAP?8d{?C~_&=p96%WXS@Jj#y002ovPDHLkV1n~|kk$YI literal 0 HcmV?d00001 diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/fileprogress.js b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/fileprogress.js new file mode 100644 index 000000000..ffe6aee94 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/fileprogress.js @@ -0,0 +1,203 @@ +/* + A simple class for displaying file information and progress + Note: This is a demonstration only and not part of SWFUpload. + Note: Some have had problems adapting this class in IE7. It may not be suitable for your application. +*/ + +// Constructor +// file is a SWFUpload file object +// targetID is the HTML element id attribute that the FileProgress HTML structure will be added to. +// Instantiating a new FileProgress object with an existing file will reuse/update the existing DOM elements +function FileProgress(file, targetID) { + this.fileProgressID = file.id; + + this.opacity = 100; + this.height = 0; + + + this.fileProgressWrapper = document.getElementById(this.fileProgressID); + if (!this.fileProgressWrapper) { + this.fileProgressWrapper = document.createElement("div"); + this.fileProgressWrapper.className = "progressWrapper"; + this.fileProgressWrapper.id = this.fileProgressID; + + this.fileProgressElement = document.createElement("div"); + this.fileProgressElement.className = "progressContainer"; + + var progressCancel = document.createElement("a"); + progressCancel.className = "progressCancel"; + progressCancel.href = "#"; + progressCancel.style.visibility = "hidden"; + progressCancel.appendChild(document.createTextNode(" ")); + + var progressText = document.createElement("div"); + progressText.className = "progressName"; + progressText.appendChild(document.createTextNode(file.name)); + + var progressBar = document.createElement("div"); + progressBar.className = "progressBarInProgress"; + + var progressStatus = document.createElement("div"); + progressStatus.className = "progressBarStatus"; + progressStatus.innerHTML = " "; + + this.fileProgressElement.appendChild(progressCancel); + this.fileProgressElement.appendChild(progressText); + this.fileProgressElement.appendChild(progressStatus); + this.fileProgressElement.appendChild(progressBar); + + this.fileProgressWrapper.appendChild(this.fileProgressElement); + + document.getElementById(targetID).appendChild(this.fileProgressWrapper); + } else { + this.fileProgressElement = this.fileProgressWrapper.firstChild; + this.reset(); + } + + this.height = this.fileProgressWrapper.offsetHeight; + this.setTimer(null); + + +} + +FileProgress.prototype.setTimer = function (timer) { + this.fileProgressElement["FP_TIMER"] = timer; +}; +FileProgress.prototype.getTimer = function (timer) { + return this.fileProgressElement["FP_TIMER"] || null; +}; + +FileProgress.prototype.reset = function () { + this.fileProgressElement.className = "progressContainer"; + + this.fileProgressElement.childNodes[2].innerHTML = " "; + this.fileProgressElement.childNodes[2].className = "progressBarStatus"; + + this.fileProgressElement.childNodes[3].className = "progressBarInProgress"; + this.fileProgressElement.childNodes[3].style.width = "0%"; + + this.appear(); +}; + +FileProgress.prototype.setProgress = function (percentage) { + this.fileProgressElement.className = "progressContainer green"; + this.fileProgressElement.childNodes[3].className = "progressBarInProgress"; + this.fileProgressElement.childNodes[3].style.width = percentage + "%"; + + this.appear(); +}; +FileProgress.prototype.setComplete = function () { + this.fileProgressElement.className = "progressContainer blue"; + this.fileProgressElement.childNodes[3].className = "progressBarComplete"; + this.fileProgressElement.childNodes[3].style.width = ""; + + var oSelf = this; + this.setTimer(setTimeout(function () { + oSelf.disappear(); + }, 10000)); +}; +FileProgress.prototype.setError = function () { + this.fileProgressElement.className = "progressContainer red"; + this.fileProgressElement.childNodes[3].className = "progressBarError"; + this.fileProgressElement.childNodes[3].style.width = ""; + + var oSelf = this; + this.setTimer(setTimeout(function () { + oSelf.disappear(); + }, 5000)); +}; +FileProgress.prototype.setCancelled = function () { + this.fileProgressElement.className = "progressContainer"; + this.fileProgressElement.childNodes[3].className = "progressBarError"; + this.fileProgressElement.childNodes[3].style.width = ""; + + var oSelf = this; + this.setTimer(setTimeout(function () { + oSelf.disappear(); + }, 2000)); +}; +FileProgress.prototype.setStatus = function (status) { + this.fileProgressElement.childNodes[2].innerHTML = status; +}; + +// Show/Hide the cancel button +FileProgress.prototype.toggleCancel = function (show, swfUploadInstance) { + this.fileProgressElement.childNodes[0].style.visibility = show ? "visible" : "hidden"; + if (swfUploadInstance) { + var fileID = this.fileProgressID; + this.fileProgressElement.childNodes[0].onclick = function () { + swfUploadInstance.cancelUpload(fileID); + return false; + }; + } +}; + +FileProgress.prototype.appear = function () { + if (this.getTimer() !== null) { + clearTimeout(this.getTimer()); + this.setTimer(null); + } + + if (this.fileProgressWrapper.filters) { + try { + this.fileProgressWrapper.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 100; + } catch (e) { + // If it is not set initially, the browser will throw an error. This will set it if it is not set yet. + this.fileProgressWrapper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=100)"; + } + } else { + this.fileProgressWrapper.style.opacity = 1; + } + + this.fileProgressWrapper.style.height = ""; + + this.height = this.fileProgressWrapper.offsetHeight; + this.opacity = 100; + this.fileProgressWrapper.style.display = ""; + +}; + +// Fades out and clips away the FileProgress box. +FileProgress.prototype.disappear = function () { + + var reduceOpacityBy = 15; + var reduceHeightBy = 4; + var rate = 30; // 15 fps + + if (this.opacity > 0) { + this.opacity -= reduceOpacityBy; + if (this.opacity < 0) { + this.opacity = 0; + } + + if (this.fileProgressWrapper.filters) { + try { + this.fileProgressWrapper.filters.item("DXImageTransform.Microsoft.Alpha").opacity = this.opacity; + } catch (e) { + // If it is not set initially, the browser will throw an error. This will set it if it is not set yet. + this.fileProgressWrapper.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + this.opacity + ")"; + } + } else { + this.fileProgressWrapper.style.opacity = this.opacity / 100; + } + } + + if (this.height > 0) { + this.height -= reduceHeightBy; + if (this.height < 0) { + this.height = 0; + } + + this.fileProgressWrapper.style.height = this.height + "px"; + } + + if (this.height > 0 || this.opacity > 0) { + var oSelf = this; + this.setTimer(setTimeout(function () { + oSelf.disappear(); + }, rate)); + } else { + this.fileProgressWrapper.style.display = "none"; + this.setTimer(null); + } +}; \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js new file mode 100644 index 000000000..01d7786d8 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js @@ -0,0 +1,378 @@ +/* +@author romeojks (romeojks@gmail.com) +@version 0.1 +@brief 파일 업로드 관련 +*/ + +function swfUploadPreLoad() { + var self = this; + var loading = function () { + document.getElementById("divLoadingContent").style.display = ""; + + var longLoad = function () { + document.getElementById("divLoadingContent").style.display = "none"; + document.getElementById("divLongLoading").style.display = ""; + }; + this.customSettings.loadingTimeout = setTimeout(function () { + longLoad.call(self) + }, + 15 * 1000 + ); + }; + + this.customSettings.loadingTimeout = setTimeout(function () { + loading.call(self); + }, + 1*1000 + ); +} + +function swfUploadLoaded() { + var self = this; + clearTimeout(this.customSettings.loadingTimeout); + document.getElementById("divLoadingContent").style.display = "none"; + document.getElementById("divLongLoading").style.display = "none"; + document.getElementById("divAlternateContent").style.display = "none"; +} + +function swfUploadLoadFailed() { + clearTimeout(this.customSettings.loadingTimeout); + document.getElementById("divLoadingContent").style.display = "none"; + document.getElementById("divLongLoading").style.display = "none"; + document.getElementById("divAlternateContent").style.display = ""; +} + +function fileQueued(file) { + try { + var obj = document.getElementById(this.customSettings.fileListAreaID); + var filename = file.name; + + if (filename.length > 20) { + filename = filename.substr(0,20) + "..."; + }; + + var text = filename + " (대기중...)"; + var value = last_bf_no + file.index; + var opt_obj = new Option(text, value, true, true); + obj.options[obj.options.length] = opt_obj; + } catch (ex) { + this.debug(ex); + } +} + +function fileQueueError(file, errorCode, message) { + try { + switch (errorCode) { + case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED : + alert(message == 0 ? "더이상 업로드 할 수 없습니다." : (message == file_upload_limit ? file_upload_limit + "개 까지만 업로드 할 수 있습니다." : file_upload_limit + "개 까지만 업로드 할 수 있습니다.\n\n" + "현재 " + message + "개 남았습니다.")); + break; + case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT : + alert("업로드 가능한 파일 용량(" + file_size_limit + ")을 초과했습니다.\n\n" + "File name: " + file.name + ", File size: " + getfilesize(file.size)); + break; + case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE : + alert("파일 사이즈가 '0' 입니다.\n\n" + "File name: " + file.name + ", File size: " + getfilesize(file.size)); + break; + case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE : + alert("파일 타입이 올바르지 않습니다.\n\n" + "File name: " + file.name + ", File size: " + getfilesize(file.size)); + break; + default : + alert("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + getfilesize(file.size) + ", Message: " + message); + break; + }; + } catch (ex) { + this.debug(ex); + }; +} + +function fileDialogComplete(numFilesSelected, numFilesQueued) { + try { + this.startUpload(); + } catch (ex) { + this.debug(ex); + }; +} + +function uploadStart(file) { + try { + if ((sum_filesize + file.size) > getfilesize1(file_allsize_limit)) { + return false; + } else { + return true; + }; + } catch (ex) { + this.debug(ex); + }; +} + +function uploadProgress(file, bytesLoaded, bytesTotal) { + try { + var obj = document.getElementById(this.customSettings.fileListAreaID); + var percent = Math.ceil((bytesLoaded / bytesTotal) * 100); + var filename = file.name; + + if (filename.length > 20) { + filename = filename.substr(0,20) + "..."; + }; + + var text = filename + " (" + percent + " %)"; + var bf_position = last_bf_no + file.index; + + obj.options[bf_position].text = text; + } catch (ex) { + this.debug(ex); + }; +} + +function uploadSuccess(file, serverData) { + try { + var obj = document.getElementById(this.customSettings.fileListAreaID); + var bf_position = last_bf_no + file.index; + var params = { + "bo_table" : bo_table, + "wr_id" : wr_id, + "w" : w, + "bf_position" : bf_position+1 + }; + + var url = swfupload_path + "/get_file_info.php"; + $.ajax({ + type: 'post', + url: url, + data: params, + success : after_upload_success = function(req) { + var file = eval('('+req+')'); + var file_size = (file.bf_filesize / 1024).toFixed(1); + var text = file.bf_source + " (" + getfilesize(file.bf_filesize) + ")"; + var value = file.bf_no + "|" + file.bf_source + "|" + file.bf_file + "|" + file.bf_filesize + "|" + file.bf_width + "|" + file.bf_type; + obj.options[bf_position].text = text; + obj.options[bf_position].value = value; + eval("preview(file.bf_file)"); + } + }); + + sum_filesize = sum_filesize + file.size; + document.getElementById("uploader_status").innerHTML = "문서첨부제한 : " + getfilesize(sum_filesize) + " / " + file_allsize_limit + "
파일제한크기 : " + file_size_limit + " (허용확장자 : " + file_types_description + ")"; + } catch (ex) { + this.debug(ex); + }; +} + +function uploadError(file, errorCode, message) { + try { + switch (errorCode) { + case SWFUpload.UPLOAD_ERROR.HTTP_ERROR : + alert("네트워크 에러가 발생하였습니다. 관리자에게 문의하세요.\n\n" + "File name: " + file.name); + break; + case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED : + alert("파일 업로드가 실패하였습니다.\n\n" + "File name: " + file.name + ", File size: " + getfilesize(file.size)); + break; + case SWFUpload.UPLOAD_ERROR.IO_ERROR : + alert("입출력 에러가 발생하였습니다.\n\n" + "다른 프로그램에서 이 파일(" + file.name + ")을 사용중인지 확인하세요."); + break; + case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR : + alert("보안 에러가 발생하였습니다. 관리자에게 문의하세요.\n\n" + "File name: " + file.name); + break; + case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED : + alert("업로드 가능한 파일 용량(" + file_size_limit + ")을 초과했습니다.\n\n" + "File name: " + file.name + ", File size: " + getfilesize(file.size)); + break; + case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED : + alert("업로드 가능한 총파일 용량(" + file_allsize_limit + ")을 초과했습니다.\n\n" + "File name: " + file.name + ", File size: " + getfilesize(file.size)); + break; + case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED : + // If there aren't any files left (they were all cancelled) disable the cancel button + if (this.getStats().files_queued === 0) { + document.getElementById(this.customSettings.cancelButtonId).disabled = true; + }; + break; + case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED : + break; + default : + alert("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + getfilesize(file.size) + ", Message: " + message); + break; + } + } catch (ex) { + this.debug(ex); + }; +} + +function uploadComplete(file) { + /*if (this.getStats().files_queued === 0) { + document.getElementById(this.customSettings.cancelButtonId).disabled = true; + }*/ +} + +function getfilesize(size) { + if (!size) { + return "0 Byte"; + }; + if (size < 1024) { + return (size + " Byte"); + } else if (size > 1024 && size < 1024 *1024) { + return (size / 1024).toFixed(1) + " KB"; + } else { + return (size / (1024*1024)).toFixed(2) + " MB"; + }; +} + +function getfilesize1(size) { + var file_size = size.split(" "); + if (!file_size[0]) { + return 0; + }; + if (file_size[1] == "MB") { + return (file_size[0] * (1024*1024)); + } else if (file_size[1] == "KB") { + return (file_size[0] * 1024); + } else { + return (file_size[0]); + }; +} + +function delete_file() { + try { + var obj = document.getElementById("uploaded_file_list"); + var url = swfupload_path + "/file_delete.php"; + for (var i=0; i파일제한크기 : " + file_size_limit + " (허용확장자 : " + file_types_description + ")"; + }; + }; + } catch (ex) { + this.debug(ex); + }; +} + +function delete_file_complete() { + try { + var obj = document.getElementById("uploaded_file_list"); + for (var i=0; i"; + } else if (thumb && thumb_kind == "etc") { + document.getElementById("image_preview").innerHTML = ""; + } else { + document.getElementById("image_preview").innerHTML = "미리보기"; + }; + } catch (ex) { + this.debug(ex); + }; +} + +function file_to_editor() { + try { + var files_list = document.getElementById("uploaded_file_list"); + var html = ''; + + if (!files_list.value) { + alert('파일을 선택해주세요.'); + return false; + }; + + for (var i=0; i"; + } else { + alert("이미지만 삽입 할 수 있습니다."); + //path = "download.php?bo_table=" + bo_table + "&filename=" + file.bf_file + "&filesource=" + file.bf_source + ""; + //html += "" + file.bf_source + "
\n"; + } + }; + }; + insert_editor(html2); + } catch (ex) { + this.debug(ex); + }; +} + +function insert_editor(html) { + try { + ed_wr_content.insertContents(html); + /* + if (typeof(ed_wr_content) != "undefined") + if (geditor_wr_content.get_mode() == "WYSIWYG") { + document.getElementById("geditor_wr_content_frame").contentWindow.document.body.focus(); + geditor_wr_content.get_range(); + html = html + "
"; + } else if (geditor_wr_content.get_mode() == "TEXT") { + html = html + "\n"; + } else { + html = html + "
"; + } + geditor_wr_content.insert_editor(html); + } else { + document.getElementById("wr_content").value += html + "\n"; + } + */ + } catch (ex) { + this.debug(ex); + }; + +} + +function get_file_info(val) { + try { + var arr = val.split('|'); + var ret = {"bf_no":arr[0], "bf_source":arr[1], "bf_file":arr[2], "bf_filesize":arr[3], "bf_width":arr[4], "bf_type":arr[5]}; + return ret; + } catch (ex) { + this.debug(ex); + }; +} diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/jquery.swfupload.js b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/jquery.swfupload.js new file mode 100644 index 000000000..e8f4d5fd1 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/jquery.swfupload.js @@ -0,0 +1,82 @@ +/* + * SWFUpload jQuery Plugin v1.0.0 + * + * Copyright (c) 2009 Adam Royle + * Licensed under the MIT license. + * + */ + +(function($){ + + var defaultHandlers = [ + 'swfupload_preload_handler', + 'swfupload_load_failed_handler', + 'swfupload_loaded_handler', + 'file_dialog_start_handler', + 'file_queued_handler', + 'file_queue_error_handler', + 'file_dialog_complete_handler', + 'upload_resize_start_handler', + 'upload_start_handler', + 'upload_progress_handler', + 'upload_error_handler', + 'upload_success_handler', + 'upload_complete_handler', + 'mouse_click_handler', + 'mouse_out_handler', + 'mouse_over_handler', + 'queue_complete_handler' + ]; + var additionalHandlers = []; + + $.fn.swfupload = function(){ + var args = $.makeArray(arguments); + return this.each(function(){ + var swfu; + if (args.length == 1 && typeof(args[0]) == 'object') { + swfu = $(this).data('__swfu'); + if (!swfu) { + var settings = args[0]; + var $magicUploadControl = $(this); + var handlers = []; + $.merge(handlers, defaultHandlers); + $.merge(handlers, additionalHandlers); + $.each(handlers, function(i, v){ + var eventName = v.replace(/_handler$/, '').replace(/_([a-z])/g, function(){ return arguments[1].toUpperCase(); }); + settings[v] = function() { + var event = $.Event(eventName); + $magicUploadControl.trigger(event, $.makeArray(arguments)); + return !event.isDefaultPrevented(); + }; + }); + $(this).data('__swfu', new SWFUpload(settings)); + } + } else if (args.length > 0 && typeof(args[0]) == 'string') { + var methodName = args.shift(); + swfu = $(this).data('__swfu'); + if (swfu && swfu[methodName]) { + swfu[methodName].apply(swfu, args); + } + } + }); + }; + + $.swfupload = { + additionalHandlers: function() { + if (arguments.length === 0) { + return additionalHandlers.slice(); + } else { + $(arguments).each(function(i, v){ + $.merge(additionalHandlers, $.makeArray(v)); + }); + } + }, + defaultHandlers: function() { + return defaultHandlers.slice(); + }, + getInstance: function(el) { + return $(el).data('__swfu'); + } + }; + +})(jQuery); \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.js b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.js new file mode 100644 index 000000000..67bee4c49 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.js @@ -0,0 +1,1002 @@ +/** + * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com + * + * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/ + * + * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz? and Mammon Media and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + */ + + +/* ******************* */ +/* Constructor & Init */ +/* ******************* */ +var SWFUpload; + +if (SWFUpload == undefined) { + SWFUpload = function (settings) { + this.initSWFUpload(settings); + }; +} + +SWFUpload.prototype.initSWFUpload = function (settings) { + try { + this.customSettings = {}; // A container where developers can place their own settings associated with this instance. + this.settings = settings; + this.eventQueue = []; + this.movieName = "SWFUpload_" + SWFUpload.movieCount++; + this.movieElement = null; + + + // Setup global control tracking + SWFUpload.instances[this.movieName] = this; + + // Load the settings. Load the Flash movie. + this.initSettings(); + this.loadFlash(); + this.displayDebugInfo(); + } catch (ex) { + delete SWFUpload.instances[this.movieName]; + throw ex; + } +}; + +/* *************** */ +/* Static Members */ +/* *************** */ +SWFUpload.instances = {}; +SWFUpload.movieCount = 0; +SWFUpload.version = "2.2.0 2009-03-25"; +SWFUpload.QUEUE_ERROR = { + QUEUE_LIMIT_EXCEEDED : -100, + FILE_EXCEEDS_SIZE_LIMIT : -110, + ZERO_BYTE_FILE : -120, + INVALID_FILETYPE : -130 +}; +SWFUpload.UPLOAD_ERROR = { + HTTP_ERROR : -200, + MISSING_UPLOAD_URL : -210, + IO_ERROR : -220, + SECURITY_ERROR : -230, + UPLOAD_LIMIT_EXCEEDED : -240, + UPLOAD_FAILED : -250, + SPECIFIED_FILE_ID_NOT_FOUND : -260, + FILE_VALIDATION_FAILED : -270, + FILE_CANCELLED : -280, + UPLOAD_STOPPED : -290 +}; +SWFUpload.FILE_STATUS = { + QUEUED : -1, + IN_PROGRESS : -2, + ERROR : -3, + COMPLETE : -4, + CANCELLED : -5 +}; +SWFUpload.BUTTON_ACTION = { + SELECT_FILE : -100, + SELECT_FILES : -110, + START_UPLOAD : -120 +}; +SWFUpload.CURSOR = { + ARROW : -1, + HAND : -2 +}; +SWFUpload.WINDOW_MODE = { + WINDOW : "window", + TRANSPARENT : "transparent", + OPAQUE : "opaque" +}; + +// Private: takes a URL, determines if it is relative and converts to an absolute URL +// using the current site. Only processes the URL if it can, otherwise returns the URL untouched +SWFUpload.completeURL = function(url) { + if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) { + return url; + } + + var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : ""); + + var indexSlash = window.location.pathname.lastIndexOf("/"); + if (indexSlash <= 0) { + path = "/"; + } else { + path = window.location.pathname.substr(0, indexSlash) + "/"; + } + + return /*currentURL +*/ path + url; + +}; + + +/* ******************** */ +/* Instance Members */ +/* ******************** */ + +// Private: initSettings ensures that all the +// settings are set, getting a default value if one was not assigned. +SWFUpload.prototype.initSettings = function () { + this.ensureDefault = function (settingName, defaultValue) { + this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; + }; + + // Upload backend settings + this.ensureDefault("upload_url", ""); + this.ensureDefault("preserve_relative_urls", false); + this.ensureDefault("file_post_name", "Filedata"); + this.ensureDefault("post_params", {}); + this.ensureDefault("use_query_string", false); + this.ensureDefault("requeue_on_error", false); + this.ensureDefault("http_success", []); + this.ensureDefault("assume_success_timeout", 0); + + // File Settings + this.ensureDefault("file_types", "*.*"); + this.ensureDefault("file_types_description", "All Files"); + this.ensureDefault("file_size_limit", 0); // Default zero means "unlimited" + this.ensureDefault("file_upload_limit", 0); + this.ensureDefault("file_queue_limit", 0); + + // Flash Settings + this.ensureDefault("flash_url", "swfupload.swf"); + this.ensureDefault("prevent_swf_caching", true); + + // Button Settings + this.ensureDefault("button_image_url", ""); + this.ensureDefault("button_width", 1); + this.ensureDefault("button_height", 1); + this.ensureDefault("button_text", ""); + this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;"); + this.ensureDefault("button_text_top_padding", 0); + this.ensureDefault("button_text_left_padding", 0); + this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES); + this.ensureDefault("button_disabled", false); + this.ensureDefault("button_placeholder_id", ""); + this.ensureDefault("button_placeholder", null); + this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW); + this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW); + + // Debug Settings + this.ensureDefault("debug", false); + this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API + + // Event Handlers + this.settings.return_upload_start_handler = this.returnUploadStart; + this.ensureDefault("swfupload_loaded_handler", null); + this.ensureDefault("file_dialog_start_handler", null); + this.ensureDefault("file_queued_handler", null); + this.ensureDefault("file_queue_error_handler", null); + this.ensureDefault("file_dialog_complete_handler", null); + + this.ensureDefault("upload_start_handler", null); + this.ensureDefault("upload_progress_handler", null); + this.ensureDefault("upload_error_handler", null); + this.ensureDefault("upload_success_handler", null); + this.ensureDefault("upload_complete_handler", null); + + this.ensureDefault("debug_handler", this.debugMessage); + + this.ensureDefault("custom_settings", {}); + + // Other settings + this.customSettings = this.settings.custom_settings; + + // Update the flash url if needed + if (!!this.settings.prevent_swf_caching) { + this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime(); + } + + if (!this.settings.preserve_relative_urls) { + //this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it + this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url); + this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url); + } + + delete this.ensureDefault; +}; + +// Private: loadFlash replaces the button_placeholder element with the flash movie. +SWFUpload.prototype.loadFlash = function () { + var targetElement, tempParent, container; + + // Make sure an element with the ID we are going to use doesn't already exist + if (document.getElementById(this.movieName) !== null) { + throw "ID " + this.movieName + " is already in use. The Flash Object could not be added"; + } + + // Get the element where we will be placing the flash movie + targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder; + + if (targetElement == undefined) { + throw "Could not find the placeholder element: " + this.settings.button_placeholder_id; + } + + // Append the container and load the flash + tempParent = document.createElement("div"); + tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers) + //targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement); + container = targetElement.parentNode; + + var containerStyle = tempParent.style; + + containerStyle.position = "absolute"; + + containerStyle.top = containerStyle.left = "0"; + containerStyle.width = targetElement.parentNode.offsetWidth+"px"; + containerStyle.height = targetElement.parentNode.offsetHeight+"px"; + containerStyle.overflow = "hidden"; + + if (this.getStyle(container, 'position') === 'static') { //ڵ߰ + container.style.position = 'relative'; + } + targetElement.parentNode.replaceChild(tempParent, targetElement); //ڵ߰ + // Fix IE Flash/Form bug + if (window[this.movieName] == undefined) { + window[this.movieName] = this.getMovieElement(); + } + +}; + +// Private: getFlashHTML generates the object tag needed to embed the flash in to the document +SWFUpload.prototype.getFlashHTML = function () { + // Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay + return ['', + '', + '', + '', + '', + '', + '', + ''].join(""); +}; + +// Private: getFlashVars builds the parameter string that will be passed +// to flash in the flashvars param. +SWFUpload.prototype.getFlashVars = function () { + // Build a string from the post param object + var paramString = this.buildParamString(); + var httpSuccessString = this.settings.http_success.join(","); + + // Build the parameter string + return ["movieName=", encodeURIComponent(this.movieName), + "&uploadURL=", encodeURIComponent(this.settings.upload_url), + "&useQueryString=", encodeURIComponent(this.settings.use_query_string), + "&requeueOnError=", encodeURIComponent(this.settings.requeue_on_error), + "&httpSuccess=", encodeURIComponent(httpSuccessString), + "&assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout), + "&params=", encodeURIComponent(paramString), + "&filePostName=", encodeURIComponent(this.settings.file_post_name), + "&fileTypes=", encodeURIComponent(this.settings.file_types), + "&fileTypesDescription=", encodeURIComponent(this.settings.file_types_description), + "&fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit), + "&fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit), + "&fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit), + "&debugEnabled=", encodeURIComponent(this.settings.debug_enabled), + "&buttonImageURL=", encodeURIComponent(this.settings.button_image_url), + "&buttonWidth=", encodeURIComponent(this.settings.button_width), + "&buttonHeight=", encodeURIComponent(this.settings.button_height), + "&buttonText=", encodeURIComponent(this.settings.button_text), + "&buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding), + "&buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding), + "&buttonTextStyle=", encodeURIComponent(this.settings.button_text_style), + "&buttonAction=", encodeURIComponent(this.settings.button_action), + "&buttonDisabled=", encodeURIComponent(this.settings.button_disabled), + "&buttonCursor=", encodeURIComponent(this.settings.button_cursor) + ].join(""); +}; + +// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload +// The element is cached after the first lookup +SWFUpload.prototype.getMovieElement = function () { + if (this.movieElement == undefined) { + this.movieElement = document.getElementById(this.movieName); + } + + if (this.movieElement === null) { + throw "Could not find Flash element"; + } + + return this.movieElement; +}; + +// Private: buildParamString takes the name/value pairs in the post_params setting object +// and joins them up in to a string formatted "name=value&name=value" +SWFUpload.prototype.buildParamString = function () { + var postParams = this.settings.post_params; + var paramStringPairs = []; + + if (typeof(postParams) === "object") { + for (var name in postParams) { + if (postParams.hasOwnProperty(name)) { + paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString())); + } + } + } + + return paramStringPairs.join("&"); +}; + +// Public: Used to remove a SWFUpload instance from the page. This method strives to remove +// all references to the SWF, and other objects so memory is properly freed. +// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state. +// Credits: Major improvements provided by steffen +SWFUpload.prototype.destroy = function () { + try { + // Make sure Flash is done before we try to remove it + this.cancelUpload(null, false); + + + // Remove the SWFUpload DOM nodes + var movieElement = null; + movieElement = this.getMovieElement(); + + if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE + // Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround) + for (var i in movieElement) { + try { + if (typeof(movieElement[i]) === "function") { + movieElement[i] = null; + } + } catch (ex1) {} + } + + // Remove the Movie Element from the page + try { + movieElement.parentNode.removeChild(movieElement); + } catch (ex) {} + } + + // Remove IE form fix reference + window[this.movieName] = null; + + // Destroy other references + SWFUpload.instances[this.movieName] = null; + delete SWFUpload.instances[this.movieName]; + + this.movieElement = null; + this.settings = null; + this.customSettings = null; + this.eventQueue = null; + this.movieName = null; + + + return true; + } catch (ex2) { + return false; + } +}; + + +// Public: displayDebugInfo prints out settings and configuration +// information about this SWFUpload instance. +// This function (and any references to it) can be deleted when placing +// SWFUpload in production. +SWFUpload.prototype.displayDebugInfo = function () { + this.debug( + [ + "---SWFUpload Instance Info---\n", + "Version: ", SWFUpload.version, "\n", + "Movie Name: ", this.movieName, "\n", + "Settings:\n", + "\t", "upload_url: ", this.settings.upload_url, "\n", + "\t", "flash_url: ", this.settings.flash_url, "\n", + "\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n", + "\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n", + "\t", "http_success: ", this.settings.http_success.join(", "), "\n", + "\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n", + "\t", "file_post_name: ", this.settings.file_post_name, "\n", + "\t", "post_params: ", this.settings.post_params.toString(), "\n", + "\t", "file_types: ", this.settings.file_types, "\n", + "\t", "file_types_description: ", this.settings.file_types_description, "\n", + "\t", "file_size_limit: ", this.settings.file_size_limit, "\n", + "\t", "file_upload_limit: ", this.settings.file_upload_limit, "\n", + "\t", "file_queue_limit: ", this.settings.file_queue_limit, "\n", + "\t", "debug: ", this.settings.debug.toString(), "\n", + + "\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n", + + "\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n", + "\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n", + "\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n", + "\t", "button_width: ", this.settings.button_width.toString(), "\n", + "\t", "button_height: ", this.settings.button_height.toString(), "\n", + "\t", "button_text: ", this.settings.button_text.toString(), "\n", + "\t", "button_text_style: ", this.settings.button_text_style.toString(), "\n", + "\t", "button_text_top_padding: ", this.settings.button_text_top_padding.toString(), "\n", + "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n", + "\t", "button_action: ", this.settings.button_action.toString(), "\n", + "\t", "button_disabled: ", this.settings.button_disabled.toString(), "\n", + + "\t", "custom_settings: ", this.settings.custom_settings.toString(), "\n", + "Event Handlers:\n", + "\t", "swfupload_loaded_handler assigned: ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n", + "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n", + "\t", "file_queued_handler assigned: ", (typeof this.settings.file_queued_handler === "function").toString(), "\n", + "\t", "file_queue_error_handler assigned: ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n", + "\t", "upload_start_handler assigned: ", (typeof this.settings.upload_start_handler === "function").toString(), "\n", + "\t", "upload_progress_handler assigned: ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n", + "\t", "upload_error_handler assigned: ", (typeof this.settings.upload_error_handler === "function").toString(), "\n", + "\t", "upload_success_handler assigned: ", (typeof this.settings.upload_success_handler === "function").toString(), "\n", + "\t", "upload_complete_handler assigned: ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n", + "\t", "debug_handler assigned: ", (typeof this.settings.debug_handler === "function").toString(), "\n" + ].join("") + ); +}; + +/* Note: addSetting and getSetting are no longer used by SWFUpload but are included + the maintain v2 API compatibility +*/ +// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used. +SWFUpload.prototype.addSetting = function (name, value, default_value) { + if (value == undefined) { + return (this.settings[name] = default_value); + } else { + return (this.settings[name] = value); + } +}; + +// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found. +SWFUpload.prototype.getSetting = function (name) { + if (this.settings[name] != undefined) { + return this.settings[name]; + } + + return ""; +}; + + + +// Private: callFlash handles function calls made to the Flash element. +// Calls are made with a setTimeout for some functions to work around +// bugs in the ExternalInterface library. +SWFUpload.prototype.callFlash = function (functionName, argumentArray) { + argumentArray = argumentArray || []; + + var movieElement = this.getMovieElement(); + var returnValue, returnString; + + // Flash's method if calling ExternalInterface methods (code adapted from MooTools). + try { + returnString = movieElement.CallFunction('' + __flash__argumentsToXML(argumentArray, 0) + ''); + returnValue = eval(returnString); + } catch (ex) { + throw "Call to " + functionName + " failed"; + } + + // Unescape file post param values + if (returnValue != undefined && typeof returnValue.post === "object") { + returnValue = this.unescapeFilePostParams(returnValue); + } + + return returnValue; +}; + +/* ***************************** + -- Flash control methods -- + Your UI should use these + to operate SWFUpload + ***************************** */ + +// WARNING: this function does not work in Flash Player 10 +// Public: selectFile causes a File Selection Dialog window to appear. This +// dialog only allows 1 file to be selected. +SWFUpload.prototype.selectFile = function () { + this.callFlash("SelectFile"); +}; + +// WARNING: this function does not work in Flash Player 10 +// Public: selectFiles causes a File Selection Dialog window to appear/ This +// dialog allows the user to select any number of files +// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names. +// If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around +// for this bug. +SWFUpload.prototype.selectFiles = function () { + this.callFlash("SelectFiles"); +}; + + +// Public: startUpload starts uploading the first file in the queue unless +// the optional parameter 'fileID' specifies the ID +SWFUpload.prototype.startUpload = function (fileID) { + this.callFlash("StartUpload", [fileID]); +}; + +// Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index. +// If you do not specify a fileID the current uploading file or first file in the queue is cancelled. +// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter. +SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) { + if (triggerErrorEvent !== false) { + triggerErrorEvent = true; + } + this.callFlash("CancelUpload", [fileID, triggerErrorEvent]); +}; + +// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue. +// If nothing is currently uploading then nothing happens. +SWFUpload.prototype.stopUpload = function () { + this.callFlash("StopUpload"); +}; + +/* ************************ + * Settings methods + * These methods change the SWFUpload settings. + * SWFUpload settings should not be changed directly on the settings object + * since many of the settings need to be passed to Flash in order to take + * effect. + * *********************** */ + +// Public: getStats gets the file statistics object. +SWFUpload.prototype.getStats = function () { + return this.callFlash("GetStats"); +}; + +// Public: setStats changes the SWFUpload statistics. You shouldn't need to +// change the statistics but you can. Changing the statistics does not +// affect SWFUpload accept for the successful_uploads count which is used +// by the upload_limit setting to determine how many files the user may upload. +SWFUpload.prototype.setStats = function (statsObject) { + this.callFlash("SetStats", [statsObject]); +}; + +// Public: getFile retrieves a File object by ID or Index. If the file is +// not found then 'null' is returned. +SWFUpload.prototype.getFile = function (fileID) { + if (typeof(fileID) === "number") { + return this.callFlash("GetFileByIndex", [fileID]); + } else { + return this.callFlash("GetFile", [fileID]); + } +}; + +// Public: addFileParam sets a name/value pair that will be posted with the +// file specified by the Files ID. If the name already exists then the +// exiting value will be overwritten. +SWFUpload.prototype.addFileParam = function (fileID, name, value) { + return this.callFlash("AddFileParam", [fileID, name, value]); +}; + +// Public: removeFileParam removes a previously set (by addFileParam) name/value +// pair from the specified file. +SWFUpload.prototype.removeFileParam = function (fileID, name) { + this.callFlash("RemoveFileParam", [fileID, name]); +}; + +// Public: setUploadUrl changes the upload_url setting. +SWFUpload.prototype.setUploadURL = function (url) { + this.settings.upload_url = url.toString(); + this.callFlash("SetUploadURL", [url]); +}; + +// Public: setPostParams changes the post_params setting +SWFUpload.prototype.setPostParams = function (paramsObject) { + this.settings.post_params = paramsObject; + this.callFlash("SetPostParams", [paramsObject]); +}; + +// Public: addPostParam adds post name/value pair. Each name can have only one value. +SWFUpload.prototype.addPostParam = function (name, value) { + this.settings.post_params[name] = value; + this.callFlash("SetPostParams", [this.settings.post_params]); +}; + +// Public: removePostParam deletes post name/value pair. +SWFUpload.prototype.removePostParam = function (name) { + delete this.settings.post_params[name]; + this.callFlash("SetPostParams", [this.settings.post_params]); +}; + +// Public: setFileTypes changes the file_types setting and the file_types_description setting +SWFUpload.prototype.setFileTypes = function (types, description) { + this.settings.file_types = types; + this.settings.file_types_description = description; + this.callFlash("SetFileTypes", [types, description]); +}; + +// Public: setFileSizeLimit changes the file_size_limit setting +SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) { + this.settings.file_size_limit = fileSizeLimit; + this.callFlash("SetFileSizeLimit", [fileSizeLimit]); +}; + +// Public: setFileUploadLimit changes the file_upload_limit setting +SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) { + this.settings.file_upload_limit = fileUploadLimit; + this.callFlash("SetFileUploadLimit", [fileUploadLimit]); +}; + +// Public: setFileQueueLimit changes the file_queue_limit setting +SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) { + this.settings.file_queue_limit = fileQueueLimit; + this.callFlash("SetFileQueueLimit", [fileQueueLimit]); +}; + +// Public: setFilePostName changes the file_post_name setting +SWFUpload.prototype.setFilePostName = function (filePostName) { + this.settings.file_post_name = filePostName; + this.callFlash("SetFilePostName", [filePostName]); +}; + +// Public: setUseQueryString changes the use_query_string setting +SWFUpload.prototype.setUseQueryString = function (useQueryString) { + this.settings.use_query_string = useQueryString; + this.callFlash("SetUseQueryString", [useQueryString]); +}; + +// Public: setRequeueOnError changes the requeue_on_error setting +SWFUpload.prototype.setRequeueOnError = function (requeueOnError) { + this.settings.requeue_on_error = requeueOnError; + this.callFlash("SetRequeueOnError", [requeueOnError]); +}; + +// Public: setHTTPSuccess changes the http_success setting +SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) { + if (typeof http_status_codes === "string") { + http_status_codes = http_status_codes.replace(" ", "").split(","); + } + + this.settings.http_success = http_status_codes; + this.callFlash("SetHTTPSuccess", [http_status_codes]); +}; + +// Public: setHTTPSuccess changes the http_success setting +SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) { + this.settings.assume_success_timeout = timeout_seconds; + this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]); +}; + +// Public: setDebugEnabled changes the debug_enabled setting +SWFUpload.prototype.setDebugEnabled = function (debugEnabled) { + this.settings.debug_enabled = debugEnabled; + this.callFlash("SetDebugEnabled", [debugEnabled]); +}; + +// Public: setButtonImageURL loads a button image sprite +SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) { + if (buttonImageURL == undefined) { + buttonImageURL = ""; + } + + this.settings.button_image_url = buttonImageURL; + this.callFlash("SetButtonImageURL", [buttonImageURL]); +}; + +// Public: setButtonDimensions resizes the Flash Movie and button +SWFUpload.prototype.setButtonDimensions = function (width, height) { + this.settings.button_width = width; + this.settings.button_height = height; + + var movie = this.getMovieElement(); + if (movie != undefined) { + movie.style.width = width + "px"; + movie.style.height = height + "px"; + } + + this.callFlash("SetButtonDimensions", [width, height]); +}; +// Public: setButtonText Changes the text overlaid on the button +SWFUpload.prototype.setButtonText = function (html) { + this.settings.button_text = html; + this.callFlash("SetButtonText", [html]); +}; +// Public: setButtonTextPadding changes the top and left padding of the text overlay +SWFUpload.prototype.setButtonTextPadding = function (left, top) { + this.settings.button_text_top_padding = top; + this.settings.button_text_left_padding = left; + this.callFlash("SetButtonTextPadding", [left, top]); +}; + +// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button +SWFUpload.prototype.setButtonTextStyle = function (css) { + this.settings.button_text_style = css; + this.callFlash("SetButtonTextStyle", [css]); +}; +// Public: setButtonDisabled disables/enables the button +SWFUpload.prototype.setButtonDisabled = function (isDisabled) { + this.settings.button_disabled = isDisabled; + this.callFlash("SetButtonDisabled", [isDisabled]); +}; +// Public: setButtonAction sets the action that occurs when the button is clicked +SWFUpload.prototype.setButtonAction = function (buttonAction) { + this.settings.button_action = buttonAction; + this.callFlash("SetButtonAction", [buttonAction]); +}; + +// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button +SWFUpload.prototype.setButtonCursor = function (cursor) { + this.settings.button_cursor = cursor; + this.callFlash("SetButtonCursor", [cursor]); +}; + +/* ******************************* + Flash Event Interfaces + These functions are used by Flash to trigger the various + events. + + All these functions a Private. + + Because the ExternalInterface library is buggy the event calls + are added to a queue and the queue then executed by a setTimeout. + This ensures that events are executed in a determinate order and that + the ExternalInterface bugs are avoided. +******************************* */ + +SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) { + // Warning: Don't call this.debug inside here or you'll create an infinite loop + + if (argumentArray == undefined) { + argumentArray = []; + } else if (!(argumentArray instanceof Array)) { + argumentArray = [argumentArray]; + } + + var self = this; + if (typeof this.settings[handlerName] === "function") { + // Queue the event + this.eventQueue.push(function () { + this.settings[handlerName].apply(this, argumentArray); + }); + + // Execute the next queued event + setTimeout(function () { + self.executeNextEvent(); + }, 0); + + } else if (this.settings[handlerName] !== null) { + throw "Event handler " + handlerName + " is unknown or is not a function"; + } +}; + +// Private: Causes the next event in the queue to be executed. Since events are queued using a setTimeout +// we must queue them in order to garentee that they are executed in order. +SWFUpload.prototype.executeNextEvent = function () { + // Warning: Don't call this.debug inside here or you'll create an infinite loop + + var f = this.eventQueue ? this.eventQueue.shift() : null; + if (typeof(f) === "function") { + f.apply(this); + } +}; + +// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have +// properties that contain characters that are not valid for JavaScript identifiers. To work around this +// the Flash Component escapes the parameter names and we must unescape again before passing them along. +SWFUpload.prototype.unescapeFilePostParams = function (file) { + var reg = /[$]([0-9a-f]{4})/i; + var unescapedPost = {}; + var uk; + + if (file != undefined) { + for (var k in file.post) { + if (file.post.hasOwnProperty(k)) { + uk = k; + var match; + while ((match = reg.exec(uk)) !== null) { + uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16))); + } + unescapedPost[uk] = file.post[k]; + } + } + + file.post = unescapedPost; + } + + return file; +}; + +// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working) +SWFUpload.prototype.testExternalInterface = function () { + try { + return this.callFlash("TestExternalInterface"); + } catch (ex) { + return false; + } +}; + +// Private: This event is called by Flash when it has finished loading. Don't modify this. +// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded. +SWFUpload.prototype.flashReady = function () { + // Check that the movie element is loaded correctly with its ExternalInterface methods defined + var movieElement = this.getMovieElement(); + + if (!movieElement) { + this.debug("Flash called back ready but the flash movie can't be found."); + return; + } + + this.cleanUp(movieElement); + + this.queueEvent("swfupload_loaded_handler"); +}; + +// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE. +// This function is called by Flash each time the ExternalInterface functions are created. +SWFUpload.prototype.cleanUp = function (movieElement) { + // Pro-actively unhook all the Flash functions + try { + if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE + this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)"); + for (var key in movieElement) { + try { + if (typeof(movieElement[key]) === "function") { + movieElement[key] = null; + } + } catch (ex) { + } + } + } + } catch (ex1) { + + } + + // Fix Flashes own cleanup code so if the SWFMovie was removed from the page + // it doesn't display errors. + window["__flash__removeCallback"] = function (instance, name) { + try { + if (instance) { + instance[name] = null; + } + } catch (flashEx) { + + } + }; + +}; + + +/* This is a chance to do something before the browse window opens */ +SWFUpload.prototype.fileDialogStart = function () { + this.queueEvent("file_dialog_start_handler"); +}; + + +/* Called when a file is successfully added to the queue. */ +SWFUpload.prototype.fileQueued = function (file) { + file = this.unescapeFilePostParams(file); + this.queueEvent("file_queued_handler", file); +}; + + +/* Handle errors that occur when an attempt to queue a file fails. */ +SWFUpload.prototype.fileQueueError = function (file, errorCode, message) { + file = this.unescapeFilePostParams(file); + this.queueEvent("file_queue_error_handler", [file, errorCode, message]); +}; + +/* Called after the file dialog has closed and the selected files have been queued. + You could call startUpload here if you want the queued files to begin uploading immediately. */ +SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) { + this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]); +}; + +SWFUpload.prototype.uploadStart = function (file) { + file = this.unescapeFilePostParams(file); + this.queueEvent("return_upload_start_handler", file); +}; + +SWFUpload.prototype.returnUploadStart = function (file) { + var returnValue; + if (typeof this.settings.upload_start_handler === "function") { + file = this.unescapeFilePostParams(file); + returnValue = this.settings.upload_start_handler.call(this, file); + } else if (this.settings.upload_start_handler != undefined) { + throw "upload_start_handler must be a function"; + } + + // Convert undefined to true so if nothing is returned from the upload_start_handler it is + // interpretted as 'true'. + if (returnValue === undefined) { + returnValue = true; + } + + returnValue = !!returnValue; + + this.callFlash("ReturnUploadStart", [returnValue]); +}; + + + +SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]); +}; + +SWFUpload.prototype.uploadError = function (file, errorCode, message) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_error_handler", [file, errorCode, message]); +}; + +SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_success_handler", [file, serverData, responseReceived]); +}; + +SWFUpload.prototype.uploadComplete = function (file) { + file = this.unescapeFilePostParams(file); + this.queueEvent("upload_complete_handler", file); +}; + +/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the + internal debug console. You can override this event and have messages written where you want. */ +SWFUpload.prototype.debug = function (message) { + this.queueEvent("debug_handler", message); +}; + + +/* ********************************** + Debug Console + The debug console is a self contained, in page location + for debug message to be sent. The Debug Console adds + itself to the body if necessary. + + The console is automatically scrolled as messages appear. + + If you are using your own debug handler or when you deploy to production and + have debug disabled you can remove these functions to reduce the file size + and complexity. +********************************** */ + +// Private: debugMessage is the default debug_handler. If you want to print debug messages +// call the debug() function. When overriding the function your own function should +// check to see if the debug setting is true before outputting debug information. +SWFUpload.prototype.debugMessage = function (message) { + if (this.settings.debug) { + var exceptionMessage, exceptionValues = []; + + // Check for an exception object and print it nicely + if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") { + for (var key in message) { + if (message.hasOwnProperty(key)) { + exceptionValues.push(key + ": " + message[key]); + } + } + exceptionMessage = exceptionValues.join("\n") || ""; + exceptionValues = exceptionMessage.split("\n"); + exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: "); + SWFUpload.Console.writeLine(exceptionMessage); + } else { + SWFUpload.Console.writeLine(message); + } + } +}; + +SWFUpload.Console = {}; +SWFUpload.Console.writeLine = function (message) { + var console, documentForm; + + try { + console = document.getElementById("SWFUpload_Console"); + + if (!console) { + documentForm = document.createElement("form"); + document.getElementsByTagName("body")[0].appendChild(documentForm); + + console = document.createElement("textarea"); + console.id = "SWFUpload_Console"; + console.style.fontFamily = "monospace"; + console.setAttribute("wrap", "off"); + console.wrap = "off"; + console.style.overflow = "auto"; + console.style.width = "700px"; + console.style.height = "350px"; + console.style.margin = "5px"; + documentForm.appendChild(console); + } + + console.value += message + "\n"; + + console.scrollTop = console.scrollHeight - console.clientHeight; + } catch (ex) { + alert("Exception: " + ex.name + " Message: " + ex.message); + } +}; + +SWFUpload.prototype.getStyle = function (obj, name) { //߰ + if (obj.currentStyle) { + return obj.currentStyle[name]; + } else if (window.getComputedStyle) { + return window.getComputedStyle(obj, null)[name]; + } +} \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.queue.js b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.queue.js new file mode 100644 index 000000000..5d65c30d4 --- /dev/null +++ b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.queue.js @@ -0,0 +1,99 @@ +/* + Queue Plug-in + + Features: + *Adds a cancelQueue() method for cancelling the entire queue. + *All queued files are uploaded when startUpload() is called. + *If false is returned from uploadComplete then the queue upload is stopped. + If false is not returned (strict comparison) then the queue upload is continued. + *Adds a QueueComplete event that is fired when all the queued files have finished uploading. + Set the event handler with the queue_complete_handler setting. + + */ + +var SWFUpload; +if (typeof(SWFUpload) === "function") { + SWFUpload.queue = {}; + + SWFUpload.prototype.initSettings = (function (oldInitSettings) { + return function () { + if (typeof(oldInitSettings) === "function") { + oldInitSettings.call(this); + } + + this.queueSettings = {}; + + this.queueSettings.queue_cancelled_flag = false; + this.queueSettings.queue_upload_count = 0; + + this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler; + this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler; + this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler; + this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler; + + this.settings.queue_complete_handler = this.settings.queue_complete_handler || null; + }; + })(SWFUpload.prototype.initSettings); + + SWFUpload.prototype.startUpload = function (fileID) { + this.queueSettings.queue_cancelled_flag = false; + this.callFlash("StartUpload", [fileID]); + }; + + SWFUpload.prototype.cancelQueue = function () { + this.queueSettings.queue_cancelled_flag = true; + this.stopUpload(); + + var stats = this.getStats(); + while (stats.files_queued > 0) { + this.cancelUpload(); + stats = this.getStats(); + } + }; + + SWFUpload.queue.uploadStartHandler = function (file) { + var returnValue; + if (typeof(this.queueSettings.user_upload_start_handler) === "function") { + returnValue = this.queueSettings.user_upload_start_handler.call(this, file); + } + + // To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value. + returnValue = (returnValue === false) ? false : true; + + this.queueSettings.queue_cancelled_flag = !returnValue; + + return returnValue; + }; + + SWFUpload.queue.uploadCompleteHandler = function (file) { + var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler; + var continueUpload; + + if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) { + this.queueSettings.queue_upload_count++; + } + + if (typeof(user_upload_complete_handler) === "function") { + continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true; + } else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) { + // If the file was stopped and re-queued don't restart the upload + continueUpload = false; + } else { + continueUpload = true; + } + + if (continueUpload) { + var stats = this.getStats(); + if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) { + this.startUpload(); + } else if (this.queueSettings.queue_cancelled_flag === false) { + console.debug('ydfsdfgsdfgsdfg'); + this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]); + this.queueSettings.queue_upload_count = 0; + } else { + this.queueSettings.queue_cancelled_flag = false; + this.queueSettings.queue_upload_count = 0; + } + } + }; +} \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.swf b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/swfupload.swf new file mode 100644 index 0000000000000000000000000000000000000000..e3f767031ca8243a5f0b89bc0f154cc5962e01e9 GIT binary patch literal 12787 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 밑줄 선택 글작성하다 취소선 선택하고 밑줄 선택을 취소한 경우 툴바에 반영되지 않는 문제 + - 굵게/밑줄/기울림/취소선이 있는 상태에서 엔터치고 폰트크기 수정하면 이전 폰트크기로 줄간격이 유지되는 문제 + - 외부프로그램 테이블 복사 붙여넣기 관련 오류 수정 + - IE8이하 > 글자크기 지정 후 엔터를 치면 커서위치가 위로 올라감 + - IE9이상 > 글꼴 효과를 미리 지정 한 후에 텍스트 입력 시, 색상 변경은 적용되나 굵게 기울임 밑줄 취소선 등의 효과는 적용안됨 + - [FF]밑줄 선택> 내용입력 후 엔터>밑줄 취소 후 내용 입력>마우스로 커서 클릭 후 내용 계속 입력 시 밑줄이 있는 글로 노출됨 + - [FF] 메모장에서 작성한 내용을 붙여넣기 후 엔터 > 내용입력 > 엔터 했을 때 줄바꿈이 되지 않는 현상 + - HTML5 > 글자를 선택하여 폰트크기 지정시 굵게/밑줄/기울림/취소선이 있으면 이전에 적용한 폰트크기 기준으로 줄간격이 유지되는 문제 + +2. 기능 개선 + - IE에서 자동으로 공백이 삽입되는 문제 + - MacOS > 사파리 > 외부프로그램 테이블 붙여넣기 개선 + +3. 보안 패치 + - 사진첨부 샘플의 null byte injection 취약점 보완 + +============================================================================================== +2.3.10 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - 크롬 > 브라우저 확대축소시 폰트크기가 잘못 나오는 이슈 + - IE > 표삽입>임의로 두개 칸 선택하여 셀 병합>행삽입 클릭 시 JS 오류 발생 + - IE11 > 호환성 보기를 설정하지 않을 경우 글꼴목록이 선택되지 않는 문제 수정 + +2. 기능 개선 + - 외부프로그램 테이블 복사 붙여넣기 개선 + - 입력창 조절 안내 레이어를 주석처리하면 스크립트 오류 발생 + +============================================================================================== +2.3.9 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - 파이어폭스에서 에디팅시 스타일깨짐 등 오작동 + - Chrome > 찾기/바꾸기 > 모두바꾸기 버튼 클릭시 찾을단어가 지워지지 않고 남아있음 + +2. 기능 개선 + - 링크 > 자동링크 설정/해제 옵션 추가 + - [IE11] WYSIWYG 모드와 HTML 모드를 오갈 때마다 문서의 마지막에 비정상적인
이 첨가됩니다. + - [웹접근성] 빠져나가기 단축키 기능 개선 + +============================================================================================== +2.3.8 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - 테이블 내부 영역을 Shift + 클릭으로 선택 후 정렬하고 HTML 로 전환하면 더미 P 태그가 생성되는 문제 수정 + - 테이블 내부 영역 선택 혹은 에디터 내용 전체 선택 후 정렬 시 동작안함 + - [IE10, IE11] 표의 셀을 드래그했을 때 블럭 지정이 되지 않는 현상 + - HTML 모드 변환시 태그 자동 정렬에 의한 버그 + +2. 기능 개선 + - [MacOS 대응] 폰트변경이슈 + +============================================================================================== +2.3.7 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - 에디터에 표 생성 후 일부 셀 선택하여 배경색 설정> 배경색 설정된 셀 선택 후 셀 삽입 시 색상이 삽입되지 않습니다. + - [IE9특정] 글 작성 중 번호매기기 또는 글머리 적용 후 정렬방식을 변경하면 엔터키 누를 시 커서가 한줄 떨어져서 노출됩니다. + - [IE10] 표 생성 후 표 드래그 시 셀의 너비/높이가 늘어나는 현상 + +2. 기능 개선 + - IE11 대응 + - 특수기호 삽입시 커서 위치가 뒤쪽으로 나오도록 개선 + - 커서에 활성화된 글꼴 확인 로직 개선 + +============================================================================================== +2.3.6 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - 글 작성 후 번호매기기 적용하고 엔터키 수행하는 경우 JS 오류가 발생하는 현상 수정 + +============================================================================================== +2.3.5 +---------------------------------------------------------------------------------------------- +1. 기능 개선 + - 줄간격 설정 시 값을 직접 입력하는 경우 줄간격의 최소값 적용 + +============================================================================================== +2.3.4 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - [IE9/10] pre 태그의 바로 다음에 \n이 존재하는 경우 개행이 되지 않는 이슈 해결 + - 입력창 크기 조절바 사용 여부 오류 해결 + - 사진 퀵 업로더 모듈 오타 수정 ($newPath -> $new_path) + +2. 기능 개선 + - 글꼴 목록에 글꼴 종류 추가하기 기능 (SmartEditor2.html 참조) + - 사진 퀵 업로더 모듈에 이미지 파일 확장자 체크 추가 + +============================================================================================== +2.3.3 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - IE9 에서 템플릿을 적용한 표 생성 후 일부의 셀을 드래그하는 경우 셀의 높이가 늘어나는 현상 수정 + +2. 기능 개선 + - MAC OS의 CMD 키로 Ctrl 단축키 기능 적용 확장 + - 기본 글꼴 종류 추가 (Courier New, 나눔고딕 코딩) + +============================================================================================== +2.3.1 +---------------------------------------------------------------------------------------------- +1. 기능 개선 + - [웹접근성] 글쓰기 영역의 iframe의 title속성에 단축키 설명 제공 + - [웹접근성] 제목 input영역에서 제목 입력 후 TAB하면 스마트에디터 편집 영역으로 포커스 이동하는 기능 추가 + - [웹접근성] 툴바 영역의 이전/다음 아이템 이동을 TAB, SHIFT+TAB으로 이동할 수 있도록 추가 + +============================================================================================== +2.3.0 +---------------------------------------------------------------------------------------------- +1. 기능 개선 + - [웹접근성] 키보드로만 메뉴를 이동할 수 있도록 단축키 적용 + - [웹접근성] 웹접근성 도움말 제공 + - 편집모드와 사이즈 조절바 사용 옵션 추가 + - 사진 첨부 팝업 데모 파일 구조 개선 + +============================================================================================== +2.2.1 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - 사진 퀵 업로더 추가 시, 가이드 대로 수행했을 때 사진 첨부가 2번 실행되는 문제 해결 + : loader-min.js 파일 내에 사진 퀵 업로더 소스가 포함되어 있던 부분 제거하여 소스 분리 + +2. 기능 개선 + - 툴바의 기능 제거/순서 변경이 쉽도록 마크업 구조 개선 + ※ 툴바의 기능 제거/순서 변경은 가이드 문서를 참고하세요. + + +3. 폴더/파일 변경 + - /js_src 폴더 제거 + - /js/smarteditor2.js 추가 + : /js_src 폴더를 /js/smarteditor2.js 로 대체했습니다. + : /js_src 폴더 구조에서 사용자가 소스를 검색하여 수정하기 어렵던 부분을 보완하기 위하여 + : /js_src 폴더 내의 플러그인 소스를 통합한 /js/smarteditor2.js 를 추가했습니다. + - /js/loader-min.js 제거 + - /js/smarteditor2.min.js 추가 + : /js/loader-min.js 파일을 /js/smarteditor2.min.js로 대체했습니다. + - /quick_photo_uploader 폴더 추가 + - /popup 폴더 이동 + : /popup 폴더 - 사진 퀵 업로더의 팝업과 관련된 소스 + : /plugin 폴더 - 사진 퀵 업로더의 사진첨부를 처리하는 플러그인 js 소스 + - /img/ko_KR 폴더 추가 + : 이후의 다국어 버전 지원을 위하여 이미지 폴더 내 디렉토리가 추가되었습니다. + : 언어 별 구분이 필요없는 이미지는 /img 바로 하위에 두었고, + : 언어 별로 구분되어야 하는 이미지는 /img/ko_KR 과 같이 언어 별 디렉토리로 구분했습니다. + : 버전 업그레이드를 하는 경우 이미지 경로가 변경된 점에 주의하시기 바랍니다. + - /js/SE2B_Configuration.js 제거 + - /js/SE2B_Configuration_Service.js 추가 + - /js/SE2B_Configuration_General.js 추가 + : /js/SE2B_Configuration_Service.js 와 /js/SE2B_Configuration_General.js로 파일 분리했습니다. + : /js/SE2B_Configuration_Service.js 는 적용을 할 때 사용자가 변경할 가능성이 높은 플러그인 설정을 갖고, + : /js/SE2B_Configuration_General.js 는 서비스에 적용할 때 변경할 가능성이 거의 없는 설정입니다. + +============================================================================================== +2.1.3 +---------------------------------------------------------------------------------------------- +1. 버그 수정 + - [Chrome] 보기 페이지에 글자색이 설정되어 있는 경우 글 작성 시 내용에 적용한 글자색으로 노출되지 않는 문제 해결 + - 엔터 처리가
로 설정된 경우에도 텍스트 모드에서 모드변경 혹은 글 저장할 때 개행이

로 표시되는 문제 해결 + - [IE9] 각주 삽입 시, 하단으로 떨어지는 이슈 해결 + - [Chrome] 인용구 밖에 글머리기호/번호매기기가 있을 때 인용구 안에서 글머리기호/번호매기기 시 내용이 인용구 밖으로 나가는 문제 해결 + - [IE] IE에서 특정 블로그 글을 복사하여 붙여넣기 했을 때 개행이 제거되는 문제 해결 + - 사진을 드래그해서 사이즈를 변경한 후 저장 혹은 HTML모드로 변경하면, 사진 사이즈가 원복되는 현상 해결 + - [Chrome/FF/Safari] 스크롤바가 생성되도록 문자입력 후 엔터 클릭하지 않은 상태에서 이미지 하나 삽입 시 이미지에 포커싱이 놓이지 않는 문제 해결 + - [IE9 표준] 사진을 스크롤로 일부 가린 상태에서 재편집하여 적용했을 때 계속 가려진 상태인 문제 해결 + - FF에서 사진을 여러장 첨부 시 스크롤이 가장 마지막 추가한 사진으로 내려가지 않음 해결 + - 호환 모드를 제거하고 사진 첨부 시 에디팅 영역의 커서 주위에 태그가 붙어서 글자가 매우 작게 되는 현상 해결 + - [IE9] 에디터에 각주 연속으로 입력 시 커서가 각주사이로 이동되는 현상 해결 + - 글꼴색/글꼴배경색 더보기에서 글꼴색 선택>다시 다른 색상 선택 후 처음 선택되었던 색상 선택 시 처음 선택색상이 원래 자리에서 삭제되지 않는 현상 해결 + - 제공하지 않는 기능인 이모티콘 플러그인 소스 제거 + - 플러그인 태그 코드 추가 시

  • 태그와 diff --git a/plugin/editor/smarteditor2/smart_editor2_inputarea.html b/plugin/editor/smarteditor2/smart_editor2_inputarea.html new file mode 100644 index 000000000..eede17a95 --- /dev/null +++ b/plugin/editor/smarteditor2/smart_editor2_inputarea.html @@ -0,0 +1,8 @@ + + + + +Smart Editor™ WYSIWYG Mode + + + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/smart_editor2_inputarea_ie8.html b/plugin/editor/smarteditor2/smart_editor2_inputarea_ie8.html new file mode 100644 index 000000000..1c35a9945 --- /dev/null +++ b/plugin/editor/smarteditor2/smart_editor2_inputarea_ie8.html @@ -0,0 +1,9 @@ + + + + + +Smart Editor™ WYSIWYG Mode + + + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/src_include.txt b/plugin/editor/smarteditor2/src_include.txt new file mode 100644 index 000000000..10ec6cf1b --- /dev/null +++ b/plugin/editor/smarteditor2/src_include.txt @@ -0,0 +1,7 @@ +자바스크립트 소스를 직접 수정하고자 할 경우는 SmartEditor2Skin.html 소스를 아래의 과정으로 수정한 후 자바스크립트 소스를 수정합니다. + +1) SmartEditor2Skin.html 소스에서 아래의 부분을 삭제합니다. + + +2) 다음의 라인을 복사하여 붙여넣습니다. + \ No newline at end of file From 9d8a776bd9a6a5322c630745a649cfb1a3723fee Mon Sep 17 00:00:00 2001 From: thisgun Date: Thu, 17 Jul 2014 14:25:16 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=8A=A4=EB=A7=88=ED=8A=B8=20=EC=97=90?= =?UTF-8?q?=EB=94=94=ED=84=B02=20=EC=88=98=EC=A0=95=EB=90=9C=20js=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=9D=84=20pack=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/editor/smarteditor2/js/smarteditor2.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/editor/smarteditor2/js/smarteditor2.min.js b/plugin/editor/smarteditor2/js/smarteditor2.min.js index c199eb7d9..1755e6ee0 100644 --- a/plugin/editor/smarteditor2/js/smarteditor2.min.js +++ b/plugin/editor/smarteditor2/js/smarteditor2.min.js @@ -1 +1 @@ -var nSE2Version=11329;if(typeof window.nhn=="undefined"){window.nhn={}}nhn.FindReplace=jindo.$Class({sKeyword:"",window:null,document:null,bBrowserSupported:false,bEOC:false,$init:function(c){this.sInlineContainer="SPAN|B|U|I|S|STRIKE";this.rxInlineContainer=new RegExp("^("+this.sInlineContainer+")$");this.window=c;this.document=this.window.document;if(this.document.domain!=this.document.location.hostname){var a=jindo.$Agent();var b=a.navigator();if(b.firefox&&b.version<3){this.bBrowserSupported=false;this.find=function(){return 3};return}}this.bBrowserSupported=true},_findNextElement:function(b){if(!b||b.tagName=="BODY"){return null}var a=b.nextSibling;if(a){return(a.nodeType==1?a:this._findNextElement(a))}else{return this._findNextElement(b.parentNode)}},find:function(a,c,d,e){var f,b;this.window.focus();if(!a){return 2}this.bEOC=false;f=this.findNext(a,c,d,e);if(f){return 0}this.bEOC=true;f=this.findNew(a,c,d,e);if(f){return 0}return 1},findNew:function(a,b,c,d){this.findReset();return this.findNext(a,b,c,d)},findNext:function(g,f,b,a){var c;f=f||false;a=a||false;b=b||false;if(this.window.find){var k=false;return this.window.find(g,f,b,k,a)}if(this.document.body.createTextRange){try{var j=0;if(b){j+=1}if(a){j+=2}if(f){j+=4}this.window.focus();if(this.document.selection){this._range=this.document.selection.createRangeCollection().item(0);this._range.collapse(false)}else{this._range=this.document.body.createTextRange();var d=this._findNextElement(this.window.getSelection().focusNode);if(d){this._range.moveToElementText(d)}}c=this._range.findText(g,1,j);this._range.select();return c}catch(h){return false}}return false},findReset:function(){if(this.window.find){this.window.getSelection().removeAllRanges();return}if(this.document.body.createTextRange){if(this.document.selection){this._range=this.document.body.createTextRange();this._range.collapse(true);this._range.select()}else{if(this.window.getSelection){var a=this.window.getSelection();a.removeAllRanges();a.selectAllChildren(this.document.body);a.collapseToStart()}}}},replace:function(b,d,a,c,e){return this._replace(b,d,a,c,e)},_replace:function(c,f,b,d,g,e){if(!c){return 4}e=e||new nhn.HuskyRange(this.window);e.setFromSelection();b=b||false;var a,h=e.toString();if(b){a=(h==c)}else{a=(h.toLowerCase()==c.toLowerCase())}if(!a){return this.find(c,b,d,g)+2}if(typeof f=="function"){e=f(e)}else{e.pasteText(f)}e.select();return this.find(c,b,d,g)},replaceAll:function(e,h,j,b){if(!e){return -1}var c=false;var l;var a=0;var k=this.window;if(this.find(e,j,c,b)!==0){return a}var g=new nhn.HuskyRange(this.window);g.setFromSelection();g.collapseToStart();var m=this.window.document.createElement("SPAN");m.innerHTML=unescape("%uFEFF");g.insertNode(m);g.select();var d=g.placeStringBookmark();this.bEOC=false;while(!this.bEOC){l=this._replace(e,h,j,c,b,g);if(l==0||l==1){a++}}var f=function(){var n=new nhn.HuskyRange(k);n.setFromSelection();g.moveToBookmark(d);var o=g.compareBoundaryPoints(nhn.W3CDOMRange.START_TO_END,n);if(o==1){return false}return true};l=0;this.bEOC=false;while(!f()&&l==0&&!this.bEOC){l=this._replace(e,h,j,c,b,g);if(l==0||l==1){a++}}g.moveToBookmark(d);g.deleteContents();g.removeStringBookmark(d);setTimeout(function(){m.parentNode.removeChild(m)},0);return a},_isBlankTextNode:function(a){if(a.nodeType==3&&a.nodeValue==""){return true}return false},_getNextNode:function(a,b){if(!a||a.tagName=="BODY"){return{elNextNode:null,bDisconnected:false}}if(a.nextSibling){a=a.nextSibling;while(a.firstChild){if(a.tagName&&!this.rxInlineContainer.test(a.tagName)){b=true}a=a.firstChild}return{elNextNode:a,bDisconnected:b}}return this._getNextNode(nhn.DOMFix.parentNode(a),b)},_getNextTextNode:function(a,b){var c,a;while(true){c=this._getNextNode(a,b);a=c.elNextNode;b=c.bDisconnected;if(a&&a.nodeType!=3&&!this.rxInlineContainer.test(a.tagName)){b=true}if(!a||(a.nodeType==3&&!this._isBlankTextNode(a))){break}}return{elNextText:a,bDisconnected:b}},_getFirstTextNode:function(){var b=this.document.body.firstChild;while(!!b&&b.firstChild){b=b.firstChild}if(!b){return null}if(b.nodeType!=3||this._isBlankTextNode(b)){var a=this._getNextTextNode(b,false);b=a.elNextText}return b},_addToTextMap:function(b,d,g,f){var e=d[f].length;for(var c=0,a=b.nodeValue.length;c=0;q--){var d=o.substring(q,q+a);if(u&&(q>0&&o.charAt(q-1).match(/[a-zA-Z가-힣]/))){continue}if(d==t){h++;var b=new nhn.HuskyRange(this.window);var p,m;if(q+a=0&&nhn.DOMFix.parentNode(l[m])==l[k]){m=this._recurConstructClonedTree(l,m,h)}j.insertBefore(h,j.firstChild);return m};this._recurConstructClonedTree=g;b[b.length]=nhn.DOMFix.parentNode(b[b.length-1]);this._recurConstructClonedTree(b,b.length-1,d);return{oStartContainer:a,oEndContainer:c}},cloneRange:function(){return this._copyRange(new nhn.W3CDOMRange(this._window))},_copyRange:function(a){a.collapsed=this.collapsed;a.commonAncestorContainer=this.commonAncestorContainer;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.startContainer=this.startContainer;a.startOffset=this.startOffset;a._document=this._document;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this._updateRangeInfo()},compareBoundaryPoints:function(a,b){switch(a){case nhn.W3CDOMRange.START_TO_START:return this._compareEndPoint(this.startContainer,this.startOffset,b.startContainer,b.startOffset);case nhn.W3CDOMRange.START_TO_END:return this._compareEndPoint(this.endContainer,this.endOffset,b.startContainer,b.startOffset);case nhn.W3CDOMRange.END_TO_END:return this._compareEndPoint(this.endContainer,this.endOffset,b.endContainer,b.endOffset);case nhn.W3CDOMRange.END_TO_START:return this._compareEndPoint(this.startContainer,this.startOffset,b.endContainer,b.endOffset)}},_findBody:function(a){if(!a){return null}while(a){if(a.tagName=="BODY"){return a}a=nhn.DOMFix.parentNode(a)}return null},_compareEndPoint:function(d,g,c,e){return this.oBrowserSelection.compareEndPoints(d,g,c,e);var l,j;if(!d||this._findBody(d)!=this._document.body){d=this._document.body;g=0}if(!c||this._findBody(c)!=this._document.body){c=this._document.body;e=0}var f=function(n,m){if(m==-1){m=n+1}if(nb.nodeValue.length){a=b.nodeValue.length}}else{if(a>nhn.DOMFix.childNodes(b).length){a=nhn.DOMFix.childNodes(b).length}}return a},setEnd:function(a,d,c,b){if(!c){d=this._endsNodeValidation(a,d)}this.endContainer=a;this.endOffset=d;if(!b){if(!this.startContainer||this._compareEndPoint(this.startContainer,this.startOffset,this.endContainer,this.endOffset)!=-1){this.collapse(false)}else{this._updateRangeInfo()}}},setEndAfter:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setEndAfter")}if(a.tagName=="BODY"){this.setEnd(a,nhn.DOMFix.childNodes(a).length,true,b);return}this.setEnd(nhn.DOMFix.parentNode(a),this._getPosIdx(a)+1,true,b)},setEndBefore:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setEndBefore")}if(a.tagName=="BODY"){this.setEnd(a,0,true,b);return}this.setEnd(nhn.DOMFix.parentNode(a),this._getPosIdx(a),true,b)},setStart:function(a,d,c,b){if(!c){d=this._endsNodeValidation(a,d)}this.startContainer=a;this.startOffset=d;if(!b){if(!this.endContainer||this._compareEndPoint(this.startContainer,this.startOffset,this.endContainer,this.endOffset)!=-1){this.collapse(true)}else{this._updateRangeInfo()}}},setStartAfter:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setStartAfter")}if(a.tagName=="BODY"){this.setStart(a,nhn.DOMFix.childNodes(a).length,true,b);return}this.setStart(nhn.DOMFix.parentNode(a),this._getPosIdx(a)+1,true,b)},setStartBefore:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setStartBefore")}if(a.tagName=="BODY"){this.setStart(a,0,true,b);return}this.setStart(nhn.DOMFix.parentNode(a),this._getPosIdx(a),true,b)},surroundContents:function(a){a.appendChild(this.extractContents());this.insertNode(a);this.selectNode(a)},toString:function(){var a=this._document.createElement("DIV");a.appendChild(this.cloneContents());return a.textContent||a.innerText||""},fixCommonAncestorContainer:function(){if(!jindo.$Agent().navigator().ie){return}this.commonAncestorContainer=this._getCommonAncestorContainer()},_isBlankTextNode:function(a){if(a.nodeType==3&&a.nodeValue==""){return true}return false},_isAllChildBlankText:function(a){for(var b=0,c=a.childNodes.length;b=c.nodeValue.length){return b}if(a===0){return b}c.splitText(a);return{oStartContainer:e,iStartOffset:d,oEndContainer:c,iEndOffset:a}},_getNodesInRange:function(){if(this.collapsed){return[]}var b=this._getActualStartNode(this.startContainer,this.startOffset);var a=this._getActualEndNode(this.endContainer,this.endOffset);return this._getNodesBetween(b,a)},_getActualStartNode:function(c,b){var a=c;if(c.nodeType==3){if(b>=c.nodeValue.length){a=this._getNextNode(c);if(a.tagName=="BODY"){a=null}}else{a=c}}else{if(b)$/i,setWindow:function(a){this.reset(a||window)},$init:function(a){this.HUSKY_BOOMARK_START_ID_PREFIX="husky_bookmark_start_";this.HUSKY_BOOMARK_END_ID_PREFIX="husky_bookmark_end_";this.sBlockElement="P|DIV|LI|H[1-6]|PRE";this.sBlockContainer="BODY|TABLE|TH|TR|TD|UL|OL|BLOCKQUOTE|FORM";this.rxBlockElement=new RegExp("^("+this.sBlockElement+")$");this.rxBlockContainer=new RegExp("^("+this.sBlockContainer+")$");this.rxLineBreaker=new RegExp("^("+this.sBlockElement+"|"+this.sBlockContainer+")$");this.setWindow(a)},select:function(){try{this.oBrowserSelection.selectRange(this)}catch(a){}},setFromSelection:function(a){this.setRange(this.oBrowserSelection.getRangeAt(a),true)},setRange:function(a,b){this.reset(this._window);this.setStart(a.startContainer,a.startOffset,b,true);this.setEnd(a.endContainer,a.endOffset,b)},setEndNodes:function(b,a){this.reset(this._window);this.setEndAfter(a,true);this.setStartBefore(b)},splitTextAtBothEnds:function(){this._splitTextEndNodesOfTheRange()},getStartNode:function(){if(this.collapsed){if(this.startContainer.nodeType==3){if(this.startOffset===0){return null}if(this.startContainer.nodeValue.length<=this.startOffset){return null}return this.startContainer}return null}if(this.startContainer.nodeType==3){if(this.startOffset>=this.startContainer.nodeValue.length){return this._getNextNode(this.startContainer)}return this.startContainer}else{if(this.startOffset>=nhn.DOMFix.childNodes(this.startContainer).length){return this._getNextNode(this.startContainer)}return nhn.DOMFix.childNodes(this.startContainer)[this.startOffset]}},getEndNode:function(){if(this.collapsed){return this.getStartNode()}if(this.endContainer.nodeType==3){if(this.endOffset===0){return this._getPrevNode(this.endContainer)}return this.endContainer}else{if(this.endOffset===0){return this._getPrevNode(this.endContainer)}return nhn.DOMFix.childNodes(this.endContainer)[this.endOffset-1]}},getNodeAroundRange:function(d,a){if(!this.collapsed){return this.getStartNode()}if(this.startContainer&&this.startContainer.nodeType==3){return this.startContainer}var e,c,b;if(this.startOffset>=nhn.DOMFix.childNodes(this.startContainer).length){c=this._getNextNode(this.startContainer)}else{c=nhn.DOMFix.childNodes(this.startContainer)[this.startOffset]}if(this.endOffset===0){e=this._getPrevNode(this.endContainer)}else{e=nhn.DOMFix.childNodes(this.endContainer)[this.endOffset-1]}if(d){b=e;if(!b&&!a){b=c}}else{b=c;if(!b&&!a){b=e}}return b},_getXPath:function(b){var a="";while(b&&b.nodeType==1){a="/"+b.tagName+"["+this._getPosIdx4XPath(b)+"]"+a;b=nhn.DOMFix.parentNode(b)}return a},_getPosIdx4XPath:function(b){var a=0;for(var c=b.previousSibling;c;c=c.previousSibling){if(c.tagName==b.tagName){a++}}return a},_evaluateXPath:function(l,j){l=l.substring(1,l.length-1);var f=l.split(/\//);var d=j.body;for(var e=2;e-1&&e){var g=nhn.DOMFix.childNodes(e);var d=null;var b=a;var f=c;while((d=g[b])&&d.nodeType==3&&d.nodeValue.length=0){return true}if(f){if(c==1){return false}if(d==-1){return false}return true}return false},isNodeInRange:function(d,c,b){var a=new nhn.HuskyRange(this._window);if(b&&d.firstChild){a.setStartBefore(d.firstChild);a.setEndAfter(d.lastChild)}else{a.selectNode(d)}return this.isRangeInRange(a,c)},pasteText:function(a){this.pasteHTML(a.replace(/&/g,"&").replace(//g,">").replace(/ /g," ").replace(/"/g,"""))},pasteHTML:function(c){var b=this._document.createElement("DIV");b.innerHTML=c;if(!b.firstChild){this.deleteContents();return}var e=b.firstChild;var d=b.lastChild;var f=this.cloneRange();var a=f.placeStringBookmark();this.collapseToStart();while(b.lastChild){this.insertNode(b.lastChild)}this.setEndNodes(e,d);f.moveToBookmark(a);f.deleteContents();f.removeStringBookmark(a)},toString:function(){this.toString=nhn.W3CDOMRange.prototype.toString;return this.toString()},toHTMLString:function(){var a=this._document.createElement("DIV");a.appendChild(this.cloneContents());return a.innerHTML},findAncestorByTagName:function(a){var b=this.commonAncestorContainer;while(b&&b.tagName!=a){b=nhn.DOMFix.parentNode(b)}return b},selectNodeContents:function(c){if(!c){return}var b=c.firstChild?c.firstChild:c;var a=c.lastChild?c.lastChild:c;this.reset(this._window);if(b.nodeType==3){this.setStart(b,0,true)}else{this.setStartBefore(b)}if(a.nodeType==3){this.setEnd(a,a.nodeValue.length,true)}else{this.setEndAfter(a)}},_hasTextDecoration:function(a,b){if(!a||!a.style){return false}if(a.style.textDecoration.indexOf(b)>-1){return true}if(b==="underline"&&a.tagName==="U"){return true}if(b==="line-through"&&(a.tagName==="S"||a.tagName==="STRIKE")){return true}return false},_setTextDecoration:function(a,b){if(jindo.$Agent().navigator().firefox){a.style.textDecoration=(a.style.textDecoration)?a.style.textDecoration+" "+b:b}else{if(b==="underline"){a.innerHTML=""+a.innerHTML+""}else{if(b==="line-through"){a.innerHTML=""+a.innerHTML+""}}}},_checkTextDecoration:function(e){if(e.tagName!=="SPAN"){return}var c=false,a=false,d="",b=null;oChildNode=e.firstChild;while(oChildNode){if(oChildNode.nodeType===1){c=(c||oChildNode.tagName==="U");a=(a||oChildNode.tagName==="S"||oChildNode.tagName==="STRIKE")}if(c&&a){return}oChildNode=oChildNode.nextSibling}b=nhn.DOMFix.parentNode(e);while(b&&b.tagName!=="BODY"){if(b.nodeType!==1){b=nhn.DOMFix.parentNode(b);continue}if(!c&&this._hasTextDecoration(b,"underline")){c=true;this._setTextDecoration(e,"underline")}if(!a&&this._hasTextDecoration(b,"line-through")){a=true;this._setTextDecoration(e,"line-through")}if(c&&a){return}b=nhn.DOMFix.parentNode(b)}},styleRange:function(k,f,b,a,e){var j=this.aStyleParents=this._getStyleParentNodes(b,a);if(j.length<1){return}var d,h;for(var c=0;c1){return null}}if(e.nodeName==="SPAN"){return e}else{return this._findParentSingleSpan(e.parentNode)}},_isFullyContained:function(d,c,f){var a,e;var b=this._getVeryFirstRealChild(d);if(f&&b==f){a=1}else{a=c.indexOf(b)}if(a!=-1){b=this._getVeryLastRealChild(d);if(f&&b==f){e=1}else{e=c.indexOf(b)}}return(a!=-1&&e!=-1)},_getVeryFirstChild:function(a){if(a.firstChild){return this._getVeryFirstChild(a.firstChild)}return a},_getVeryLastChild:function(a){if(a.lastChild){return this._getVeryLastChild(a.lastChild)}return a},_getFirstRealChild:function(b){var a=b.firstChild;while(a&&a.nodeType==3&&a.nodeValue==""){a=a.nextSibling}return a},_getLastRealChild:function(b){var a=b.lastChild;while(a&&a.nodeType==3&&a.nodeValue==""){a=a.previousSibling}return a},_getVeryFirstRealChild:function(b){var a=this._getFirstRealChild(b);if(a){return this._getVeryFirstRealChild(a)}return b},_getVeryLastRealChild:function(b){var a=this._getLastRealChild(b);if(a){return this._getVeryLastChild(a)}return b},_getLineStartInfo:function(f){var h=null;var a=f;var g=f;var e=false;var d=this.rxLineBreaker;function b(j){if(!j){return}if(h){return}if(d.test(j.tagName)){g=j;h=a;e=true;return}else{a=j}c(j.previousSibling);if(h){return}b(nhn.DOMFix.parentNode(j))}function c(k){if(!k){return}if(h){return}if(d.test(k.tagName)){g=k;h=a;e=false;return}if(k.firstChild&&k.tagName!="TABLE"){var j=k.lastChild;while(j&&!h){c(j);j=j.previousSibling}}else{a=k}if(!h){c(k.previousSibling)}}if(d.test(f.tagName)){h=f}else{b(f)}return{oNode:h,oLineBreaker:g,bParentBreak:e}},_getLineEndInfo:function(f){var b=null;var a=f;var g=f;var e=false;var d=this.rxLineBreaker;function h(j){if(!j){return}if(b){return}if(d.test(j.tagName)){g=j;b=a;e=true;return}else{a=j}c(j.nextSibling);if(b){return}h(nhn.DOMFix.parentNode(j))}function c(k){if(!k){return}if(b){return}if(d.test(k.tagName)){g=k;b=a;e=false;return}if(k.firstChild&&k.tagName!="TABLE"){var j=k.firstChild;while(j&&!b){c(j);j=j.nextSibling}}else{a=k}if(!b){c(k.nextSibling)}}if(d.test(f.tagName)){b=f}else{h(f)}return{oNode:b,oLineBreaker:g,bParentBreak:e}},getLineInfo:function(h){var h=h||false;var b=this.getStartNode();var e=this.getEndNode();if(!b){b=this.getNodeAroundRange(!h,true)}if(!e){e=this.getNodeAroundRange(!h,true)}var j=this._getLineStartInfo(b);var f=j.oNode;var c=this._getLineEndInfo(e);var a=c.oNode;if(b!=f||e!=a){var g=this._compareEndPoint(nhn.DOMFix.parentNode(f),this._getPosIdx(f),this.endContainer,this.endOffset);var d=this._compareEndPoint(nhn.DOMFix.parentNode(a),this._getPosIdx(a)+1,this.startContainer,this.startOffset);if(!(g<=0&&d>=0)){b=this.getNodeAroundRange(false,true);e=this.getNodeAroundRange(false,true);j=this._getLineStartInfo(b);c=this._getLineEndInfo(e)}}return{oStart:j,oEnd:c}},_findSingleChild:function(f){if(!f){return null}var b=null;for(var c=0,a=0,g,d,e=f.childNodes;(d=e[c]);c++){g=d.nodeValue;if(this._rxCursorHolder.test(g)){continue}else{b=d;a++}if(a>1){return null}}return b},_hasCursorHolderOnly:function(a){if(!a||a.nodeType!==1){return false}if(this._rxCursorHolder.test(a.innerHTML)){return true}else{return this._hasCursorHolderOnly(this._findSingleChild(a))}}}).extend(nhn.W3CDOMRange);nhn.BrowserSelection=function(a){this.init=function(b){this._window=b||window;this._document=this._window.document};this.init(a);if(!!this._document.createRange){nhn.BrowserSelectionImpl_FF.apply(this)}else{nhn.BrowserSelectionImpl_IE.apply(this)}this.selectRange=function(b){this.selectNone();this.addRange(b)};this.selectionLoaded=true;if(!this._oSelection){this.selectionLoaded=false}};nhn.BrowserSelectionImpl_FF=function(){this._oSelection=this._window.getSelection();this.getRangeAt=function(a){a=a||0;try{var b=this._oSelection.getRangeAt(a)}catch(c){return new nhn.W3CDOMRange(this._window)}return this._FFRange2W3CRange(b)};this.addRange=function(a){var b=this._W3CRange2FFRange(a);this._oSelection.addRange(b)};this.selectNone=function(){this._oSelection.removeAllRanges()};this.getCommonAncestorContainer=function(a){var b=this._W3CRange2FFRange(a);return b.commonAncestorContainer};this.isCollapsed=function(a){var b=this._W3CRange2FFRange(a);return b.collapsed};this.compareEndPoints=function(g,d,c,a){var f=this._document.createRange();var b=this._document.createRange();f.setStart(g,d);b.setStart(c,a);f.collapse(true);b.collapse(true);try{return f.compareBoundaryPoints(1,b)}catch(h){return 1}};this._FFRange2W3CRange=function(b){var a=new nhn.W3CDOMRange(this._window);a.setStart(b.startContainer,b.startOffset,true);a.setEnd(b.endContainer,b.endOffset,true);return a};this._W3CRange2FFRange=function(a){var b=this._document.createRange();b.setStart(a.startContainer,a.startOffset);b.setEnd(a.endContainer,a.endOffset);return b}};nhn.BrowserSelectionImpl_IE=function(){this._oSelection=this._document.selection;this.oLastRange={oBrowserRange:null,elStartContainer:null,nStartOffset:-1,elEndContainer:null,nEndOffset:-1};this._updateLastRange=function(b,a){this.oLastRange.oBrowserRange=b;this.oLastRange.elStartContainer=a.startContainer;this.oLastRange.nStartOffset=a.startOffset;this.oLastRange.elEndContainer=a.endContainer;this.oLastRange.nEndOffset=a.endOffset};this.getRangeAt=function(b){b=b||0;var a,c;if(this._oSelection.type=="Control"){a=new nhn.W3CDOMRange(this._window);var d=this._oSelection.createRange().item(b);if(!d||d.ownerDocument!=this._document){return a}a.selectNode(d);return a}else{c=this._oSelection.createRange();var d=c.parentElement();if(!d||d.ownerDocument!=this._document){a=new nhn.W3CDOMRange(this._window);return a}a=this._IERange2W3CRange(c);return a}};this.addRange=function(a){var b=this._W3CRange2IERange(a);b.select()};this.selectNone=function(){this._oSelection.empty()};this.getCommonAncestorContainer=function(a){return this._W3CRange2IERange(a).parentElement()};this.isCollapsed=function(a){var c=this._W3CRange2IERange(a);var b=c.duplicate();b.collapse();return c.isEqual(b)};this.compareEndPoints=function(d,c,b,a){var f,e;if(d===this.oLastRange.elStartContainer&&c===this.oLastRange.nStartOffset){f=this.oLastRange.oBrowserRange.duplicate();f.collapse(true)}else{if(d===this.oLastRange.elEndContainer&&c===this.oLastRange.nEndOffset){f=this.oLastRange.oBrowserRange.duplicate();f.collapse(false)}else{f=this._getIERangeAt(d,c)}}if(b===this.oLastRange.elStartContainer&&a===this.oLastRange.nStartOffset){e=this.oLastRange.oBrowserRange.duplicate();e.collapse(true)}else{if(b===this.oLastRange.elEndContainer&&a===this.oLastRange.nEndOffset){e=this.oLastRange.oBrowserRange.duplicate();e.collapse(false)}else{e=this._getIERangeAt(b,a)}}return f.compareEndPoints("StartToStart",e)};this._W3CRange2IERange=function(a){if(this.oLastRange.elStartContainer===a.startContainer&&this.oLastRange.nStartOffset===a.startOffset&&this.oLastRange.elEndContainer===a.endContainer&&this.oLastRange.nEndOffset===a.endOffset){return this.oLastRange.oBrowserRange}var b=this._getIERangeAt(a.startContainer,a.startOffset);var c=this._getIERangeAt(a.endContainer,a.endOffset);b.setEndPoint("EndToEnd",c);this._updateLastRange(b,a);return b};this._getIERangeAt=function(f,d){var c=this._document.body.createTextRange();var b=this._getSelectableNodeAndOffsetForIE(f,d);var e=b.oSelectableNodeForIE;var a=b.iOffsetForIE;c.moveToElementText(e);c.collapse(b.bCollapseToStart);c.moveStart("character",a);return c};this._getSelectableNodeAndOffsetForIE=function(e,g){var a=null;var d=null;var b=0;if(e.nodeType==3){a=nhn.DOMFix.parentNode(e);d=nhn.DOMFix.childNodes(a);b=d.length}else{a=e;d=nhn.DOMFix.childNodes(a);b=(g=0){break}g=k[j]}var n=j;if(n!==0&&k[n-1].nodeType==3){var a=this._document.body.createTextRange();var d=null;if(g){a.moveToElementText(g);a.collapse(false);d=g.nextSibling}else{a.moveToElementText(o);a.collapse(true);d=o.firstChild}var m=p.duplicate();m.setEndPoint("StartToStart",a);var b=m.text.replace(/[\r\n]/g,"").length;while(b>d.nodeValue.length&&d.nextSibling){b-=d.nodeValue.length;d=d.nextSibling}var l=d.nodeValue;if(f&&d.nextSibling&&d.nextSibling.nodeType==3&&b==d.nodeValue.length){b-=d.nodeValue.length;d=d.nextSibling}o=d;h=b}else{o=p.parentElement();h=n}return{oContainer:o,iOffset:h}}};nhn.DOMFix=new (jindo.$Class({$init:function(){if(jindo.$Agent().navigator().ie||jindo.$Agent().navigator().opera){this.childNodes=this._childNodes_Fix;this.parentNode=this._parentNode_Fix}else{this.childNodes=this._childNodes_Native;this.parentNode=this._parentNode_Native}},_parentNode_Native:function(a){return a.parentNode},_parentNode_Fix:function(a){if(!a){return a}while(a.previousSibling){a=a.previousSibling}return a.parentNode},_childNodes_Native:function(a){return a.childNodes},_childNodes_Fix:function(a){var c=null;var b=0;if(a){var c=[];a=a.firstChild;while(a){c[b++]=a;a=a.nextSibling}}return c}}))();nhn.husky.CorePlugin=jindo.$Class({name:"CorePlugin",htLazyLoadRequest_plugins:{},htLazyLoadRequest_allFiles:{},htHTMLLoaded:{},$AFTER_MSG_APP_READY:function(){this.oApp.exec("EXEC_ON_READY_FUNCTION",[])},$ON_ADD_APP_PROPERTY:function(a,b){this.oApp[a]=b},$ON_REGISTER_BROWSER_EVENT:function(d,e,b,c,a){this.oApp.registerBrowserEvent(d,e,b,c,a)},$ON_DISABLE_MESSAGE:function(a){this.oApp.disableMessage(a,true)},$ON_ENABLE_MESSAGE:function(a){this.oApp.disableMessage(a,false)},$ON_LOAD_FULL_PLUGIN:function(f,b,e,c,d){var g=c.$this||c;var a=f[0];if(!this.htLazyLoadRequest_plugins[a]){this.htLazyLoadRequest_plugins[a]={nStatus:1,sContents:""}}if(this.htLazyLoadRequest_plugins[a].nStatus===2){this.oApp.exec("MSG_FULL_PLUGIN_LOADED",[a,b,e,c,d,false])}else{this._loadFullPlugin(f,b,e,c,d,0)}},_loadFullPlugin:function(f,a,e,c,d,b){jindo.LazyLoading.load(nhn.husky.SE2M_Configuration.LazyLoad.sJsBaseURI+"/"+f[b],jindo.$Fn(function(o,h,n,l,m,k){var j=o[k];var g=o[0];if(k==o.length-1){this.htLazyLoadRequest_plugins[g].nStatus=2;this.oApp.exec("MSG_FULL_PLUGIN_LOADED",[o,h,n,l,m]);return}this._loadFullPlugin(o,h,n,l,m,k+1)},this).bind(f,a,e,c,d,b),"utf-8")},$ON_MSG_FULL_PLUGIN_LOADED:function(aFilenames,sClassName,sMsgName,oThisRef,oArguments,oRes){var oPluginRef=oThisRef.$this||oThisRef;var sFilename=aFilenames;for(var i=0,nLen=oThisRef._huskyFLT.length;ili>button")}},$LOCAL_BEFORE_FIRST:function(a){var c=jindo.$$(">ul>li[class*="+this.sUIClassPrefix+"]>button",this.elTextTool);var b=c.length;this.elFirstToolbarItem=this.elFirstToolbarItem||c[0];this.elLastToolbarItem=c[b-1];this.oApp.registerBrowserEvent(this.toolbarArea,"keydown","NAVIGATE_TOOLBAR",[])},$init:function(a){this.htUIList={};this.htWrappedUIList={};this.aUICmdMap={};this._assignHTMLElements(a);this._setRoundedCornerButton()},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.toolbarArea,"mouseover","EVENT_TOOLBAR_MOUSEOVER",[]);this.oApp.registerBrowserEvent(this.toolbarArea,"mouseout","EVENT_TOOLBAR_MOUSEOUT",[]);this.oApp.registerBrowserEvent(this.toolbarArea,"mousedown","EVENT_TOOLBAR_MOUSEDOWN",[]);this.oApp.exec("ADD_APP_PROPERTY",["getToolbarButtonByUIName",jindo.$Fn(this.getToolbarButtonByUIName,this).bind()]);var a=jindo.$$.getSingle(".se2_tool");this.oApp.exec("REGISTER_HOTKEY",["esc","FOCUS_EDITING_AREA",[],a])},$ON_NAVIGATE_TOOLBAR:function(b){var a=9;if((b.element==this.elLastToolbarItem)&&(b.key().keyCode==a)){if(b.key().shift){}else{this.elFirstToolbarItem.focus();b.stopDefault()}}if(b.element==this.elFirstToolbarItem&&(b.key().keyCode==a)){if(b.key().shift){b.stopDefault();this.elLastToolbarItem.focus()}}},$ON_FOCUS_EDITING_AREA:function(){this.oApp.exec("FOCUS")},$ON_TOGGLE_TOOLBAR_ACTIVE_LAYER:function(b,d,e,a,f,c){this.oApp.exec("TOGGLE_ACTIVE_LAYER",[b,"MSG_TOOLBAR_LAYER_SHOWN",[b,d,e,a],f,c])},$ON_MSG_TOOLBAR_LAYER_SHOWN:function(c,d,b,a){this.oApp.exec("POSITION_TOOLBAR_LAYER",[c,d]);if(b){this.oApp.exec(b,a)}},$ON_SHOW_TOOLBAR_ACTIVE_LAYER:function(a,d,c,b){this.oApp.exec("SHOW_ACTIVE_LAYER",[a,d,c]);this.oApp.exec("POSITION_TOOLBAR_LAYER",[a,b])},$ON_ENABLE_UI:function(a){this._enableUI(a)},$ON_DISABLE_UI:function(a){this._disableUI(a)},$ON_SELECT_UI:function(a){var b=this.htWrappedUIList[a];if(!b){return}b.removeClass("hover");b.addClass("active")},$ON_DESELECT_UI:function(a){var b=this.htWrappedUIList[a];if(!b){return}b.removeClass("active")},$ON_TOGGLE_UI_SELECTED:function(a){var b=this.htWrappedUIList[a];if(!b){return}if(b.hasClass("active")){b.removeClass("active")}else{b.removeClass("hover");b.addClass("active")}},$ON_ENABLE_ALL_UI:function(b){if(this.nUIStatus===1){return}var c,a;b=b||{};var d=jindo.$A(b.aExceptions||[]);for(c in this.htUIList){if(c&&!d.has(c)){this._enableUI(c)}}this.nUIStatus=1},$ON_DISABLE_ALL_UI:function(b){if(this.nUIStatus===2){return}var c;b=b||{};var d=jindo.$A(b.aExceptions||[]);var a=b.bLeaveActiveLayer||false;if(!a){this.oApp.exec("HIDE_ACTIVE_LAYER",[])}for(c in this.htUIList){if(c&&!d.has(c)){this._disableUI(c)}}this.nUIStatus=2},$ON_MSG_STYLE_CHANGED:function(b,a){if(a==="@^"){this.oApp.exec("SELECT_UI",[b])}else{this.oApp.exec("DESELECT_UI",[b])}},$ON_POSITION_TOOLBAR_LAYER:function(f,j){var b,k,e,a;f=jindo.$(f);j=j||{};var d=jindo.$(j.elBtn);var g=j.sAlign;var c=-1;if(!f){return}if(d&&d.tagName&&d.tagName=="BUTTON"){d.parentNode.appendChild(f)}var h=jindo.$Element(f);if(g!="right"){f.style.left="0";b=h.offset().left;k=b+f.offsetWidth;e=this.welToolbarArea.offset().left;a=e+this.toolbarArea.offsetWidth;if(k>a){h.css("left",(a-k-c)+"px")}if(ba){h.css("right",-1*(a-k-c)+"px")}if(b2||a.parentNode.className.match(/se2_pair/))){return}a=a.parentNode}this.oApp.exec("HIDE_ACTIVE_LAYER_IF_NOT_CHILD",[b.element])},_enableUI:function(d){var b,c;this.nUIStatus=0;var e=this.htWrappedUIList[d];var g=this.htUIList[d];if(!e){return}e.removeClass("off");var a=g.getElementsByTagName("BUTTON");for(b=0,c=a.length;bul>li[class*="+this.sUIClassPrefix+"]:only-child",this.elTextTool);for(e=0,g=f.length;espan._buttonRound",d)).addClass("tool_bg")}b=jindo.$$("ul>li[class*="+this.sUIClassPrefix+"]:first-child",this.elTextTool);for(e=0,g=b.length;espan._buttonRound",d)).addClass("tool_bg")}h=jindo.$$("ul>li[class*="+this.sUIClassPrefix+"]:last-child",this.elTextTool);for(e=0,g=h.length;espan._buttonRound",d)).addClass("tool_bg")}},$ON_REGISTER_UI_EVENT:function(c,d,e,b){if(!this.htUIList[c]){return}var a;if(!this.aUICmdMap[c]){this.aUICmdMap[c]=[]}this.aUICmdMap[c][this.aUICmdMap[c].length]=e;a=jindo.$$.getSingle("button",this.htUIList[c]);if(!a){return}this.oApp.registerBrowserEvent(a,d,e,b)},getToolbarButtonByUIName:function(a){return jindo.$$.getSingle("BUTTON",this.htUIList[a])}});nhn.husky.SE2M_EditingModeChanger=jindo.$Class({name:"SE2M_EditingModeChanger",htConversionMode:null,$init:function(b,a){this.htConversionMode=a;this._assignHTMLElements(b)},_assignHTMLElements:function(a){a=jindo.$(a)||document;this.elWYSIWYGButton=jindo.$$.getSingle("BUTTON.se2_to_editor",a);this.elHTMLSrcButton=jindo.$$.getSingle("BUTTON.se2_to_html",a);this.elTEXTButton=jindo.$$.getSingle("BUTTON.se2_to_text",a);this.elModeToolbar=jindo.$$.getSingle("DIV.se2_conversion_mode",a);this.welWYSIWYGButtonLi=jindo.$Element(this.elWYSIWYGButton.parentNode);this.welHTMLSrcButtonLi=jindo.$Element(this.elHTMLSrcButton.parentNode);this.welTEXTButtonLi=jindo.$Element(this.elTEXTButton.parentNode)},$BEFORE_MSG_APP_READY:function(){this.oApp.exec("ADD_APP_PROPERTY",["isUseModeChanger",jindo.$Fn(this.isUseModeChanger,this).bind()])},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.elWYSIWYGButton,"click","EVENT_CHANGE_EDITING_MODE_CLICKED",["WYSIWYG"]);this.oApp.registerBrowserEvent(this.elHTMLSrcButton,"click","EVENT_CHANGE_EDITING_MODE_CLICKED",["HTMLSrc"]);this.oApp.registerBrowserEvent(this.elTEXTButton,"click","EVENT_CHANGE_EDITING_MODE_CLICKED",["TEXT",false]);this.showModeChanger();if(this.isUseModeChanger()===false&&this.oApp.isUseVerticalResizer()===false){this.elModeToolbar.style.display="none"}},showModeChanger:function(){if(this.isUseModeChanger()){this.elWYSIWYGButton.style.display="block";this.elHTMLSrcButton.style.display="block";this.elTEXTButton.style.display="block"}else{this.elWYSIWYGButton.style.display="none";this.elHTMLSrcButton.style.display="none";this.elTEXTButton.style.display="none"}},isUseModeChanger:function(){return(typeof(this.htConversionMode)==="undefined"||typeof(this.htConversionMode.bUseModeChanger)==="undefined"||this.htConversionMode.bUseModeChanger===true)?true:false},$ON_EVENT_CHANGE_EDITING_MODE_CLICKED:function(b,a){if(b=="TEXT"){var c=this.oApp.getIR();if(c.length>0&&!a){if(!confirm(this.oApp.$MSG("SE2M_EditingModeChanger.confirmTextMode"))){return false}}this.oApp.exec("CHANGE_EDITING_MODE",[b])}else{this.oApp.exec("CHANGE_EDITING_MODE",[b])}if("HTMLSrc"==b){this.oApp.exec("MSG_NOTIFY_CLICKCR",["htmlmode"])}else{if("TEXT"==b){this.oApp.exec("MSG_NOTIFY_CLICKCR",["textmode"])}else{this.oApp.exec("MSG_NOTIFY_CLICKCR",["editormode"])}}},$ON_DISABLE_ALL_UI:function(a){a=a||{};var b=jindo.$A(a.aExceptions||[]);if(b.has("mode_switcher")){return}if(this.oApp.getEditingMode()=="WYSIWYG"){this.welWYSIWYGButtonLi.removeClass("active");this.elHTMLSrcButton.disabled=true;this.elTEXTButton.disabled=true}else{if(this.oApp.getEditingMode()=="TEXT"){this.welTEXTButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=true;this.elHTMLSrcButton.disabled=true}else{this.welHTMLSrcButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=true;this.elTEXTButton.disabled=true}}},$ON_ENABLE_ALL_UI:function(){if(this.oApp.getEditingMode()=="WYSIWYG"){this.welWYSIWYGButtonLi.addClass("active");this.elHTMLSrcButton.disabled=false;this.elTEXTButton.disabled=false}else{if(this.oApp.getEditingMode()=="TEXT"){this.welTEXTButtonLi.addClass("active");this.elWYSIWYGButton.disabled=false;this.elHTMLSrcButton.disabled=false}else{this.welHTMLSrcButtonLi.addClass("active");this.elWYSIWYGButton.disabled=false;this.elTEXTButton.disabled=false}}},$ON_CHANGE_EDITING_MODE:function(a){if(a=="HTMLSrc"){this.welWYSIWYGButtonLi.removeClass("active");this.welHTMLSrcButtonLi.addClass("active");this.welTEXTButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=false;this.elHTMLSrcButton.disabled=true;this.elTEXTButton.disabled=false;this.oApp.exec("HIDE_ALL_DIALOG_LAYER");this.oApp.exec("DISABLE_ALL_UI",[{aExceptions:["mode_switcher"]}])}else{if(a=="TEXT"){this.welWYSIWYGButtonLi.removeClass("active");this.welHTMLSrcButtonLi.removeClass("active");this.welTEXTButtonLi.addClass("active");this.elWYSIWYGButton.disabled=false;this.elHTMLSrcButton.disabled=false;this.elTEXTButton.disabled=true;this.oApp.exec("HIDE_ALL_DIALOG_LAYER");this.oApp.exec("DISABLE_ALL_UI",[{aExceptions:["mode_switcher"]}])}else{this.welWYSIWYGButtonLi.addClass("active");this.welHTMLSrcButtonLi.removeClass("active");this.welTEXTButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=true;this.elHTMLSrcButton.disabled=false;this.elTEXTButton.disabled=false;this.oApp.exec("RESET_STYLE_STATUS");this.oApp.exec("ENABLE_ALL_UI",[])}}}});nhn.husky.SE_EditingAreaManager=jindo.$Class({name:"SE_EditingAreaManager",oActivePlugin:null,elContentsField:null,bIsDirty:false,bAutoResize:false,$init:function(g,f,a,e,d){this.sDefaultEditingMode=g;this.elContentsField=jindo.$(f);this._assignHTMLElements(d);this.fOnBeforeUnload=e;this.oEditingMode={};this.elContentsField.style.display="none";this.nMinWidth=parseInt((a.nMinWidth||60),10);this.nMinHeight=parseInt((a.nMinHeight||60),10);var b=this._getSize([a.nWidth,a.width,this.elEditingAreaContainer.offsetWidth],this.nMinWidth);var c=this._getSize([a.nHeight,a.height,this.elEditingAreaContainer.offsetHeight],this.nMinHeight);this.elEditingAreaContainer.style.width=b.nSize+b.sUnit;this.elEditingAreaContainer.style.height=c.nSize+c.sUnit;if(b.sUnit==="px"){d.style.width=(b.nSize+2)+"px"}else{if(b.sUnit==="%"){d.style.minWidth=this.nMinWidth+"px"}}},_getSize:function(c,b){var e,g,h,d,a,f="px";b=parseInt(b,10);for(e=0,g=c.length;eli.active",this.toolbarArea,{oneTimeOffCache:true});if(b){var a=b.parentNode}if(a&&(a.className=="se2_itool2"||a.className=="se2_itool4")){this._isLayerReasonablyShown=true}this._fitElementInEditingArea(this.elEditingAreaContainer);this.oApp.exec("STOP_AUTORESIZE_EDITING_AREA");this.oApp.exec("SHOW_EDITING_AREA_COVER");this.elEditingAreaContainer.style.overflow="hidden";this.iStartingHeight=parseInt(this.elEditingAreaContainer.style.height,10)},$ON_STOP_AUTORESIZE_EDITING_AREA:function(){if(!this.bAutoResize){return}this.stopAutoResize();this.bAutoResize=false},startAutoResize:function(){if(!this.bAutoResize||!this.oActivePlugin||typeof this.oActivePlugin.startAutoResize!="function"){return}this.oActivePlugin.startAutoResize()},stopAutoResize:function(){if(!this.bAutoResize||!this.oActivePlugin||typeof this.oActivePlugin.stopAutoResize!="function"){return}this.oActivePlugin.stopAutoResize()},$ON_RESIZE_EDITING_AREA:function(b,a){if(b!==null&&typeof b!=="undefined"){this._resizeWidth(b,"px")}if(a!==null&&typeof a!=="undefined"){this._resizeHeight(a,"px")}this._fitElementInEditingArea(this.elResizingBoard);this._setEditingAreaDimension()},_resizeWidth:function(c,a){var b=parseInt(c,10);if(bthis.oApp.elEditingAreaContainer.offsetHeight){if(typeof a=="number"){b.style.top=c-b.offsetHeight-a+"px"}else{b.style.top=this.oApp.elEditingAreaContainer.offsetHeight-b.offsetHeight+"px"}}var d=parseInt(b.style.left,10);if(d+b.offsetWidth>this.oApp.elEditingAreaContainer.offsetWidth){b.style.left=this.oApp.elEditingAreaContainer.offsetWidth-b.offsetWidth+"px"}},$ON_EVENT_EDITING_AREA_KEYDOWN:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[])},$ON_EVENT_EDITING_AREA_MOUSEDOWN:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[])},$ON_EVENT_EDITING_AREA_SCROLL:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[])},_setEditingAreaDimension:function(a){a=a||this.oActivePlugin;this._fitElementInEditingArea(a.elEditingArea)},_fitElementInEditingArea:function(a){a.style.height=this.elEditingAreaContainer.offsetHeight+"px"},attachDocumentEvents:function(a){this.oApp.registerBrowserEvent(a,"click","EVENT_EDITING_AREA_CLICK");this.oApp.registerBrowserEvent(a,"dblclick","EVENT_EDITING_AREA_DBLCLICK");this.oApp.registerBrowserEvent(a,"mousedown","EVENT_EDITING_AREA_MOUSEDOWN");this.oApp.registerBrowserEvent(a,"mousemove","EVENT_EDITING_AREA_MOUSEMOVE");this.oApp.registerBrowserEvent(a,"mouseup","EVENT_EDITING_AREA_MOUSEUP");this.oApp.registerBrowserEvent(a,"mouseout","EVENT_EDITING_AREA_MOUSEOUT");this.oApp.registerBrowserEvent(a,"mousewheel","EVENT_EDITING_AREA_MOUSEWHEEL");this.oApp.registerBrowserEvent(a,"keydown","EVENT_EDITING_AREA_KEYDOWN");this.oApp.registerBrowserEvent(a,"keypress","EVENT_EDITING_AREA_KEYPRESS");this.oApp.registerBrowserEvent(a,"keyup","EVENT_EDITING_AREA_KEYUP");this.oApp.registerBrowserEvent(a,"scroll","EVENT_EDITING_AREA_SCROLL")},createCoverDiv:function(){this.elResizingBoard=document.createElement("DIV");this.elEditingAreaContainer.insertBefore(this.elResizingBoard,this.elEditingAreaContainer.firstChild);this.elResizingBoard.style.position="absolute";this.elResizingBoard.style.background="#000000";this.elResizingBoard.style.zIndex=100;this.elResizingBoard.style.border=1;this.elResizingBoard.style.opacity=0;this.elResizingBoard.style.filter="alpha(opacity=0.0)";this.elResizingBoard.style.MozOpacity=0;this.elResizingBoard.style["-moz-opacity"]=0;this.elResizingBoard.style["-khtml-opacity"]=0;this._fitElementInEditingArea(this.elResizingBoard);this.elResizingBoard.style.width=this.elEditingAreaContainer.offsetWidth+"px";this.elResizingBoard.style.display="none"},$ON_GET_COVER_DIV:function(a,b){if(!!this.elResizingBoard){b[a]=this.elResizingBoard}},getIR:function(){if(!this.oActivePlugin){return""}return this.oActivePlugin.getIR()},setIR:function(b,a){this.oApp.exec("SET_IR",[b,a])},getRawContents:function(){if(!this.oActivePlugin){return""}return this.oActivePlugin.getRawContents()},getContents:function(){var b=this.oApp.getIR();var a;if(this.oApp.applyConverter){a=this.oApp.applyConverter("IR_TO_DB",b,this.oApp.getWYSIWYGDocument())}else{a=b}a=this._cleanContents(a);return a},_cleanContents:function(a){return a.replace(new RegExp("(]*>)"+unescape("%uFEFF")+"","ig"),"$1")},setContents:function(a,b){var c;if(this.oApp.applyConverter){c=this.oApp.applyConverter("DB_TO_IR",a,this.oApp.getWYSIWYGDocument())}else{c=a}this.oApp.exec("SET_IR",[c,b])},getEditingMode:function(){return this.oActivePlugin.sMode},getEditingAreaWidth:function(){return this.elEditingAreaContainer.offsetWidth},getEditingAreaHeight:function(){return this.elEditingAreaContainer.offsetHeight}});nhn.husky.SE_EditingAreaVerticalResizer=jindo.$Class({name:"SE_EditingAreaVerticalResizer",oResizeGrip:null,sCookieNotice:"bHideResizeNotice",nEditingAreaMinHeight:null,htConversionMode:null,$init:function(b,a){this.htConversionMode=a;this._assignHTMLElements(b)},$BEFORE_MSG_APP_READY:function(){this.oApp.exec("ADD_APP_PROPERTY",["isUseVerticalResizer",jindo.$Fn(this.isUseVerticalResizer,this).bind()])},$ON_MSG_APP_READY:function(){if(jindo.$Agent().navigator().msafari){jindo.$Element(this.oResizeGrip).first().text("입력창 높이 자동 조정 바");this.oResizeGrip.disabled=true;return}this.$FnMouseDown=jindo.$Fn(this._mousedown,this);this.$FnMouseMove=jindo.$Fn(this._mousemove,this);this.$FnMouseUp=jindo.$Fn(this._mouseup,this);this.$FnMouseOver=jindo.$Fn(this._mouseover,this);this.$FnMouseOut=jindo.$Fn(this._mouseout,this);this.$FnMouseDown.attach(this.oResizeGrip,"mousedown");this.$FnMouseOver.attach(this.oResizeGrip,"mouseover");this.$FnMouseOut.attach(this.oResizeGrip,"mouseout");this.oApp.exec("REGISTER_HOTKEY",["shift+esc","FOCUS_RESIZER"]);this.oApp.exec("ADD_APP_PROPERTY",["checkResizeGripPosition",jindo.$Fn(this.checkResizeGripPosition,this).bind()]);if(!!this.welNoticeLayer&&!Number(jindo.$Cookie().get(this.sCookieNotice))){this.welNoticeLayer.delegate("click","BUTTON.bt_clse",jindo.$Fn(this._closeNotice,this).bind());this.welNoticeLayer.show()}if(!!this.oApp.getEditingAreaHeight){this.nEditingAreaMinHeight=this.oApp.getEditingAreaHeight()}this.showVerticalResizer();if(this.isUseVerticalResizer()===false&&this.oApp.isUseModeChanger()===false){this.elModeToolbar.style.display="none"}},showVerticalResizer:function(){if(this.isUseVerticalResizer()){this.oResizeGrip.style.display="block"}else{this.oResizeGrip.style.display="none"}},isUseVerticalResizer:function(){return(typeof(this.htConversionMode)==="undefined"||typeof(this.htConversionMode.bUseVerticalResizer)==="undefined"||this.htConversionMode.bUseVerticalResizer===true)?true:false},checkResizeGripPosition:function(b){var a=jindo.$Document();var c=(jindo.$Element(this.oResizeGrip).offset().top-a.scrollPosition().top+25)-a.clientSize().height;if(c<=0){return}if(b){if(this.nEditingAreaMinHeight>this.oApp.getEditingAreaHeight()-c){c=(-1)*(this.nEditingAreaMinHeight-this.oApp.getEditingAreaHeight())}this.oApp.exec("MSG_EDITING_AREA_RESIZE_STARTED");this.oApp.exec("RESIZE_EDITING_AREA_BY",[0,(-1)*c]);this.oApp.exec("MSG_EDITING_AREA_RESIZE_ENDED")}this.oApp.exec("STOP_AUTORESIZE_EDITING_AREA")},$ON_FOCUS_RESIZER:function(){this.oApp.exec("IE_HIDE_CURSOR");this.oResizeGrip.focus()},_assignHTMLElements:function(b,a){this.oResizeGrip=jindo.$$.getSingle("BUTTON.husky_seditor_editingArea_verticalResizer",b);this.elModeToolbar=jindo.$$.getSingle("DIV.se2_conversion_mode",b);this.welNoticeLayer=jindo.$Element(jindo.$$.getSingle("DIV.husky_seditor_resize_notice",b));this.welConversionMode=jindo.$Element(this.oResizeGrip.parentNode)},_mouseover:function(a){a.stopBubble();this.welConversionMode.addClass("controller_on")},_mouseout:function(a){a.stopBubble();this.welConversionMode.removeClass("controller_on")},_mousedown:function(a){this.iStartHeight=a.pos().clientY;this.iStartHeightOffset=a.pos().layerY;this.$FnMouseMove.attach(document,"mousemove");this.$FnMouseUp.attach(document,"mouseup");this.iStartHeight=a.pos().clientY;this.oApp.exec("HIDE_ACTIVE_LAYER");this.oApp.exec("HIDE_ALL_DIALOG_LAYER");this.oApp.exec("MSG_EDITING_AREA_RESIZE_STARTED",[this.$FnMouseDown,this.$FnMouseMove,this.$FnMouseUp])},_mousemove:function(b){var a=b.pos().clientY-this.iStartHeight;this.oApp.exec("RESIZE_EDITING_AREA_BY",[0,a])},_mouseup:function(a){this.$FnMouseMove.detach(document,"mousemove");this.$FnMouseUp.detach(document,"mouseup");this.oApp.exec("MSG_EDITING_AREA_RESIZE_ENDED",[this.$FnMouseDown,this.$FnMouseMove,this.$FnMouseUp])},_closeNotice:function(){this.welNoticeLayer.hide();jindo.$Cookie().set(this.sCookieNotice,1,365*10)}});nhn.husky.SE_EditingArea_HTMLSrc=jindo.$Class({name:"SE_EditingArea_HTMLSrc",sMode:"HTMLSrc",bAutoResize:false,nMinHeight:null,$init:function(a){this.elEditingArea=jindo.$(a)},$BEFORE_MSG_APP_READY:function(){this.oNavigator=jindo.$Agent().navigator();this.oApp.exec("REGISTER_EDITING_AREA",[this])},$ON_MSG_APP_READY:function(){if(!!this.oApp.getEditingAreaHeight){this.nMinHeight=this.oApp.getEditingAreaHeight()}},$ON_CHANGE_EDITING_MODE:function(a){if(a==this.sMode){this.elEditingArea.style.display="block"}else{this.elEditingArea.style.display="none"}},$AFTER_CHANGE_EDITING_MODE:function(a,b){if(a==this.sMode&&!b){var c=new TextRange(this.elEditingArea);c.setSelection(0,0)}},startAutoResize:function(){var a={nMinHeight:this.nMinHeight,wfnCallback:jindo.$Fn(this.oApp.checkResizeGripPosition,this).bind()};if(this.oNavigator.msafari){a.wfnCallback=function(){}}this.bAutoResize=true;this.AutoResizer=new nhn.husky.AutoResizer(this.elEditingArea,a);this.AutoResizer.bind()},stopAutoResize:function(){this.AutoResizer.unbind()},getIR:function(){var a=this.getRawContents();if(this.oApp.applyConverter){a=this.oApp.applyConverter(this.sMode+"_TO_IR",a,this.oApp.getWYSIWYGDocument())}return a},setIR:function(c){if(c.toLowerCase()==="
    "||c.toLowerCase()==="

     

    "||c.toLowerCase()==="


    "||c.toLowerCase()==="

    "){c=""}var b=jindo.$Agent().navigator();if(b.ie&&b.nativeVersion==11&&document.documentMode==11){c=c.replace(/(

    $)/,"")}var a=c;if(this.oApp.applyConverter){a=this.oApp.applyConverter("IR_TO_"+this.sMode,a,this.oApp.getWYSIWYGDocument())}this.setRawContents(a)},setRawContents:function(a){if(typeof a!=="undefined"){this.elEditingArea.value=a}},getRawContents:function(){return this.elEditingArea.value},focus:function(){this.elEditingArea.focus()}});if(typeof window.TextRange=="undefined"){window.TextRange={}}TextRange=function(b,a){this._o=b;this._oDoc=(a||document)};TextRange.prototype.getSelection=function(){var d=this._o;var b=[-1,-1];if(isNaN(this._o.selectionStart)){d.focus();var a=this._oDoc.body.createTextRange();var c=null;c=this._oDoc.selection.createRange().duplicate();a.moveToElementText(d);c.collapse(true);a.setEndPoint("EndToEnd",c);b[0]=a.text.length;c=this._oDoc.selection.createRange().duplicate();a.moveToElementText(d);c.collapse(false);a.setEndPoint("EndToEnd",c);b[1]=a.text.length;d.blur()}else{b[0]=d.selectionStart;b[1]=d.selectionEnd}return b};TextRange.prototype.setSelection=function(d,a){var c=this._o;if(typeof a=="undefined"){a=d}if(c.setSelectionRange){c.setSelectionRange(d,a)}else{if(c.createTextRange){var b=c.createTextRange();b.collapse(true);b.moveStart("character",d);b.moveEnd("character",a-d);b.select();c.blur()}}};TextRange.prototype.copy=function(){var a=this.getSelection();return this._o.value.substring(a[0],a[1])};TextRange.prototype.paste=function(c){var h=this._o;var f=this.getSelection();var e=h.value;var g=e.substr(0,f[0]);var d=e.substr(f[1]);e=g+c+d;h.value=e;var j=0;if(typeof this._oDoc.body.style.maxHeight=="undefined"){var b=g.match(/\n/gi);j=(b!==null?b.length:0)}this.setSelection(f[0]+c.length-j)};TextRange.prototype.cut=function(){var a=this.copy();this.paste("");return a};nhn.husky.SE_EditingArea_TEXT=jindo.$Class({name:"SE_EditingArea_TEXT",sMode:"TEXT",sRxConverter:"@[0-9]+@",bAutoResize:false,nMinHeight:null,$init:function(a){this.elEditingArea=jindo.$(a)},$BEFORE_MSG_APP_READY:function(){this.oNavigator=jindo.$Agent().navigator();this.oApp.exec("REGISTER_EDITING_AREA",[this]);this.oApp.exec("ADD_APP_PROPERTY",["getTextAreaContents",jindo.$Fn(this.getRawContents,this).bind()])},$ON_MSG_APP_READY:function(){if(!!this.oApp.getEditingAreaHeight){this.nMinHeight=this.oApp.getEditingAreaHeight()}},$ON_REGISTER_CONVERTERS:function(){this.oApp.exec("ADD_CONVERTER",["IR_TO_TEXT",jindo.$Fn(this.irToText,this).bind()]);this.oApp.exec("ADD_CONVERTER",["TEXT_TO_IR",jindo.$Fn(this.textToIr,this).bind()])},$ON_CHANGE_EDITING_MODE:function(a){if(a==this.sMode){this.elEditingArea.style.display="block"}else{this.elEditingArea.style.display="none"}},$AFTER_CHANGE_EDITING_MODE:function(a,b){if(a==this.sMode&&!b){var c=new TextRange(this.elEditingArea);c.setSelection(0,0)}},irToText:function(d){var a=d,b=0;var c=a.match(new RegExp(this.sRxConverter));if(c!==null){a=a.replace(new RegExp(this.sRxConverter),"")}a=a.replace(/\r/g,"");a=a.replace(/[\n|\t]/g,"");a=a.replace(/[\v|\f]/g,"");a=a.replace(/


    <\/p>/gi,"\n");a=a.replace(/

     <\/P>/gi,"\n");a=a.replace(//gi,"\n");a=a.replace(//gi,"\n");a=a.replace(/<\/p(\s[^\/]*)?>/gi,"\n");a=a.replace(/<\/li(\s[^\/]*)?>/gi,"\n");a=a.replace(/<\/tr(\s[^\/]*)?>/gi,"\n");b=a.lastIndexOf("\n");if(b>-1&&a.substring(b)=="\n"){a=a.substring(0,b)}a=jindo.$S(a).stripTags().toString();a=this.unhtmlSpecialChars(a);if(c!==null){a=c[0]+a}return a},textToIr:function(c){if(!c){return}var a=c,b=null;b=a.match(new RegExp(this.sRxConverter));if(b!==null){a=a.replace(b[0],"")}a=this.htmlSpecialChars(a);a=this._addLineBreaker(a);if(b!==null){a=b[0]+a}return a},_addLineBreaker:function(b){if(this.oApp.sLineBreaker==="BR"){return b.replace(/\r?\n/g,"
    ")}var c=new StringBuffer(),f=b.split("\n"),e=f.length,d="";for(var a=0;a");c.append(f[a]);c.append("

    ")}else{if(!jindo.$Agent().navigator().ie){c.append("


    ")}else{c.append("

     

    ")}}}return c.toString()},startAutoResize:function(){var a={nMinHeight:this.nMinHeight,wfnCallback:jindo.$Fn(this.oApp.checkResizeGripPosition,this).bind()};if(this.oNavigator.msafari){a.wfnCallback=function(){}}this.bAutoResize=true;this.AutoResizer=new nhn.husky.AutoResizer(this.elEditingArea,a);this.AutoResizer.bind()},stopAutoResize:function(){this.AutoResizer.unbind()},getIR:function(){var a=this.getRawContents();if(this.oApp.applyConverter){a=this.oApp.applyConverter(this.sMode+"_TO_IR",a,this.oApp.getWYSIWYGDocument())}return a},setIR:function(b){var a=b;if(this.oApp.applyConverter){a=this.oApp.applyConverter("IR_TO_"+this.sMode,a,this.oApp.getWYSIWYGDocument())}this.setRawContents(a)},setRawContents:function(a){if(typeof a!=="undefined"){this.elEditingArea.value=a}},getRawContents:function(){return this.elEditingArea.value},focus:function(){this.elEditingArea.focus()},htmlSpecialChars:function(a){return a.replace(/&/g,"&").replace(//g,">").replace(/ /g," ")},unhtmlSpecialChars:function(a){return a.replace(/</g,"<").replace(/>/g,">").replace(/ /g," ").replace(/&/g,"&")}});nhn.husky.SE_EditingArea_WYSIWYG=jindo.$Class({name:"SE_EditingArea_WYSIWYG",status:nhn.husky.PLUGIN_STATUS.NOT_READY,sMode:"WYSIWYG",iframe:null,doc:null,bStopCheckingBodyHeight:false,bAutoResize:false,nBodyMinHeight:0,nScrollbarWidth:0,iLastUndoRecorded:0,_nIFrameReadyCount:50,bWYSIWYGEnabled:false,$init:function(b){this.iframe=jindo.$(b);var a=jindo.$Agent().navigator();if(a.ie){this.iframe.style.display="none"}this.sBlankPageURL="smart_editor2_inputarea.html";this.sBlankPageURL_EmulateIE7="smart_editor2_inputarea_ie8.html";this.aAddtionalEmulateIE7=[];this.htOptions=nhn.husky.SE2M_Configuration.SE_EditingAreaManager;if(this.htOptions){this.sBlankPageURL=this.htOptions.sBlankPageURL||this.sBlankPageURL;this.sBlankPageURL_EmulateIE7=this.htOptions.sBlankPageURL_EmulateIE7||this.sBlankPageURL_EmulateIE7;this.aAddtionalEmulateIE7=this.htOptions.aAddtionalEmulateIE7||this.aAddtionalEmulateIE7}this.aAddtionalEmulateIE7.push(8);this.sIFrameSrc=this.sBlankPageURL;if(a.ie&&jindo.$A(this.aAddtionalEmulateIE7).has(a.nativeVersion)){this.sIFrameSrc=this.sBlankPageURL_EmulateIE7}var e=this.sIFrameSrc,b=this.iframe,d=jindo.$Fn(this.initIframe,this).bind(),c=jindo.$Fn(function(){this.iframe.src=e},this).bind();if(!a.ie||(a.version>=9&&!!document.addEventListener)){b.addEventListener("load",d,false);b.addEventListener("error",c,false)}else{b.attachEvent("onload",d);b.attachEvent("onerror",c)}b.src=e;this.elEditingArea=b},$BEFORE_MSG_APP_READY:function(){this.oEditingArea=this.iframe.contentWindow.document;this.oApp.exec("REGISTER_EDITING_AREA",[this]);this.oApp.exec("ADD_APP_PROPERTY",["getWYSIWYGWindow",jindo.$Fn(this.getWindow,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["getWYSIWYGDocument",jindo.$Fn(this.getDocument,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["isWYSIWYGEnabled",jindo.$Fn(this.isWYSIWYGEnabled,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["getRawHTMLContents",jindo.$Fn(this.getRawHTMLContents,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["setRawHTMLContents",jindo.$Fn(this.setRawHTMLContents,this).bind()]);if(!!this.isWYSIWYGEnabled()){this.oApp.exec("ENABLE_WYSIWYG_RULER",[])}this.oApp.registerBrowserEvent(this.getDocument().body,"paste","EVENT_EDITING_AREA_PASTE")},$ON_MSG_APP_READY:function(){if(!this.oApp.hasOwnProperty("saveSnapShot")){this.$ON_EVENT_EDITING_AREA_MOUSEUP=function(){};this._recordUndo=function(){}}this._bIERangeReset=true;if(this.oApp.oNavigator.ie){jindo.$Fn(function(b){var a=this.iframe.contentWindow.document.selection;if(a&&a.type.toLowerCase()==="control"&&b.key().keyCode===8){this.oApp.exec("EXECCOMMAND",["delete",false,false]);b.stop()}this._bIERangeReset=false},this).attach(this.iframe.contentWindow.document,"keydown");jindo.$Fn(function(a){this._oIERange=null;this._bIERangeReset=true},this).attach(this.iframe.contentWindow.document.body,"mousedown");jindo.$Fn(this._onIEBeforeDeactivate,this).attach(this.iframe.contentWindow.document.body,"beforedeactivate");jindo.$Fn(function(a){this._bIERangeReset=false},this).attach(this.iframe.contentWindow.document.body,"mouseup")}else{}this.fnSetBodyHeight=jindo.$Fn(this._setBodyHeight,this).bind();this.fnCheckBodyChange=jindo.$Fn(this._checkBodyChange,this).bind();this.fnSetBodyHeight();this._setScrollbarWidth()},_setScrollbarWidth:function(){var a=this.getDocument(),b=a.createElement("div");b.style.width="100px";b.style.height="100px";b.style.overflow="scroll";b.style.position="absolute";b.style.top="-9999px";a.body.appendChild(b);this.nScrollbarWidth=b.offsetWidth-b.clientWidth;a.body.removeChild(b)},$AFTER_EVENT_EDITING_AREA_KEYUP:function(a){if(!this.bAutoResize){return}var b=a.key();if((b.keyCode>=33&&b.keyCode<=40)||b.alt||b.ctrl||b.keyCode===16){return}this._setAutoResize()},$AFTER_PASTE_HTML:function(){if(!this.bAutoResize){return}this._setAutoResize()},startAutoResize:function(){this.oApp.exec("STOP_CHECKING_BODY_HEIGHT");this.bAutoResize=true;var a=this.oApp.oNavigator;if(a.ie&&a.version<9){jindo.$Element(this.getDocument().body).css({overflow:"visible"})}else{jindo.$Element(this.getDocument().body).css({overflowX:"visible",overflowY:"hidden"})}this._setAutoResize();this.nCheckBodyInterval=setInterval(this.fnCheckBodyChange,500);this.oApp.exec("START_FLOAT_TOOLBAR")},stopAutoResize:function(){this.bAutoResize=false;clearInterval(this.nCheckBodyInterval);this.oApp.exec("STOP_FLOAT_TOOLBAR");jindo.$Element(this.getDocument().body).css({overflow:"visible",overflowY:"visible"});this.oApp.exec("START_CHECKING_BODY_HEIGHT")},_checkBodyChange:function(){if(!this.bAutoResize){return}var a=this.getDocument().body.innerHTML.length;if(a!==this.nBodyLength){this.nBodyLength=a;this._setAutoResize()}},_getResizeHeight:function(){var d=this.getDocument().body,b,f,a=["width","fontFamily","fontSize","fontWeight","fontStyle","lineHeight","letterSpacing","textTransform","wordSpacing"],e,c;if(!this.oApp.oNavigator.firefox&&!this.oApp.oNavigator.safari){if(this.oApp.oNavigator.ie&&this.oApp.oNavigator.version===8&&document.documentMode===8){jindo.$Element(d).css("height","0px")}f=parseInt(d.scrollHeight,10);if(f-1){e.lineHeight=(parseInt(e.lineHeight,10)/parseInt(e.fontSize,10))}jindo.$Element(this.elDummy).css(e);this.elDummy.innerHTML=d.innerHTML;f=this.elDummy.scrollHeight;return f},_setAutoResize:function(){var g=this.getDocument().body,c=jindo.$Element(g),h,d,b,f,e=false,a=this.oApp.oNavigator;this.nTopBottomMargin=this.nTopBottomMargin||(parseInt(c.css("marginTop"),10)+parseInt(c.css("marginBottom"),10));this.nBodyMinHeight=this.nBodyMinHeight||(this.oApp.getEditingAreaHeight()-this.nTopBottomMargin);if((a.ie&&a.nativeVersion>=9)||a.chrome){c.css("height","0px");this.iframe.style.height="0px"}h=this._getResizeHeight();if(a.ie){if(h>this.nBodyMinHeight){b=this.oApp.getCurrentStyle();f=parseInt(b.fontSize,10)*b.lineHeight;if(fthis.nBodyMinHeight){b=this.oApp.getCurrentStyle();f=parseInt(b.fontSize,10)*b.lineHeight;if(fa?f-h:d);if(this._isHorizontalScrollbarVisible()){c-=this.nScrollbarWidth}b.css("height",c+"px");setTimeout(this.fnSetBodyHeight,500)},_isHorizontalScrollbarVisible:function(){var a=this.getDocument();if(a.documentElement.clientWidth8){var d=jindo.$$.getSingle("DIV.husky_seditor_editing_area_container").childNodes[0];if((d.tagName=="DIV")&&(d.style.zIndex==1000)){d.parentNode.removeChild(d)}}this.iframe.style.display="block";this.oApp.exec("REFRESH_WYSIWYG",[]);this.oApp.exec("SET_EDITING_WINDOW",[this.getWindow()]);this.oApp.exec("START_CHECKING_BODY_HEIGHT")}else{this.iframe.style.display="none";this.oApp.exec("STOP_CHECKING_BODY_HEIGHT")}},$AFTER_CHANGE_EDITING_MODE:function(a,b){this._oIERange=null},$ON_REFRESH_WYSIWYG:function(){if(!jindo.$Agent().navigator().firefox){return}this._disableWYSIWYG();this._enableWYSIWYG()},$ON_ENABLE_WYSIWYG:function(){this._enableWYSIWYG()},$ON_DISABLE_WYSIWYG:function(){this._disableWYSIWYG()},$ON_IE_HIDE_CURSOR:function(){if(!this.oApp.oNavigator.ie){return}this._onIEBeforeDeactivate();var a=this.oApp.getWYSIWYGDocument().selection;if(a&&a.createRange){try{a.empty()}catch(b){a=this.oApp.getSelection();a.select();a.oBrowserSelection.selectNone()}}else{this.oApp.getEmptySelection().oBrowserSelection.selectNone()}},$AFTER_SHOW_ACTIVE_LAYER:function(){this.oApp.exec("IE_HIDE_CURSOR",[]);this.bActiveLayerShown=true},$BEFORE_EVENT_EDITING_AREA_KEYDOWN:function(a){this._bKeyDown=true},$ON_EVENT_EDITING_AREA_KEYDOWN:function(a){if(this.oApp.getEditingMode()!==this.sMode){return}var b=a.key();if(this.oApp.oNavigator.ie){switch(b.keyCode){case 33:this._pageUp(a);break;case 34:this._pageDown(a);break;case 8:this._backspace(a);break;default:}}else{if(this.oApp.oNavigator.firefox){if(b.keyCode===8){this._backspace(a)}}}this._recordUndo(b)},_backspace:function(b){var a=this.oApp.getSelection(),c=null;if(!a.collapsed){return}c=a.getNodeAroundRange(true,false);if(c&&c.nodeType===3){if(/^[\n]*$/.test(c.nodeValue)){c=c.previousSibling}else{if(c.nodeValue==="\u200B"||c.nodeValue==="\uFEFF"){c.nodeValue=""}}}if(!!c&&c.nodeType===1&&c.tagName==="TABLE"){jindo.$Element(c).leave();b.stop(jindo.$Event.CANCEL_ALL)}},$BEFORE_EVENT_EDITING_AREA_KEYUP:function(a){if(!this._bKeyDown){return false}this._bKeyDown=false},$ON_EVENT_EDITING_AREA_MOUSEUP:function(a){this.oApp.saveSnapShot()},$BEFORE_PASTE_HTML:function(){if(this.oApp.getEditingMode()!==this.sMode){this.oApp.exec("CHANGE_EDITING_MODE",[this.sMode])}},$ON_PASTE_HTML:function(b,g,e){var c,j,f,l,h,d,k,a;if(this.oApp.getEditingMode()!==this.sMode){return}if(!e){this.oApp.exec("RECORD_UNDO_BEFORE_ACTION",["PASTE HTML"])}j=jindo.$Agent().navigator();c=g||this.oApp.getSelection();if(j.ie&&j.nativeVersion==8&&document.documentMode==8){b=b+unescape("%uFEFF")}c.pasteHTML(b);if(!j.ie){f=c.placeStringBookmark();this.oApp.getWYSIWYGDocument().body.innerHTML=this.oApp.getWYSIWYGDocument().body.innerHTML;c.moveToBookmark(f);c.collapseToEnd();c.select();c.removeStringBookmark(f);c=this.oApp.getSelection();if(!!g){g.setRange(c)}}else{c.collapseToEnd();c.select();this._oIERange=null;this._bIERangeReset=false}if(b.indexOf("-1){l=c.startContainer;if(l.nodeType===1&&l.tagName==="P"){h=jindo.$Element(l).child(function(m){return(m.$value().nodeType===1&&m.$value().tagName==="IMG")},1);if(h.length>0){d=h[h.length-1].$value();k=d.nextSibling;while(k){a=k.nextSibling;if(k.nodeType===3&&(k.nodeValue===" "||k.nodeValue===unescape("%u00A0"))){l.removeChild(k)}k=a}}}}if(!e){this.oApp.exec("RECORD_UNDO_AFTER_ACTION",["PASTE HTML"])}},$ON_FOCUS_N_CURSOR:function(d,a){var b,c;if(a&&(b=jindo.$(a,this.getDocument()))){clearTimeout(this._nTimerFocus);this._nTimerFocus=setTimeout(jindo.$Fn(function(e){this._scrollIntoView(e);this.oApp.exec("FOCUS")},this).bind(b),300);return}c=this.oApp.getSelection();if(!c.collapsed){if(d){c.collapseToEnd()}else{c.collapseToStart()}c.select()}else{if(d){this.oApp.exec("FOCUS");b=this.getDocument().body;c.selectNode(b);c.collapseToEnd();c.select();this._scrollIntoView(b)}else{this.oApp.exec("FOCUS")}}},_getElementVerticalPosition:function(b){var a=0,c=b,d={nTop:0,nBottom:0};if(!b){return d}while(c){a+=c.offsetTop;c=c.offsetParent}d.nTop=a;d.nBottom=a+jindo.$Element(b).height();return d},_getVisibleVerticalPosition:function(){var a,b,d,c={nTop:0,nBottom:0};a=this.getWindow();b=this.getDocument();d=a.innerHeight?a.innerHeight:b.documentElement.clientHeight||b.body.clientHeight;c.nTop=a.pageYOffset||b.documentElement.scrollTop;c.nBottom=c.nTop+d;return c},_isElementVisible:function(b,a){return(b.nTop>=a.nTop&&b.nBottom<=a.nBottom)},_scrollIntoView:function(c){var d=this._getElementVerticalPosition(c),b=this._getVisibleVerticalPosition(),a=0;if(this._isElementVisible(d,b)){return}if((a=d.nBottom-b.nBottom)>0){this.getWindow().scrollTo(0,b.nTop+a);return}this.getWindow().scrollTo(0,d.nTop)},$BEFORE_MSG_EDITING_AREA_RESIZE_STARTED:function(){if(!jindo.$Agent().navigator().ie){var a=null;a=this.oApp.getSelection();this.sBM=a.placeStringBookmark()}},$AFTER_MSG_EDITING_AREA_RESIZE_ENDED:function(a,b,d){if(this.oApp.getEditingMode()!==this.sMode){return}this.oApp.exec("REFRESH_WYSIWYG",[]);if(!jindo.$Agent().navigator().ie){var c=this.oApp.getEmptySelection();c.moveToBookmark(this.sBM);c.select();c.removeStringBookmark(this.sBM)}},$ON_CLEAR_IE_BACKUP_SELECTION:function(){this._oIERange=null},$ON_RESTORE_IE_SELECTION:function(){if(this._oIERange){try{this._oIERange.select();this._oPrevIERange=this._oIERange;this._oIERange=null}catch(a){}}},$ON_EVENT_EDITING_AREA_PASTE:function(a){this.oApp.delayedExec("EVENT_EDITING_AREA_PASTE_DELAY",[a],0)},$ON_EVENT_EDITING_AREA_PASTE_DELAY:function(a){this._replaceBlankToNbsp(a.element)},_replaceBlankToNbsp:function(c){var b=this.oApp.oNavigator;if(!b.ie){return}if(b.nativeVersion!==9||document.documentMode!==7){return}if(c.nodeType!==1){return}if(c.tagName==="BR"){return}var a=jindo.$$("p:empty()",this.oApp.getWYSIWYGDocument().body,{oneTimeOffCache:true});jindo.$A(a).forEach(function(e,d,f){e.innerHTML=" "})},_pageUp:function(c){var b=this._getEditorHeight(),d=jindo.$Document(this.oApp.getWYSIWYGDocument()).scrollPosition(),a;if(d.top<=b){a=0}else{a=d.top-b}this.oApp.getWYSIWYGWindow().scrollTo(0,a);c.stop()},_pageDown:function(c){var b=this._getEditorHeight(),d=jindo.$Document(this.oApp.getWYSIWYGDocument()).scrollPosition(),e=this._getBodyHeight(),a;if(d.top+b>=e){a=e-b}else{a=d.top+b}this.oApp.getWYSIWYGWindow().scrollTo(0,a);c.stop()},_getEditorHeight:function(){return this.oApp.elEditingAreaContainer.offsetHeight-this.nTopBottomMargin},_getBodyHeight:function(){return parseInt(this.getDocument().body.scrollHeight,10)},initIframe:function(){try{if(!this.iframe.contentWindow.document||!this.iframe.contentWindow.document.body||this.iframe.contentWindow.document.location.href==="about:blank"){throw new Error("Access denied")}var b=(!!nhn.husky.SE2M_Configuration.SE2M_CSSLoader&&nhn.husky.SE2M_Configuration.SE2M_CSSLoader.sCSSBaseURI)?nhn.husky.SE2M_Configuration.SE2M_CSSLoader.sCSSBaseURI:"";if(!!nhn.husky.SE2M_Configuration.SE_EditingAreaManager.sCSSBaseURI){b=nhn.husky.SE2M_Configuration.SE_EditingAreaManager.sCSSBaseURI}if(b){var f=this.getDocument();var c=f.getElementsByTagName("head")[0];var a=f.createElement("link");a.type="text/css";a.rel="stylesheet";a.href=b+"/smart_editor2_in.css";c.appendChild(a)}this._enableWYSIWYG();this.status=nhn.husky.PLUGIN_STATUS.READY}catch(d){if(this._nIFrameReadyCount-->0){setTimeout(jindo.$Fn(this.initIframe,this).bind(),100)}else{throw ("iframe for WYSIWYG editing mode can't be initialized. Please check if the iframe document exists and is also accessable(cross-domain issues). ")}}},getIR:function(){var a=this.iframe.contentWindow.document.body.innerHTML,b;if(this.oApp.applyConverter){b=this.oApp.applyConverter(this.sMode+"_TO_IR",a,this.oApp.getWYSIWYGDocument())}else{b=a}return b},setIR:function(h){var c,b=this.oApp.oNavigator,d=b.ie&&document.documentMode<11,g=d?"":"
    ";if(this.oApp.applyConverter){c=this.oApp.applyConverter("IR_TO_"+this.sMode,h,this.oApp.getWYSIWYGDocument())}else{c=h}this.iframe.contentWindow.document.body.innerHTML=c;if((this.iframe.contentWindow.document.body.innerHTML).replace(/[\r\n\t\s]*/,"")===""){if(this.oApp.sLineBreaker!=="BR"){g="

    "+g+"

    "}this.iframe.contentWindow.document.body.innerHTML=g}if(d&&this.oApp.getEditingMode()===this.sMode){var f=this.oApp.getWYSIWYGDocument().body.getElementsByTagName("P");for(var a=0,e=f.length;a=33&&a.keyCode<=40){this.oApp.saveSnapShot();return}if(a.alt||a.ctrl||a.keyCode===16){return}if(this.oApp.getLastKey()===a.keyCode){return}this.oApp.setLastKey(a.keyCode);if(!a.enter&&a.keyCode!==46&&a.keyCode!==8){return}this.oApp.exec("RECORD_UNDO_ACTION",["KEYPRESS("+a.keyCode+")",{bMustBlockContainer:true}])},_enableWYSIWYG:function(){if(this.iframe.contentWindow.document.body.contentEditable!==null){this.iframe.contentWindow.document.body.contentEditable=true}else{this.iframe.contentWindow.document.designMode="on"}this.bWYSIWYGEnabled=true;if(jindo.$Agent().navigator().firefox){setTimeout(jindo.$Fn(function(){this.iframe.contentWindow.document.execCommand("enableInlineTableEditing",false,false)},this).bind(),0)}},_disableWYSIWYG:function(){if(this.iframe.contentWindow.document.body.contentEditable!==null){this.iframe.contentWindow.document.body.contentEditable=false}else{this.iframe.contentWindow.document.designMode="off"}this.bWYSIWYGEnabled=false},isWYSIWYGEnabled:function(){return this.bWYSIWYGEnabled}});nhn.husky.SE_PasteHandler=jindo.$Class({name:"SE_PasteHandler",$init:function(a){this.sParagraphContainer=a||"P";this.aConversionTarget=["TABLE"];this.htBrowser=jindo.$Agent().navigator()},$ON_MSG_APP_READY:function(){if(!this.htBrowser.safari||(this.htBrowser.safari&&this.htBrowser.version>=6)){this.elBody=this.oApp.getWYSIWYGDocument().body;this.wfnPasteHandler=jindo.$Fn(this._handlePaste,this);this.wfnPasteHandler.attach(this.elBody,"paste");this.elEditingAreaContainer=jindo.$$.getSingle("DIV.husky_seditor_editing_area_container",null,{oneTimeOffCache:true});if(this.htBrowser.ie&&this.htBrowser.nativeVersion<=10&&this.htBrowser.version<=10){this.wfnBeforePasteHandler=jindo.$Fn(this._handleBeforePaste,this);this.wfnBeforePasteHandler.attach(this.elBody,"beforePaste")}}},_handleBeforePaste:function(){var b=this.oApp.getSelection();if(!b.collapsed){b.deleteContents()}this._sBM_IE=b.placeStringBookmark();var c=b.getStringBookmark(this._sBM_IE,true);var a=document.createTextNode("");this.zwspStart=a.cloneNode(true);this.zwspStart.nodeValue="\u200b";this.zwspEnd=this.zwspStart.cloneNode(true);c.parentNode.insertBefore(this.zwspEnd,c);c.parentNode.insertBefore(this.zwspStart,this.zwspEnd);b.setEndBefore(this.zwspEnd);b.collapseToEnd();b.select()},_handlePaste:function(c){if(this.htBrowser.chrome||(this.htBrowser.safari&&this.htBrowser.version>=6)){var b=c._event.clipboardData.getData("text/html");var d=document.createElement("DIV");d.innerHTML=b;var a=jindo.$$.getSingle("style",d,{oneTimeOffCache:true});if(a){var e=a.innerHTML;e=e.replace(/"/g,"'");this._sStyleFromClipboard=e}}this._preparePaste();setTimeout(jindo.$Fn(function(){var m=new RegExp("^[\u200b]");if(!!this.zwspStart&&!!this.zwspStart.nodeValue){this.zwspStart.nodeValue=this.zwspStart.nodeValue.replace(m,"");if(this.zwspStart.nodeValue==""&&!!this.zwspStart.paretNode){this.zwspStart.parentNode.removeChild(this.zwspStart)}}var g=new RegExp("[\u200b]$");if(!!this.zwspEnd&&!!this.zwspEnd.nodeValue){this.zwspEnd.nodeValue=this.zwspEnd.nodeValue.replace(g,"");if(this.zwspEnd.nodeValue==""&&!!this.zwspEnd.parentNode){this.zwspEnd.parentNode.removeChild(this.zwspEnd)}}try{this._processPaste()}catch(l){if(typeof(JEagleEyeClient)!="undefined"){var f=l.lineNumber;if(!f){f=0}var j="hp_SE_PasteHandler.js/_handlePaste";if(j){var h="http://blog.naver.com/";h+=j;j=h}JEagleEyeClient.sendError(l,j,f)}}var k=this.oApp.getSelection();this._moveToStringBookmark(k);k.collapseToEnd();k.select();this._removeStringBookmark(k)},this).bind(),0)},_preparePaste:function(){this._saveOriginalContents()},_saveOriginalContents:function(){var b=this.oApp.getSelection();if(!b.isCollapsed){b.deleteContents()}if(!this._sBM_IE){this._sBM=b.placeStringBookmark();var c=b.getStringBookmark(this._sBM,true);var d=b.getStringBookmark(this._sBM);var a=document.createTextNode("");this.zwspStart=a.cloneNode(true);this.zwspStart.nodeValue="\u200b";this.zwspEnd=this.zwspStart.cloneNode(true);c.parentNode.insertBefore(this.zwspEnd,c);c.parentNode.insertBefore(this.zwspStart,this.zwspEnd);b.setEndBefore(this.zwspEnd);b.collapseToEnd();b.select();if(this.htBrowser.ie&&this.htBrowser.nativeVersion==11&&this.htBrowser.version==11){}}},_processPaste:function(){this._savePastedContents();try{if(!!this.elPasteHelper){this._clearPasteHelper();this._showPasteHelper()}else{this._createPasteHelper()}this._loadToPasteHelper();this._loadToBody();this._hidePasteHelper()}catch(a){this._hidePasteHelper();throw a}this._hidePasteHelper()},_savePastedContents:function(){var c=this.oApp.getSelection();this._moveToStringBookmark(c);c.select();this.oSelectionClone=c.cloneContents();c.collapseToEnd();c.select();var a=this._outerHTML(this.oSelectionClone);this._isPastedContentsEmpty=true;if(a!=""){this._isPastedContentsEmpty=false;if(this.htBrowser.firefox||(this.htBrowser.safari&&this.htBrowser.version>=6)){var b=a.match(/