Преглед на файлове

스마트에디터 관련 추가

eskim преди 5 години
родител
ревизия
f7f2668a5a
променени са 41 файла, в които са добавени 2461 реда и са изтрити 0 реда
  1. 16 0
      style24.admin/pom.xml
  2. 480 0
      style24.admin/src/main/webapp/smartEditor/SEditorSkin.html
  3. 334 0
      style24.admin/src/main/webapp/smartEditor/css/default.css
  4. 30 0
      style24.admin/src/main/webapp/smartEditor/css/style.css
  5. BIN
      style24.admin/src/main/webapp/smartEditor/img/XPButtonUploadText_61x22.png
  6. BIN
      style24.admin/src/main/webapp/smartEditor/img/bg_qmark.gif
  7. BIN
      style24.admin/src/main/webapp/smartEditor/img/bg_tool.gif
  8. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_confirm.gif
  9. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_expand.gif
  10. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_html.gif
  11. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_cancel.gif
  12. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_cell_adjust.gif
  13. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_close.gif
  14. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_confirm.gif
  15. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_find_next.gif
  16. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_find_next_strong.gif
  17. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_img.gif
  18. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_replace.gif
  19. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_replace_all.gif
  20. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_layer_tab.gif
  21. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_qmark.gif
  22. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_search.gif
  23. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_set.gif
  24. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_set_blank.gif
  25. BIN
      style24.admin/src/main/webapp/smartEditor/img/btn_set_original.gif
  26. BIN
      style24.admin/src/main/webapp/smartEditor/img/bx_character.gif
  27. BIN
      style24.admin/src/main/webapp/smartEditor/img/bx_find.gif
  28. BIN
      style24.admin/src/main/webapp/smartEditor/img/bx_table.gif
  29. BIN
      style24.admin/src/main/webapp/smartEditor/img/bx_url.gif
  30. BIN
      style24.admin/src/main/webapp/smartEditor/img/vr_layer_character.gif
  31. 109 0
      style24.admin/src/main/webapp/smartEditor/js/Husky.SE_Basic.js
  32. 126 0
      style24.admin/src/main/webapp/smartEditor/js/HuskyEZCreator.js
  33. 80 0
      style24.admin/src/main/webapp/smartEditor/js/SE_CustomPlugins.js
  34. 172 0
      style24.admin/src/main/webapp/smartEditor/js/jindo.min.js
  35. 10 0
      style24.admin/src/main/webapp/smartEditor/se_blank.html
  36. BIN
      style24.admin/src/main/webapp/smartEditor/swfupload/img/my_img.gif
  37. 49 0
      style24.admin/src/main/webapp/smartEditor/swfupload/js/handlers.js
  38. 980 0
      style24.admin/src/main/webapp/smartEditor/swfupload/js/swfupload.js
  39. BIN
      style24.admin/src/main/webapp/smartEditor/swfupload/swf/swfupload.swf
  40. 41 0
      style24.admin/src/main/webapp/smartEditor/swfupload/swfupload_proc.jsp
  41. 34 0
      style24.admin/src/main/webapp/smartEditor/write.html

+ 16 - 0
style24.admin/pom.xml

@@ -69,6 +69,22 @@
 			<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/gagaframework-excel-1.7.1-RELEASE.jar</systemPath>
 		</dependency>
 		<!-- \\\ WEB-INF lib -->
+		<dependency>
+			<groupId>servlets.com</groupId>
+			<artifactId>cos</artifactId>
+			<version>05Nov2002</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.6</version>
+		</dependency>
+		
 	</dependencies>
 	
 	<build>

+ 480 - 0
style24.admin/src/main/webapp/smartEditor/SEditorSkin.html

@@ -0,0 +1,480 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Smart Editor&#8482;</title>
+<link href="/smartEditor/css/default.css" rel="stylesheet" type="text/css" />
+<script type="text/javascript" src="/smartEditor/js/jindo.min.js" charset="utf-8"></script>
+<script type="text/javascript" src="/smartEditor/js/Husky.SE_Basic.js" charset="utf-8"></script>
+<script type="text/javascript" src="/smartEditor/js/SE_CustomPlugins.js" charset="utf-8"></script>
+</head>
+<body>
+<div id="smart_editor" class="smart_editor">
+	<div id="smart_content"> <a href="#husky_iframe" class="skip">&raquo; 편집 도구모음 건너뛰기</a>
+		<div class="tool">
+			<ul class="type">
+				<li class="husky_seditor_ui_fontName">
+					<select class="husky_seditor_ui_fontName_select">
+						<option value="">글꼴</option>
+						<option value="dotum" style="font-family:Dotum">돋움</option>
+						<option value="gulim" style="font-family:Gulim">굴림</option>
+						<option value="batang" style="font-family:Batang">바탕</option>
+						<option value="arial" style="font-family:Arial">Arial</option>
+						<option value="arial black" style="font-family:'Arial Black'">Arial Black</option>
+						<option value="tahoma" style="font-family:Tahoma">Tahoma</option>
+						<option value="verdana" style="font-family:Verdana">Verdana</option>
+						<option value="sans-serif" style="font-family:Sans-serif">Sans-serif</option>
+						<option value="serif" style="font-family:Serif">Serif</option>
+						<option value="monospace" style="font-family:Monospace">Monospace</option>
+						<option value="cursive" style="font-family:Cursive">Cursive</option>
+						<option value="fantasy" style="font-family:Fantasy">Fantasy</option>
+					</select>
+				</li>
+				<li class="husky_seditor_ui_fontSize">
+					<select class="husky_seditor_ui_fontSize_select">
+						<option value="">크기</option>
+						<option value="9px" style="font-size:9px">9px</option>
+						<option value="10px" style="font-size:10px">10px</option>
+						<option value="11px" style="font-size:11px">11px</option>
+						<option value="12px" style="font-size:12px">12px</option>
+						<option value="13px" style="font-size:13px">13px</option>
+						<option value="14px" style="font-size:14px">14px</option>
+						<option value="16px" style="font-size:16px">16px</option>
+						<option value="18px" style="font-size:18px">18px</option>
+						<option value="24px" style="font-size:24px">24px</option>
+						<option value="32px" style="font-size:32px">32px</option>
+					</select>
+				</li>
+				<li class="husky_seditor_ui_lineHeight">
+					<select class="husky_seditor_ui_lineHeight_select">
+						<option value="">줄간격</option>
+						<option value="1">100%</option>
+						<option value="1.2">120%</option>
+						<option value="1.4">140%</option>
+						<option value="1.6">160%</option>
+						<option value="1.8">180%</option>
+						<option value="2">200%</option>
+					</select>
+				</li>
+			</ul>
+			<ul class="style">
+				<li class="bold husky_seditor_ui_bold">
+					<button type="button" title="굵은글꼴[Ctrl+B]"><span>굵은글꼴</span></button>
+				</li>
+				<li class="underline husky_seditor_ui_underline">
+					<button type="button" title="밑줄[Ctrl+U]"><span>밑줄</span></button>
+				</li>
+				<li class="italic husky_seditor_ui_italic">
+					<button type="button" title="기울임글꼴[Ctrl+I]"><span>기울임글꼴</span></button>
+				</li>
+				<li class="del husky_seditor_ui_lineThrough">
+					<button type="button" title="취소선[Ctrl+D]"><span>취소선</span></button>
+				</li>
+				<li class="fcolor husky_seditor_ui_fontColor">
+					<button type="button" title="글자색"><span>글자색</span></button>
+					<!-- 팔레트 레이어 -->
+					<div class="layer husky_seditor_fontcolor_layer" style="display:none;">
+						<ul class="palette husky_seditor_color_palette">
+							<li><button type="button" title="#ff0000" style="background:#ff0000"><span>#ff0000</span></button></li>
+							<li><button type="button" title="#ff6c00" style="background:#ff6c00"><span>#ff6c00</span></button></li>
+							<li><button type="button" title="#ffaa00" style="background:#ffaa00"><span>#ffaa00</span></button></li>
+							<li><button type="button" title="#ffef00" style="background:#ffef00"><span>#ffef00</span></button></li>
+							<li><button type="button" title="#a6cf00" style="background:#a6cf00"><span>#a6cf00</span></button></li>
+							<li><button type="button" title="#009e25" style="background:#009e25"><span>#009e25</span></button></li>
+							<li><button type="button" title="#00b0a2" style="background:#00b0a2"><span>#00b0a2</span></button></li>
+							<li><button type="button" title="#0075c8" style="background:#0075c8"><span>#0075c8</span></button></li>
+							<li><button type="button" title="#3a32c3" style="background:#3a32c3"><span>#3a32c3</span></button></li>
+							<li><button type="button" title="#7820b9" style="background:#7820b9"><span>#7820b9</span></button></li>
+							<li><button type="button" title="#ef007c" style="background:#ef007c"><span>#ef007c</span></button></li>
+							<li><button type="button" title="#000000" style="background:#000000"><span>#000000</span></button></li>
+							<li><button type="button" title="#252525" style="background:#252525"><span>#252525</span></button></li>
+							<li><button type="button" title="#464646" style="background:#464646"><span>#464646</span></button></li>
+							<li><button type="button" title="#636363" style="background:#636363"><span>#636363</span></button></li>
+							<li><button type="button" title="#7d7d7d" style="background:#7d7d7d"><span>#7d7d7d</span></button></li>
+							<li><button type="button" title="#9a9a9a" style="background:#9a9a9a"><span>#9a9a9a</span></button></li>
+							<li><button type="button" title="#ffe8e8" style="background:#ffe8e8"><span>#ffe8e8</span></button></li>
+							<li><button type="button" title="#f7e2d2" style="background:#f7e2d2"><span>#f7e2d2</span></button></li>
+							<li><button type="button" title="#f5eddc" style="background:#f5eddc"><span>#f5eddc</span></button></li>
+							<li><button type="button" title="#f5f4e0" style="background:#f5f4e0"><span>#f5f4e0</span></button></li>
+							<li><button type="button" title="#edf2c2" style="background:#edf2c2"><span>#edf2c2</span></button></li>
+							<li><button type="button" title="#def7e5" style="background:#def7e5"><span>#def7e5</span></button></li>
+							<li><button type="button" title="#d9eeec" style="background:#d9eeec"><span>#d9eeec</span></button></li>
+							<li><button type="button" title="#c9e0f0" style="background:#c9e0f0"><span>#c9e0f0</span></button></li>
+							<li><button type="button" title="#d6d4eb" style="background:#d6d4eb"><span>#d6d4eb</span></button></li>
+							<li><button type="button" title="#e7dbed" style="background:#e7dbed"><span>#e7dbed</span></button></li>
+							<li><button type="button" title="#f1e2ea" style="background:#f1e2ea"><span>#f1e2ea</span></button></li>
+							<li><button type="button" title="#acacac" style="background:#acacac"><span>#acacac</span></button></li>
+							<li><button type="button" title="#c2c2c2" style="background:#c2c2c2"><span>#c2c2c2</span></button></li>
+							<li><button type="button" title="#cccccc" style="background:#cccccc"><span>#cccccc</span></button></li>
+							<li><button type="button" title="#e1e1e1" style="background:#e1e1e1"><span>#e1e1e1</span></button></li>
+							<li><button type="button" title="#ebebeb" style="background:#ebebeb"><span>#ebebeb</span></button></li>
+							<li><button type="button" title="#ffffff" style="background:#ffffff"><span>#ffffff</span></button></li>
+							<li><button type="button" title="#e97d81" style="background:#e97d81"><span>#e97d81</span></button></li>
+							<li><button type="button" title="#e19b73" style="background:#e19b73"><span>#e19b73</span></button></li>
+							<li><button type="button" title="#d1b274" style="background:#d1b274"><span>#d1b274</span></button></li>
+							<li><button type="button" title="#cfcca2" style="background:#cfcca2"><span>#cfcca2</span></button></li>
+							<li><button type="button" title="#cfcca2" style="background:#cfcca2"><span>#cfcca2</span></button></li>
+							<li><button type="button" title="#61b977" style="background:#61b977"><span>#61b977</span></button></li>
+							<li><button type="button" title="#53aea8" style="background:#53aea8"><span>#53aea8</span></button></li>
+							<li><button type="button" title="#518fbb" style="background:#518fbb"><span>#518fbb</span></button></li>
+							<li><button type="button" title="#6a65bb" style="background:#6a65bb"><span>#6a65bb</span></button></li>
+							<li><button type="button" title="#9a54ce" style="background:#9a54ce"><span>#9a54ce</span></button></li>
+							<li><button type="button" title="#e573ae" style="background:#e573ae"><span>#e573ae</span></button></li>
+							<li><button type="button" title="#5a504b" style="background:#5a504b"><span>#5a504b</span></button></li>
+							<li><button type="button" title="#767b86" style="background:#767b86"><span>#767b86</span></button></li>
+							<li><button type="button" title="#00ffff" style="background:#00ffff"><span>#00ffff</span></button></li>
+							<li><button type="button" title="#00ff00" style="background:#00ff00"><span>#00ff00</span></button></li>
+							<li><button type="button" title="#a0f000" style="background:#a0f000"><span>#a0f000</span></button></li>
+							<li><button type="button" title="#ffff00" style="background:#ffff00"><span>#ffff00</span></button></li>
+							<li><button type="button" title="#951015" style="background:#951015"><span>#951015</span></button></li>
+							<li><button type="button" title="#6e391a" style="background:#6e391a"><span>#6e391a</span></button></li>
+							<li><button type="button" title="#785c25" style="background:#785c25"><span>#785c25</span></button></li>
+							<li><button type="button" title="#5f5b25" style="background:#5f5b25"><span>#5f5b25</span></button></li>
+							<li><button type="button" title="#4c511f" style="background:#4c511f"><span>#4c511f</span></button></li>
+							<li><button type="button" title="#1c4827" style="background:#1c4827"><span>#1c4827</span></button></li>
+							<li><button type="button" title="#0d514c" style="background:#0d514c"><span>#0d514c</span></button></li>
+							<li><button type="button" title="#1b496a" style="background:#1b496a"><span>#1b496a</span></button></li>
+							<li><button type="button" title="#2b285f" style="background:#2b285f"><span>#2b285f</span></button></li>
+							<li><button type="button" title="#45245b" style="background:#45245b"><span>#45245b</span></button></li>
+							<li><button type="button" title="#721947" style="background:#721947"><span>#721947</span></button></li>
+							<li><button type="button" title="#352e2c" style="background:#352e2c"><span>#352e2c</span></button></li>
+							<li><button type="button" title="#3c3f45" style="background:#3c3f45"><span>#3c3f45</span></button></li>
+							<li><button type="button" title="#00aaff" style="background:#00aaff"><span>#00aaff</span></button></li>
+							<li><button type="button" title="#0000ff" style="background:#0000ff"><span>#0000ff</span></button></li>
+							<li><button type="button" title="#a800ff" style="background:#a800ff"><span>#a800ff</span></button></li>
+							<li><button type="button" title="#ff00ff" style="background:#ff00ff"><span>#ff00ff</span></button></li>
+						</ul>
+					</div>
+					<!-- /팔레트 레이어 -->
+				</li>
+				<li class="bcolor husky_seditor_ui_bgColor">
+					<button type="button" title="배경색"><span>배경색</span></button>
+					<!-- 배경색 + 팔레트 레이어 -->
+					<div class="layer husky_seditor_bgcolor_layer" style="display:none;">
+						<ul class="background">
+							<li><button type="button" title="#000000" style="background:#000000; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#9334d8" style="background:#9334d8; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#ff0000" style="background:#ff0000; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#333333" style="background:#333333; color:#ffff00"><span>가나다</span></button></li>
+							<li><button type="button" title="#0000ff" style="background:#0000ff; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#ff6600" style="background:#ff6600; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#8e8e8e" style="background:#8e8e8e; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#009999" style="background:#009999; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#ffa700" style="background:#ffa700; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#ffdaed" style="background:#ffdaed; color:#000000"><span>가나다</span></button></li>
+							<li><button type="button" title="#e4ff75" style="background:#e4ff75; color:#000000"><span>가나다</span></button></li>
+							<li><button type="button" title="#cc9900" style="background:#cc9900; color:#ffffff"><span>가나다</span></button></li>
+							<li><button type="button" title="#99dcff" style="background:#99dcff; color:#000000"><span>가나다</span></button></li>
+							<li><button type="button" title="#a6ff4d" style="background:#a6ff4d; color:#000000"><span>가나다</span></button></li>
+							<li><button type="button" title="#ffffff" style="background:#ffffff; color:#000000"><span>가나다</span></button></li>
+						</ul>
+					</div>
+					<!-- /배경색 + 팔레트 레이어 -->
+				</li>
+				<li class="sup husky_seditor_ui_superscript">
+					<button type="button" title="윗첨자"><span>윗첨자</span></button>
+				</li>
+				<li class="sub husky_seditor_ui_subscript">
+					<button type="button" title="아래첨자"><span>아래첨자</span></button>
+				</li>
+			</ul>
+			<ul class="paragraph">
+				<li class="left husky_seditor_ui_justifyleft">
+					<button type="button" title="왼쪽정렬"><span>왼쪽정렬</span></button>
+				</li>
+				<li class="center husky_seditor_ui_justifycenter">
+					<button type="button" title="가운데정렬"><span>가운데정렬</span></button>
+				</li>
+				<li class="right husky_seditor_ui_justifyright">
+					<button type="button" title="오른쪽정렬"><span>오른쪽정렬</span></button>
+				</li>
+				<li class="justify husky_seditor_ui_justifyfull">
+					<button type="button" title="양쪽정렬"><span>양쪽정렬</span></button>
+				</li>
+				<li class="ol husky_seditor_ui_orderedlist">
+					<button type="button" title="순차목록"><span>순차목록</span></button>
+				</li>
+				<li class="ul husky_seditor_ui_unorderedlist">
+					<button type="button" title="비순차목록"><span>비순차목록</span></button>
+				</li>
+				<li class="outdent husky_seditor_ui_outdent">
+					<button type="button" title="내어쓰기[Shift+Tab]"><span>내어쓰기</span></button>
+				</li>
+				<li class="indent husky_seditor_ui_indent">
+					<button type="button" title="들여쓰기[Tab]"><span>들여쓰기</span></button>
+				</li>
+			</ul>
+			<ul class="extra">
+				<li class="blockquote husky_seditor_ui_quote" style="display:none;">
+					<button type="button" title="인용"><span>인용</span></button>
+					<!-- 인용 레이어 -->
+					<div class="layer husky_seditor_blockquote_layer" style="display:none">
+						<ul>
+							<li class="q1"><button type="button"><span>왼쪽 실선</span></button></li>
+							<li class="q2"><button type="button"><span>인용 부호</span></button></li>
+							<li class="q3"><button type="button"><span>실선</span></button></li>
+							<li class="q4"><button type="button"><span>실선 + 배경</span></button></li>
+							<li class="q5"><button type="button"><span>굵은 실선</span></button></li>
+							<li class="q6"><button type="button"><span>점선</span></button></li>
+							<li class="q7"><button type="button"><span>점선 + 배경</span></button></li>
+							<li class="q8"><button type="button"><span>적용 취소</span></button></li>
+						</ul>
+					</div>
+					<!-- /인용 레이어 -->
+				</li>
+				<li class="url husky_seditor_ui_hyperlink">
+					<button type="button" title="링크"><span>URL</span></button>
+					<!-- URL 레이어 -->
+					<div class="layer husky_seditor_hyperlink_layer" style="display:none;">
+						<fieldset>
+							<h3>하이퍼링크</h3>
+							<input name="" class="link" type="text" value="http://" title="URL" />
+							<p><input name="" id="target" type="checkbox" value="" /><label for="target">새창으로</label></p>
+						</fieldset>
+						<div class="btn_area">
+							<button type="button" class="confirm" title="확인"><span>확인</span></button>
+							<button type="button" class="cancel" title="취소"><span>취소</span></button>
+
+						</div>
+
+					</div>
+					<!-- /URL 레이어 -->
+				</li>
+				<li class="table husky_seditor_ui_table" >
+					<button type="button" title="표"><span>표</span></button>
+					<!-- 표 레이어 -->
+					<div class="layer husky_seditor_table_layer" style="display:none;">
+						<fieldset class="num">
+							<h3>칸 수 지정</h3>
+							<dl>
+								<dt>
+									<label for="row">행</label>
+								</dt>
+								<dd>
+									<input id="row" name="" type="text" maxlength="2" value="4" />
+									<button type="button" class="add"><span>1행추가</span></button>
+									<button type="button" class="del"><span>1행삭제</span></button>
+								</dd>
+								<dt>
+									<label for="col">열</label>
+								</dt>
+								<dd>
+									<input id="col" name="" type="text" maxlength="2" value="4" />
+									<button type="button" class="add"><span>1행추가</span></button>
+									<button type="button" class="del"><span>1행삭제</span></button>
+								</dd>
+							</dl>
+							<table border="1">
+								<tr>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+								</tr>
+								<tr>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+								</tr>
+								<tr>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+								</tr>
+								<tr>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+									<td>&nbsp;</td>
+								</tr>
+							</table>
+						</fieldset>
+						<fieldset class="color">
+							<h3>표 속성 지정</h3>
+							<dl>
+								<dt>
+									<label for="table_border_width">테두리 굵기</label>
+								</dt>
+								<dd>
+									<input id="table_border_width" name="" type="text" maxlength="2" value="1" />
+									<button type="button" class="add"><span>1px 더하기</span></button>
+									<button type="button" class="del"><span>1px 빼기</span></button>
+								</dd>
+								<dt>
+									<label for="table_border_color">테두리 색</label>
+								</dt>
+								<dd>
+									<span class="preview_palette"><button type="button" style="background:#cccccc;">색상찾기</button></span>
+									<input id="table_border_color" name="" type="text" maxlength="7" value="#CCCCCC" />
+									<button type="button" class="find_palette"><span>색상찾기</span></button>
+								</dd>
+								<dt>
+									<label for="table_bg_color">표 배경색</label>
+								</dt>
+								<dd>
+									<span class="preview_palette"><button type="button" style="background:#000000;">색상찾기</button></span>
+									<input id="table_bg_color" name="" type="text" maxlength="7" value="#000000" />
+									<button type="button" class="find_palette"><span>색상찾기</span></button>
+								</dd>
+							</dl>
+						</fieldset>
+						<div class="btn_area">
+							<button type="button" class="confirm" title="확인"><span>확인</span></button>
+							<button type="button" class="cancel" title="취소"><span>취소</span></button>
+						</div>
+					</div>
+					<!-- /표 레이어 -->
+				</li>
+				<li class="character husky_seditor_ui_sCharacter">
+					<button type="button" title="특수문자"><span>특수문자</span></button>
+					<!-- 특수문자 레이어 -->
+					<div class="layer husky_seditor_sCharacter_layer" style="display:none">
+						<h3>특수문자 삽입</h3>
+						<button type="button" class="close" title="특수문자 레이어 닫기"><span>특수문자 레이어 닫기</span></button>
+						<ul class="nav">
+							<li><a href="#character1" class="on">일반기호</a></li>
+							<li><a href="#character2">숫자와 단위</a></li>
+							<li><a href="#character3">원,괄호</a></li>
+							<li><a href="#character4">한글</a></li>
+							<li><a href="#character5">그리스,라틴어</a></li>
+							<li><a href="#character6">일본어</a></li>
+						</ul>
+						<ul style="display: block;" id="character1" class="list"></ul>
+						<ul style="display: none;" id="character2" class="list"></ul>
+						<ul style="display: none;" id="character3" class="list"></ul>
+						<ul style="display: none;" id="character4" class="list"></ul>
+						<ul style="display: none;" id="character5" class="list"></ul>
+						<ul style="display: none;" id="character6" class="list"></ul>
+						<p>
+							<label for="preview">선택한 기호</label>
+							<input id="preview" name="" type="text" />
+							<button type="button" title="확인"><span>확인</span></button>
+						</p>
+						<button type="button" class="close" title="특수문자 레이어 닫기"><span>특수문자 레이어 닫기</span></button>
+					</div>
+					<!-- /특수문자 레이어 -->
+				</li>
+				<li class="find husky_seditor_ui_findAndReplace" >
+					<button type="button" title="찾기"><span>찾기</span></button>
+					<!-- 찾기 바꾸기 레이어 -->
+					<div class="layer find husky_seditor_findAndReplace_layer" style="display:none">
+					<!-- class="layer find" | class="layer replace"-->
+						<h3>찾기/바꾸기</h3>
+						<button type="button" class="close" title="찾기/바꾸기 레이어 닫기"><span>찾기/바꾸기 레이어 닫기</span></button>
+						<div class="menu_tab">
+							<ul class="layer_tab">
+								<li class="tab1"><a href="#find" onclick="return false">찾기</a></li>
+								<li class="tab2"><a href="#replace" onclick="return false">바꾸기</a></li>
+							</ul>
+						</div>
+						<div class="container">
+							<div class="bx" id="find">
+								<fieldset>
+									<label for="keyword1">찾을단어</label>
+									<input id="keyword1" name="" type="text" />
+								</fieldset>
+								<span class="cap"></span> </div>
+							<div class="bx" id="replace">
+								<fieldset>
+									<label for="keyword2">찾을단어</label>
+									<input id="keyword2" name="" type="text" />
+									<br />
+									<label for="keyword3">바꿀단어</label>
+									<input id="keyword3" name="" type="text" />
+								</fieldset>
+							</div>
+						</div>
+						<div class="btn_area">
+							<button type="button" class="find_next" title="다음찾기"><span>다음찾기</span></button>
+							<button type="button" class="replace" title="바꾸기"><span>바꾸기</span></button>
+							<button type="button" class="replace_all" title="모두바꾸기"><span>모두바꾸기</span></button>
+							<button type="button" class="cancel" title="취소"><span>취소</span></button>
+						</div>
+						<button type="button" class="close" title="찾기/바꾸기 레이어 닫기"><span>찾기/바꾸기 레이어 닫기</span></button>
+					</div>
+					<!-- /찾기 바꾸기 레이어 -->
+				</li>
+			</ul>
+			<ul class="img_tool" >
+				<li class="img_ins husky_seditor_ui_ImgInsert">
+					<button type="button" title="그림 삽입" ><span>그림 삽입</span></button>
+					<div class="layer husky_seditor_ImgInsert_layer" style="display:none">
+						<h3>그림 삽입</h3>
+						<button type="button" class="close" title="그림 삽입 닫기"><span>그림 삽입 닫기</span></button>
+						<div class="container">
+							<div class="bx">
+								<fieldset>
+									<label for="img_url">경로</label>
+									<input id="img_url" name="img_url" type="text" value="" />
+									<br />
+									<label for="img_alt">설명</label>
+									<input id="img_alt" name="img_alt" type="text" value="" />
+								</fieldset>
+							</div>
+						</div>
+						<div class="btn_area">
+							<button type="button" class="confirm" title="확인"><span>확인</span></button>
+							<form style="display:inline;margin:0;padding:0;"><span id="spanButtonPlaceholder"></span></form>
+							<button type="button" class="cancel" title="취소"><span>취소</span></button>
+						</div>
+					</div>
+				</li>
+			</ul>
+			<button type="button" class="html husky_seditor_mode_toggle_button" title="HTML 편집기" style="width:45px"><span>HTML</span></button>
+		</div>
+		<hr />
+		<!-- 입력 -->
+		<div class="input_area husky_seditor_editing_area_container" style="min-height:400px;">
+			<iframe src="/smartEditor/se_blank.html" id="husky_iframe" name="husky_iframe" class="input_wysiwyg" frameborder="0" scrolling="yes" title="리치 에디터 - 편집기에서 빠져 나오시려면 ESC키를 누르세요" style="display:block;min-width:1078px;min-height:400px;"></iframe>
+			<textarea name="" rows="10" cols="20" title="HTML 편집 모드" class="input_syntax" style="display:none;">&lt;p&gt;&lt;/p&gt;</textarea>
+			<textarea name="" cols="" rows="" class="blind" title="데이터 전송을 위한 숨은 콘트롤" style="display:none;"></textarea>
+		</div>
+		<button type="button" class="input_control husky_seditor_editingArea_verticalResizer" title="입력창 크기 조절"><span>입력창 크기 조절</span></button>
+	</div>
+</div>
+
+<script type="text/javascript">
+//<![CDATA[
+function paste(url) {
+	$("img_url").value = url;
+}
+//]]>
+</script>
+<script type="text/javascript" src="/smartEditor/swfupload/js/swfupload.js" charset="utf-8"></script>
+<script type="text/javascript" src="/smartEditor/swfupload/js/handlers.js" charset="utf-8"></script>
+<script type="text/javascript">
+//<![CDATA[
+	var swfu;
+	window.onload = function() {
+		var settings = {
+			flash_url : "/smartEditor/swfupload/swf/swfupload.swf",
+			upload_url: "/swfupload_proc.jsp",
+			file_post_name : "Filedata",
+			file_size_limit : "5 MB",
+			file_types : "*.jpg;*.gif;*.jpeg;*.png;*.bmp",
+			file_types_description : "Web Image Files",
+			file_upload_limit : 0,
+			file_queue_limit : 1,
+			debug: false,
+
+			file_queue_error_handler : fileQueueError,
+			file_dialog_complete_handler : fileDialogComplete,
+			upload_error_handler : uploadError,
+			upload_success_handler : uploadSuccess,
+
+			button_image_url : "/smartEditor/swfupload/img/my_img.gif",
+			button_placeholder_id : "spanButtonPlaceholder",
+			button_width: 53,
+			button_height: 21,
+			button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
+			button_cursor: SWFUpload.CURSOR.HAND
+		};
+
+		swfu = new SWFUpload(settings);
+	};
+//]]>
+</script>
+</body>
+</html>

+ 334 - 0
style24.admin/src/main/webapp/smartEditor/css/default.css

@@ -0,0 +1,334 @@
+@charset "utf-8";
+/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) 200812 */
+
+/* Type Selector */
+#smart_editor *{margin:0; padding:0; font-style:normal; font-size:12px; font-family: Dotum, Gulim, AppleGothic, Sans-serif;}
+#smart_editor img,
+#smart_editor fieldset,
+#smart_editor button{ border:0;}
+#smart_editor button{ background:none; background-repeat:no-repeat; cursor:pointer; _cursor /**/:hand;}
+#smart_editor button *{ visibility:hidden;}
+#smart_editor legend{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;}
+#smart_editor label{ cursor:pointer; _cursor /**/:hand;}
+#smart_editor hr{ display:none;}
+#smart_editor li{list-style:none;}
+
+/* Layout Selector */
+#smart_editor{ position:relative; background:#fff;}
+#smart_editor #smart_content{ position:relative; clear:both; margin:0 0 10px 0; border:1px solid #c2c2c2; *zoom:1;}
+#smart_editor #smart_footer{ position:relative; text-align:center; padding:10px 0;}
+
+/* Footer */
+#smart_editor #smart_footer *{ vertical-align:top;}
+#smart_editor #smart_footer button{ position:relative; width:67px; height:25px; margin:0 5px 0 0;}
+#smart_editor #smart_footer button.save_temp{ background:url(../img/btn_save_temp.gif) no-repeat;}
+#smart_editor #smart_footer button.preview{ background:url(../img/btn_preview.gif) no-repeat;}
+#smart_editor #smart_footer input{ margin:0;}
+#smart_editor #smart_footer input.reset{ width:67px; height:25px; border:0; background:url(../img/btn_cancel.gif) no-repeat; cursor:pointer; margin-left:5px;}
+
+/* Content > Input Area */
+#smart_editor a.skip{ position:relative; display:block; top:0; right:0; width:0; height:0; overflow:hidden; clear:both; zoom:1}
+#smart_editor a.skip:hover,
+#smart_editor a.skip:active,
+#smart_editor a.skip:focus{ position:relative; display:block; padding:5px; right:0; z-index:60; width:auto; height:auto; text-align:right; white-space:nowrap; color:#000; text-decoration:none; letter-spacing:-1px; _zoom:1;}
+
+#smart_editor .input_area{ position:relative; margin:10px; z-index:30; *zoom:1; height:400px;}
+#smart_editor .input_area iframe,
+#smart_editor .input_area textarea{ display:block; width:100%; position:relative; height:100%; border:0; overflow:auto;}
+#smart_editor .input_area iframe{}
+#smart_editor .input_area textarea{ *margin:0 -10px; _margin-bottom:-2px;}
+#smart_editor .input_area textarea.blind{ display:none;}
+#smart_editor .input_control{ position:relative; display:block; width:100%; clear:both; text-align:center; background:#fbfbfb url(../img/btn_expand.gif) no-repeat center center; cursor:n-resize;}
+#smart_editor .input_control span{ display:block; height:10px; border-top:1px solid #dfdfdf; visibility:visible; font-size:0; line-height:200%; white-space:nowrap; color:#fff;}
+
+#smart_editor .tool{ position:relative; overflow:visible; padding:5px 0 6px 0; *padding:5px 0 8px 0; z-index:40; clear:both; background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom; border:0; *zoom:1;}
+#smart_editor .tool:after{ content:""; display:block; clear:both;}
+#smart_editor .tool ul{ position:relative; overflow:visible; float:left; margin:0 5px 2px 0; z-index:2;}
+#smart_editor .tool ul.action{ width:43px;}
+#smart_editor .tool ul.type{ width:auto; white-space:nowrap;}
+#smart_editor .tool ul.style{ width:169px; z-index:3;}
+#smart_editor .tool ul.paragraph{ width:169px; z-index:2;}
+#smart_editor .tool ul.extra{ width:91px; z-index:1;}
+#smart_editor .tool ul.img_tool{ width:19px; z-index:1;}/*image button add*/
+#smart_editor .tool li{ position:relative; float:left; left:4px;}
+#smart_editor .tool li button{ width:21px; height:21px; background:url(../img/btn_set.gif) no-repeat 0 0; vertical-align:top;}
+#smart_editor .tool li button span{ position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden;}
+
+#smart_editor .tool li.style button span{ position:relative; display:block; width:auto; height:auto; padding:3px 0 0 5px; visibility:visible; text-align:left; letter-spacing:-1px;}
+#smart_editor .tool .type li{ float:none; display:inline; *top:1px;}
+#smart_editor .tool .type li select{ height:21px; width:62px;}
+#smart_editor .tool .html{ position:relative; right:7px; float:right; width:44px; height:23px; margin:-1px 0; background:url(../img/btn_html.gif) no-repeat 0 0;}
+#smart_editor .tool .html span{ position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden;}
+
+/* Content > Tool > Button Default */
+#smart_editor .tool li.undo button{ width:22px; background-position:0 0;}
+#smart_editor .tool li.redo button{ background-position:-22px 0;}
+#smart_editor .tool li.bold button{ width:22px; background-position:-43px 0;}
+#smart_editor .tool li.underline button{ background-position:-65px 0;}
+#smart_editor .tool li.italic button{ background-position:-86px 0;}
+#smart_editor .tool li.del button{ background-position:-107px 0;}
+#smart_editor .tool li.fcolor button{ background-position:-128px 0;}
+#smart_editor .tool li.bcolor button{ background-position:-149px 0;}
+#smart_editor .tool li.sup button{ background-position:-170px 0;}
+#smart_editor .tool li.sub button{ background-position:-191px 0;}
+#smart_editor .tool li.left button{ width:22px; background-position:-212px 0;}
+#smart_editor .tool li.center button{ background-position:-234px 0;}
+#smart_editor .tool li.right button{ background-position:-255px 0;}
+#smart_editor .tool li.justify button{ background-position:-276px 0;}
+#smart_editor .tool li.ol button{ background-position:-297px 0;}
+#smart_editor .tool li.ul button{ background-position:-318px 0;}
+#smart_editor .tool li.outdent button{ background-position:-339px 0;}
+#smart_editor .tool li.indent button{ background-position:-360px 0;}
+#smart_editor .tool li.blockquote button{ width:22px; background-position:-381px 0;}
+#smart_editor .tool li.url button{ width:26px; background-position:-403px 0;}
+#smart_editor .tool li.table button{ background-position:-429px 0;}
+#smart_editor .tool li.character button{ background-position:-450px 0;}
+#smart_editor .tool li.find button{ background-position:-471px 0;}
+#smart_editor .tool li.img_ins button{ background-position:-492px 0;}/*image button add*/
+#smart_editor .tool .html{ background-position:0 0;}
+
+/* Content > Tool > Button Hover */
+#smart_editor .tool li.undo button.hover{ width:22px; background-position:0 -21px;}
+#smart_editor .tool li.redo button.hover{ background-position:-22px -21px;}
+#smart_editor .tool li.bold button.hover{ width:22px; background-position:-43px -21px;}
+#smart_editor .tool li.underline button.hover{ background-position:-65px -21px;}
+#smart_editor .tool li.italic button.hover{ background-position:-86px -21px;}
+#smart_editor .tool li.del button.hover{ background-position:-107px -21px;}
+#smart_editor .tool li.fcolor button.hover{ background-position:-128px -21px;}
+#smart_editor .tool li.bcolor button.hover{ background-position:-149px -21px;}
+#smart_editor .tool li.sup button.hover{ background-position:-170px -21px;}
+#smart_editor .tool li.sub button.hover{ background-position:-191px -21px;}
+#smart_editor .tool li.left button.hover{ width:22px; background-position:-212px -21px;}
+#smart_editor .tool li.center button.hover{ background-position:-234px -21px;}
+#smart_editor .tool li.right button.hover{ background-position:-255px -21px;}
+#smart_editor .tool li.justify button.hover{ background-position:-276px -21px;}
+#smart_editor .tool li.ol button.hover{ background-position:-297px -21px;}
+#smart_editor .tool li.ul button.hover{ background-position:-318px -21px;}
+#smart_editor .tool li.outdent button.hover{ background-position:-339px -21px;}
+#smart_editor .tool li.indent button.hover{ background-position:-360px -21px;}
+#smart_editor .tool li.blockquote button.hover{ width:22px; background-position:-381px -21px;}
+#smart_editor .tool li.url button.hover{ width:26px; background-position:-403px -21px;}
+#smart_editor .tool li.table button.hover{ background-position:-429px -21px;}
+#smart_editor .tool li.character button.hover{ background-position:-450px -21px;}
+#smart_editor .tool li.find button.hover{ background-position:-471px -21px;}
+#smart_editor .tool li.img_ins button.hover{ background-position:-492px -21px;}/*image button add*/
+#smart_editor .tool .html.hover{ background-position:0 -23px;}
+
+/* Content > Tool > Button Active */
+#smart_editor .tool li.undo button.active{ width:22px; background-position:0 -42px;}
+#smart_editor .tool li.redo button.active{ background-position:-22px -42px;}
+#smart_editor .tool li.bold button.active{ width:22px; background-position:-43px -42px;}
+#smart_editor .tool li.underline button.active{ background-position:-65px -42px;}
+#smart_editor .tool li.italic button.active{ background-position:-86px -42px;}
+#smart_editor .tool li.del button.active{ background-position:-107px -42px;}
+#smart_editor .tool li.fcolor button.active{ background-position:-128px -42px;}
+#smart_editor .tool li.bcolor button.active{ background-position:-149px -42px;}
+#smart_editor .tool li.sup button.active{ background-position:-170px -42px;}
+#smart_editor .tool li.sub button.active{ background-position:-191px -42px;}
+#smart_editor .tool li.left button.active{ width:22px; background-position:-212px -42px;}
+#smart_editor .tool li.center button.active{ background-position:-234px -42px;}
+#smart_editor .tool li.right button.active{ background-position:-255px -42px;}
+#smart_editor .tool li.justify button.active{ background-position:-276px -42px;}
+#smart_editor .tool li.ol button.active{ background-position:-297px -42px;}
+#smart_editor .tool li.ul button.active{ background-position:-318px -42px;}
+#smart_editor .tool li.outdent button.active{ background-position:-339px -42px;}
+#smart_editor .tool li.indent button.active{ background-position:-360px -42px;}
+#smart_editor .tool li.blockquote button.active{ width:22px; background-position:-381px -42px;}
+#smart_editor .tool li.url button.active{ width:26px; background-position:-403px -42px;}
+#smart_editor .tool li.table button.active{ background-position:-429px -42px;}
+#smart_editor .tool li.character button.active{ background-position:-450px -42px;}
+#smart_editor .tool li.find button.active{ background-position:-471px -42px;}
+#smart_editor .tool li.img_ins button.active{ background-position:-492px -42px;}/*image button add*/
+#smart_editor .tool .html.active{ background-position:0 -46px;}
+
+/* Content > Tool > Button Off */
+#smart_editor .tool.off li.undo button,
+#smart_editor .tool li.undo button.off{ width:22px; background-position:0 -63px;}
+#smart_editor .tool.off li.redo button,
+#smart_editor .tool li.redo button.off{ background-position:-22px -63px;}
+#smart_editor .tool.off li.bold button{ width:22px; background-position:-43px -63px;}
+#smart_editor .tool.off li.underline button{ background-position:-65px -63px;}
+#smart_editor .tool.off li.italic button{ background-position:-86px -63px;}
+#smart_editor .tool.off li.del button{ background-position:-107px -63px;}
+#smart_editor .tool.off li.fcolor button{ background-position:-128px -63px;}
+#smart_editor .tool.off li.bcolor button{ background-position:-149px -63px;}
+#smart_editor .tool.off li.sup button{ background-position:-170px -63px;}
+#smart_editor .tool.off li.sub button{ background-position:-191px -63px;}
+#smart_editor .tool.off li.left button{ width:22px; background-position:-212px -63px;}
+#smart_editor .tool.off li.center button{ background-position:-234px -63px;}
+#smart_editor .tool.off li.right button{ background-position:-255px -63px;}
+#smart_editor .tool.off li.justify button{ background-position:-276px -63px;}
+#smart_editor .tool.off li.ol button{ background-position:-297px -63px;}
+#smart_editor .tool.off li.ul button{ background-position:-318px -63px;}
+#smart_editor .tool.off li.outdent button{ background-position:-339px -63px;}
+#smart_editor .tool.off li.indent button{ background-position:-360px -63px;}
+#smart_editor .tool.off li.blockquote button{ width:22px; background-position:-381px -63px;}
+#smart_editor .tool.off li.url button{ width:26px; background-position:-403px -63px;}
+#smart_editor .tool.off li.table button{ background-position:-429px -63px;}
+#smart_editor .tool.off li.character button{ background-position:-450px -63px;}
+#smart_editor .tool.off li.find button{ background-position:-471px -63px;}
+#smart_editor .tool.off li.img_ins button{ background-position:-492px -63px;}/*image button add*/
+#smart_editor .tool.off li button{ cursor:default;}
+#smart_editor .tool.off .html{ background-position:0 -46px;}
+
+/* Content > Tool > Layer */
+#smart_editor .tool .layer{ display:none; position:absolute; left:0; top:20px; background-color:#fbfbfb; border:1px solid #c5c5c5; border-right:1px solid #9f9f9f; border-bottom:1px solid #9f9f9f;}
+#smart_editor .tool .layer li{ float:none; left:0;}
+#smart_editor .tool .layer button{ margin:0 !important; width:auto; height:auto; background:none;}
+#smart_editor .tool .layer button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;}
+#smart_editor .tool .btn_area{ position:relative; clear:both; text-align:center !important; padding:7px 0 12px 0; width:100%; white-space:nowrap; *zoom:1;}
+#smart_editor .tool .btn_area *{ vertical-align:top;}
+#smart_editor .tool button.close{ position:absolute; top:4px; right:3px; width:21px; height:20px; background:url(../img/btn_layer_close.gif) no-repeat center center !important;}
+#smart_editor .tool button.close span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;}
+#smart_editor .tool .layer .btn_area button{ *margin:0 2px !important;}
+#smart_editor .tool .layer .btn_area button.confirm{ width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;}
+#smart_editor .tool .layer .btn_area button.cancel{ width:38px; height:21px; background:url(../img/btn_layer_cancel.gif) no-repeat;}
+
+#smart_editor .tool li.fcolor .layer{ width:218px !important; height:auto !important; background-image:none !important; overflow:hidden;}
+#smart_editor .tool .layer .palette{ width:210px; position:relative; left:7px; padding:8px 0 7px 0; margin:0;}
+#smart_editor .tool .layer .palette li{ float:left; margin:0 1px 1px 0; font-size:0; line-height:0;}
+#smart_editor .tool .layer .palette button{ position:relative; overflow:hidden; width:11px; height:11px;}
+
+#smart_editor .tool li.bcolor .layer { width:218px; overflow:hidden;}
+#smart_editor .tool .layer .background{ width:210px; position:relative; left:7px; margin:0 0 -2px 0; padding:8px 0 0 0; *padding-bottom:8px; _padding-bottom:4px;}
+#smart_editor .tool .layer .background li{ float:left; margin:0 5px 2px 0;}
+#smart_editor .tool .layer .background button{ position:relative; overflow:hidden; width:65px; height:19px; text-align:left; padding:4px;}
+#smart_editor .tool .layer .background button span{ position:relative; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto;}
+
+#smart_editor .tool li.style .layer{ padding:4px 2px; _overflow:hidden; filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2);}
+#smart_editor .tool li.style .layer li{ position:relative; background:#fbfbfb;}
+#smart_editor .tool li.style .layer li button{ display:block; width:134px; position:relative;}
+#smart_editor .tool li.style .layer li button span{ display:block; width:130px; text-align:left; letter-spacing:normal;}
+#smart_editor .tool li.style .layer li.h3 button span{ padding:3px 0 1px 4px; height:15px; _height /**/:19px; font-size:16px; font-weight:bold;}
+#smart_editor .tool li.style .layer li.h4 button span{ padding:3px 0 2px 4px; height:13px; _height /**/:18px; font-size:14px; font-weight:bold;}
+#smart_editor .tool li.style .layer li.h5 button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px; font-weight:bold;}
+#smart_editor .tool li.style .layer li.h6 button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px;}
+#smart_editor .tool li.style .layer li.p button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px; color:#5d5d5d;}
+#smart_editor .tool li.style .layer li button.hover{ background:#c1f471; *height:1%;}
+
+#smart_editor .tool li.blockquote .layer{ padding:6px 5px 6px 7px; left:0; width:288px;}
+#smart_editor .tool li.blockquote .layer ul{ *zoom:1; margin:0;}
+#smart_editor .tool li.blockquote .layer ul:after{ content:""; display:block; clear:both;}
+#smart_editor .tool li.blockquote .layer li{ position:relative; float:left; overflow:hidden; width:32px; height:34px; margin:0 2px 0 0; border:1px solid #cdcecc; background-image:url(../img/btn_qmark.gif); background-repeat:no-repeat;}
+#smart_editor .tool li.blockquote .layer li.q1{ background-position:0 0;}
+#smart_editor .tool li.blockquote .layer li.q2{ background-position:-32px 0;}
+#smart_editor .tool li.blockquote .layer li.q3{ background-position:-64px 0;}
+#smart_editor .tool li.blockquote .layer li.q4{ background-position:-96px 0;}
+#smart_editor .tool li.blockquote .layer li.q5{ background-position:-128px 0;}
+#smart_editor .tool li.blockquote .layer li.q6{ background-position:-160px 0;}
+#smart_editor .tool li.blockquote .layer li.q7{ background-position:-192px 0;}
+#smart_editor .tool li.blockquote .layer li.q8{ background-position:-224px 0;}
+#smart_editor .tool li.blockquote .layer li button{ width:32px; height:34px;}
+
+#smart_editor .tool li.url .layer{ width:231px; height:125px; background-image:url(../img/bx_url.gif); background-repeat:no-repeat; background-position:10px 14px;}
+#smart_editor .tool li.url .layer fieldset{ position:absolute; width:212px; left:10px; top:14px;}
+#smart_editor .tool li.url .layer fieldset h3{ position:absolute; top:-4px; left:15px; color:#404040; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto; background:none; margin:0; padding:0; font-weight:normal;}
+#smart_editor .tool li.url .layer fieldset input.link{ position:absolute; left:12px; top:19px; width:179px; padding:2px 0 1px 6px; *margin:-1px 0; font-size:11px; height:13px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;}
+#smart_editor .tool li.url .layer fieldset p{ position:absolute; left:12px; top:44px;}
+#smart_editor .tool li.url .layer fieldset p input{ width:13px; height:13px; vertical-align:middle; margin-right:3px;}
+#smart_editor .tool li.url .layer .btn_area{ position:absolute; bottom:12px; padding:0;}
+
+#smart_editor .tool li.table .layer{ width:242px; height:239px; background-image:url(../img/bx_table.gif); background-repeat:no-repeat; background-position:10px 14px;}
+#smart_editor .tool li.table .layer fieldset{ position:absolute; width:222px; left:10px;}
+#smart_editor .tool li.table .layer fieldset h3{ position:absolute; top:-4px; left:15px; color:#404040; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto; background:none; margin:0; padding:0; font-weight:normal;}
+
+#smart_editor .tool li.table .layer fieldset dl{ position:absolute; left:10px;}
+#smart_editor .tool li.table .layer fieldset dt{ float:left; padding:3px 0 0 0; height:20px; white-space:nowrap; letter-spacing:-1px;}
+#smart_editor .tool li.table .layer fieldset dd{ float:right; position:relative;}
+#smart_editor .tool li.table .layer fieldset dd button.add,
+#smart_editor .tool li.table .layer fieldset dd button.del{ position:absolute; left:27px; width:15px; height:8px; background:url(../img/btn_layer_cell_adjust.gif) no-repeat;}
+#smart_editor .tool li.table .layer fieldset dd button.add{ top:1px;}
+#smart_editor .tool li.table .layer fieldset dd button.del{ top:9px; background-position:0 -8px;}
+#smart_editor .tool li.table .layer fieldset dd .preview_palette{ display:block; float:left; margin:0 3px 0 0; padding:2px; position:relative; border:1px solid #c8c9c6; width:14px; height:14px; overflow:hidden;}
+#smart_editor .tool li.table .layer fieldset dd .preview_palette button{ width:14px; height:14px; font-size:500px; line-height:0;}
+#smart_editor .tool li.table .layer fieldset dd .find_palette{ width:33px; height:20px; background:url(../img/btn_search.gif) no-repeat;}
+
+#smart_editor .tool li.table .layer fieldset.num{ top:14px;}
+#smart_editor .tool li.table .layer fieldset.num dl{ top:18px; width:60px;}
+#smart_editor .tool li.table .layer fieldset.num dt{ height:20px;}
+#smart_editor .tool li.table .layer fieldset.num dd{ height:23px;}
+#smart_editor .tool li.table .layer fieldset.num dt label{ font-size:11px; color:#333;}
+#smart_editor .tool li.table .layer fieldset.num dd input{ padding:3px 0 0 6px; *margin:-1px 0; width:35px; height:13px; font-size:11px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;}
+
+#smart_editor .tool li.table .layer fieldset.color{ top:96px;}
+#smart_editor .tool li.table .layer fieldset.color dl{ top:18px; width:210px;}
+#smart_editor .tool li.table .layer fieldset.color dt{ height:23px;}
+#smart_editor .tool li.table .layer fieldset.color dd{ height:26px; width:146px;}
+#smart_editor .tool li.table .layer fieldset.color dt label{ font-size:11px; color:#333;}
+#smart_editor .tool li.table .layer fieldset.color dd input{ padding:3px 0 0 6px; *margin:-1px 0; font-size:11px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;}
+#smart_editor .tool li.table .layer fieldset.color dd input#table_border_width{ width:35px; height:13px;}
+#smart_editor .tool li.table .layer fieldset.color dd input#table_border_color,
+#smart_editor .tool li.table .layer fieldset.color dd input#table_bg_color{ width:70px; height:15px; *margin-right:3px;}
+
+#smart_editor .tool li.table .layer table{ position:absolute; top:18px; left:75px; width:137px; height:40px; table-layout:fixed;}
+#smart_editor .tool li.table .layer table *{ font-size:0; line-height:0;}
+#smart_editor .tool li.table .layer table th,
+#smart_editor .tool li.table .layer table td{ text-align:center;}
+#smart_editor .tool li.table .layer .btn_area{ position:absolute; bottom:12px; padding:0; z-index:1;}
+
+#smart_editor .tool li.table .layer .palette{ display:none; position:absolute; z-index:2; left:11px; width:204px; padding:8px 7px 7px 7px; _padding-right:6px; background-color:#fbfbfb; border:1px solid #c5c5c5; border-right:1px solid #9f9f9f; border-bottom:1px solid #9f9f9f;}
+#smart_editor .tool li.table .layer.p1 .palette{ display:block; top:163px;}
+#smart_editor .tool li.table .layer.p2 .palette{ display:block; top:189px;}
+
+#smart_editor .tool li.character .layer{ width:433px; height:242px; overflow:hidden;}
+#smart_editor .tool li.character .layer ul{ margin:0;}
+#smart_editor .tool li.character .layer h3{position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;}
+#smart_editor .tool li.character .layer .nav{ position:absolute; top:11px; left:-1px; overflow:hidden; white-space:nowrap;}
+#smart_editor .tool li.character .layer .nav li{ display:inline; margin:0 -4px 0 0; padding:0 8px; background:url(../img/vr_layer_character.gif) no-repeat 0 0;}
+#smart_editor .tool li.character .layer .nav li a{ color:#444; text-decoration:none; letter-spacing:-1px;}
+#smart_editor .tool li.character .layer .nav li a:hover,
+#smart_editor .tool li.character .layer .nav li a:active,
+#smart_editor .tool li.character .layer .nav li a:focus{ text-decoration:underline;}
+#smart_editor .tool li.character .layer .nav li a.on{ font-weight:bold; color:#004790; display:inline;}
+#smart_editor .tool li.character .layer .list{ position:absolute; left:7px; top:30px; width:421px; height:172px; background:url(../img/bx_character.gif) no-repeat;}
+#smart_editor .tool li.character .layer .list li{ position:relative; top:1px; left:1px; float:left; width:20px; height:18px; margin:0 1px 1px 0;}
+#smart_editor .tool li.character .layer .list li button{ width:20px; height:18px;}
+#smart_editor .tool li.character .layer .list li button.hover{ border:2px solid #27c11a;}
+#smart_editor .tool li.character .layer .list li button span{ overflow:visible; font-size:12px; width:auto; height:auto; position:relative; visibility:visible; line-height:normal;}
+#smart_editor .tool li.character .layer p{ position:absolute; top:212px; left:7px;}
+#smart_editor .tool li.character .layer p *{ vertical-align:top;}
+#smart_editor .tool li.character .layer p label{ position:relative; top:4px; margin:0 7px 0 0; color:#333; letter-spacing:-1px;}
+#smart_editor .tool li.character .layer p input{ padding:3px 0 0 4px; margin:0 4px 0 0; width:300px; _width /**/:306px; height:16px; _height /**/:20px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;}
+#smart_editor .tool li.character .layer p button{ position:relative; *top:1px; width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;}
+#smart_editor .tool li.character .layer p button span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;}
+
+#smart_editor .tool li.find .layer{ width:242px;}
+#smart_editor .tool li.find .layer h3{ background:#f2f2f2; color:#333; height:21px; margin:0 0 11px 0; padding:7px 0 0 5px;}
+#smart_editor .tool li.find .layer .menu_tab{ position:relative; z-index:20; width:100%; *zoom:1;}
+#smart_editor .tool li.find .layer .menu_tab:after{ content:""; display:block; clear:both;}
+#smart_editor .tool li.find .layer .layer_tab{ position:relative; left:10px; padding:0; margin:0; clear:both;}
+#smart_editor .tool li.find .layer .layer_tab li{ position:relative; z-index:1; float:left; margin-right:1px; background:url(../img/btn_layer_tab.gif) no-repeat 0 0;}
+#smart_editor .tool li.find .layer .layer_tab li a{ position:relative; display:block; float:left; left:2px; height:15px; padding:4px 9px 0 5px; color:#404040; text-decoration:none; background:url(../img/btn_layer_tab.gif) no-repeat right 0;}
+#smart_editor .tool li.find .layer.find .layer_tab li.tab1,
+#smart_editor .tool li.find .layer.replace .layer_tab li.tab2{ top:-1px; margin-bottom:-1px;}
+#smart_editor .tool li.find .layer.find .layer_tab li.tab1 a,
+#smart_editor .tool li.find .layer.replace .layer_tab li.tab2 a{ height:18px;}
+#smart_editor .tool li.find .layer .container{ position:relative; z-index:1; clear:both; top:-2px;}
+#smart_editor .tool li.find .layer .container .bx{ display:none; position:relative; width:222px; left:10px; clear:both; z-index:1; background:url(../img/bx_find.gif) no-repeat;}
+#smart_editor .tool li.find .layer.find .container #find,
+#smart_editor .tool li.find .layer.replace .container #replace{ display:block;}
+
+#smart_editor .tool li.find .layer .bx fieldset{ position:relative; padding:13px 0 17px 11px;}
+#smart_editor .tool li.find .layer .bx fieldset *{ vertical-align:top;}
+#smart_editor .tool li.find .layer .bx label{ position:relative; top:4px; margin:0 7px 0 0; font-size:11px; letter-spacing:-1px; color:#333;}
+#smart_editor .tool li.find .layer .bx input{ padding:3px 0 0 4px; width:144px; _width /**/:150px; height:14px; _height /**/:19px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;}
+#smart_editor .tool li.find .layer .bx .cap{ position:absolute; left:0; bottom:0; display:block; width:222px; height:2px; _margin:0 0 -1px 0; overflow:hidden; background:#fff url(../img/bx_find.gif) no-repeat left bottom; font-size:0; line-height:0;}
+#smart_editor .tool li.find .layer .bx#replace fieldset{ height:45px; _height /**/:75px;}
+#smart_editor .tool li.find .layer .bx#replace fieldset #keyword2{ margin-bottom:6px;}
+#smart_editor .tool li.find .layer .btn_area button{ display:none; *margin:0 2px !important;}
+#smart_editor .tool li.find .layer.find .btn_area .find_next{ display:inline; width:62px; height:21px; background:url(../img/btn_layer_find_next_strong.gif) no-repeat;}
+#smart_editor .tool li.find .layer.replace .btn_area .find_next{ display:inline; width:55px; height:21px; background:url(../img/btn_layer_find_next.gif) no-repeat;}
+#smart_editor .tool li.find .layer.replace .btn_area .replace{ display:inline; width:48px; height:21px; background:url(../img/btn_layer_replace.gif) no-repeat;}
+#smart_editor .tool li.find .layer.replace .btn_area .replace_all{ display:inline; width:69px; height:21px; background:url(../img/btn_layer_replace_all.gif) no-repeat;}
+#smart_editor .tool li.find .layer .btn_area .cancel{ display:inline;}
+
+/*image button add*/
+#smart_editor .tool li.img_ins .layer{ width:242px;}
+#smart_editor .tool li.img_ins .layer h3{ background:#f2f2f2; color:#333; height:21px; margin:0 0 11px 0; padding:7px 0 0 5px;}
+#smart_editor .tool li.img_ins .layer .bx fieldset{ position:relative; padding:13px 0 17px 11px;}
+#smart_editor .tool li.img_ins .layer .bx fieldset *{ vertical-align:top;}
+#smart_editor .tool li.img_ins .layer .bx label{ position:relative; top:4px; margin:0 7px 0 0; font-size:11px; letter-spacing:-1px; color:#333;}
+#smart_editor .tool li.img_ins .layer .bx input{ padding:3px 0 0 4px; width:184px; _width /**/:190px; height:14px; _height /**/:19px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;}
+#smart_editor .tool li.img_ins .layer .bx fieldset{ height:45px; _height /**/:75px;}
+#smart_editor .tool li.img_ins .layer .bx fieldset #img_url{ margin-bottom:6px;}
+#smart_editor .tool li.img_ins .layer .btn_area .my_img_upload{ display:inline; width:53px; height:21px; background:url(../img/btn_layer_img.gif) no-repeat;}

+ 30 - 0
style24.admin/src/main/webapp/smartEditor/css/style.css

@@ -0,0 +1,30 @@
+@charset "utf-8";
+/* NHN > UIT Center > Open UI Technology Team > Jeong Chan Myeong(dece24@nhncorp.com) 200812 */
+
+html,
+body{ height:100%;}
+
+#smartInput{ margin:0 10px 0 0;}
+.smartOutput{ font-size:12px; line-height:1.6; font-family:Dotum, AppleGothic, Sans-serif;} /* 스마트 에디터의 풍부한 표현이 정상적으로 출력되도록 하려면 콘텐츠가 출력되는 곳에 이 클래스를 적용하여야 한다. 예를 들면 게시물 읽기 페이지의 본문이 이에 해당된다. */
+
+.smartOutput p{ margin-top:7px; margin-bottom:7px;}
+
+.smartOutput blockquote.q1,
+.smartOutput blockquote.q2,
+.smartOutput blockquote.q3,
+.smartOutput blockquote.q4,
+.smartOutput blockquote.q5,
+.smartOutput blockquote.q6,
+.smartOutput blockquote.q7{ padding:10px; margin-left:15px; margin-right:15px;}
+
+.smartOutput blockquote.q1{ padding:0 10px; border-left:2px solid #ccc;}
+.smartOutput blockquote.q2{ padding:0 10px; background:url(../img/bg_qmark.gif) no-repeat;}
+.smartOutput blockquote.q3{ border:1px solid #d9d9d9;}
+.smartOutput blockquote.q4{ border:1px solid #d9d9d9; background:#fbfbfb;}
+.smartOutput blockquote.q5{ border:2px solid #707070;}
+.smartOutput blockquote.q6{ border:1px dashed #707070;}
+.smartOutput blockquote.q7{ border:1px dashed #707070; background:#fbfbfb;}
+
+.smartOutput sup{ font:10px Tahoma;}
+.smartOutput sub{ font:10px Tahoma;}
+.smartOutput table td{ padding:4px;}

BIN
style24.admin/src/main/webapp/smartEditor/img/XPButtonUploadText_61x22.png


BIN
style24.admin/src/main/webapp/smartEditor/img/bg_qmark.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/bg_tool.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_confirm.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_expand.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_html.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_cancel.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_cell_adjust.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_close.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_confirm.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_find_next.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_find_next_strong.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_img.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_replace.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_replace_all.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_layer_tab.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_qmark.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_search.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_set.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_set_blank.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/btn_set_original.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/bx_character.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/bx_find.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/bx_table.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/bx_url.gif


BIN
style24.admin/src/main/webapp/smartEditor/img/vr_layer_character.gif


Файловите разлики са ограничени, защото са твърде много
+ 109 - 0
style24.admin/src/main/webapp/smartEditor/js/Husky.SE_Basic.js


+ 126 - 0
style24.admin/src/main/webapp/smartEditor/js/HuskyEZCreator.js

@@ -0,0 +1,126 @@
+if(typeof window.nhn=='undefined') window.nhn = {};
+if (!nhn.husky) nhn.husky = {};
+
+/**
+ * @fileOverview This file contains application creation helper function, which would load up an HTML(Skin) file and then execute a specified create function.
+ * @name HuskyEZCreator.js
+ */
+nhn.husky.EZCreator = new (function(){
+	this.nBlockerCount = 0;
+
+	this.createInIFrame = function(htOptions){
+		if(arguments.length == 1){
+			var oAppRef = htOptions.oAppRef;
+			var elPlaceHolder = htOptions.elPlaceHolder;
+			var sSkinURI = htOptions.sSkinURI;
+			var fCreator = htOptions.fCreator;
+			var fOnAppLoad = htOptions.fOnAppLoad;
+			var bUseBlocker = htOptions.bUseBlocker;
+			var htParams = htOptions.htParams;
+		}else{
+			// for backward compatibility only
+			var oAppRef = arguments[0];
+			var elPlaceHolder = arguments[1];
+			var sSkinURI = arguments[2];
+			var fCreator = arguments[3];
+			var fOnAppLoad = arguments[4];
+			var bUseBlocker = arguments[5];
+			var htParams = arguments[6];
+		}
+
+		if(bUseBlocker) nhn.husky.EZCreator.showBlocker();
+
+		var attachEvent = function(elNode, sEvent, fHandler){
+			if(elNode.addEventListener){
+				elNode.addEventListener(sEvent, fHandler, false);
+			}else{
+				elNode.attachEvent("on"+sEvent, fHandler);
+			}
+		}
+
+		if(!elPlaceHolder){
+			alert("Placeholder is required!");
+			return;
+		}
+
+		if(typeof(elPlaceHolder) != "object")
+			elPlaceHolder = document.getElementById(elPlaceHolder);
+
+		var elIFrame;
+		try{
+			elIFrame = document.createElement("<IFRAME id='the_iframe' frameborder=0 scrolling=no'>");
+		}catch(e){
+			elIFrame = document.createElement("IFRAME");
+			elIFrame.setAttribute("id", "the_iframe");
+//			elIFrame.setAttribute("onload", "calcHeight()");
+			elIFrame.setAttribute("frameborder", "0");
+			elIFrame.setAttribute("scrolling", "no");
+		}
+		elIFrame.style.width = "1px";
+		elIFrame.style.height = "1px";
+		elIFrame.style.minHeight = "467px";
+
+		elPlaceHolder.parentNode.insertBefore(elIFrame, elPlaceHolder.nextSibling);
+
+		attachEvent(elIFrame, "load", function(){
+			fCreator = elIFrame.contentWindow[fCreator] || elIFrame.contentWindow.createSEditorInIFrame;
+
+			try{
+				elIFrame.contentWindow.document.body.style.margin = "0";
+				elIFrame.contentWindow.document.body.style.padding = "1";
+			}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(elIFrame, elPlaceHolder, htParams);
+			oApp.elPlaceHolder = elPlaceHolder;
+
+			oAppRef[oAppRef.length] = oApp;
+			if(!oAppRef.getById) oAppRef.getById = {};
+
+			if(elPlaceHolder.id){
+				oApp.sAppId = elPlaceHolder.id;
+				oAppRef.getById[elPlaceHolder.id] = oApp;
+			}
+			oApp.run({fnOnAppReady:fOnAppLoad});
+
+			nhn.husky.EZCreator.hideBlocker();
+		});
+
+		elIFrame.src = sSkinURI;
+	};
+
+	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";
+	}
+})();

+ 80 - 0
style24.admin/src/main/webapp/smartEditor/js/SE_CustomPlugins.js

@@ -0,0 +1,80 @@
+function SE_RegisterCustomPlugins(oEditor, elAppContainer){
+//	oEditor.registerPlugin(new nhn.husky.SE_ToolbarToggler(elAppContainer));
+	oEditor.registerPlugin(new nhn.husky.SE_ImgInsert(elAppContainer));
+}
+
+// Sample plugin. Use CTRL+T to toggle the toolbar
+nhn.husky.SE_ToolbarToggler = $Class({
+	name : "SE_ToolbarToggler",
+
+	$init : function(oAppContainer){
+		this._assignHTMLObjects(oAppContainer);
+	},
+
+	_assignHTMLObjects : function(oAppContainer){
+		oAppContainer = $(oAppContainer) || document;
+		this.toolbarArea = cssquery.getSingle(".tool", oAppContainer);
+	},
+
+	$ON_MSG_APP_READY : function(){
+		this.oApp.exec("SE_TOGGLE_TOOLBAR", []);
+		this.oApp.exec("REGISTER_HOTKEY", ["ctrl+t", "SE_TOGGLE_TOOLBAR", []]);
+	},
+
+	$ON_SE_TOGGLE_TOOLBAR : function(){
+		this.toolbarArea.style.display = (this.toolbarArea.style.display == "none")?"block":"none";
+		this.oApp.exec("MSG_EDITING_AREA_SIZE_CHANGED", []);
+	}
+});
+
+//image insertion plugin (by gojeong)
+nhn.husky.SE_ImgInsert = $Class({
+	name : "SE_ImgInsert",
+
+	$init : function(elAppContainer){
+		this._assignHTMLObjects(elAppContainer);
+	},
+
+	_assignHTMLObjects : function(elAppContainer){
+		this.oImageInsertLayer = cssquery.getSingle("DIV.husky_seditor_ImgInsert_layer", elAppContainer);
+		this.oBtnConfirm = cssquery.getSingle("BUTTON.confirm", this.oImageInsertLayer);
+		this.oBtnCancel = cssquery.getSingle("BUTTON.cancel", this.oImageInsertLayer);
+		this.oBtnClose = cssquery.getSingle("BUTTON.close", this.oImageInsertLayer);
+
+		var oTmp = cssquery("INPUT", this.oImageInsertLayer);
+		this.oUrlInput = oTmp[0];
+		this.oAltInput = oTmp[1];
+	},
+
+	$ON_MSG_APP_READY : function(){
+		this.oApp.exec("REGISTER_UI_EVENT", ["ImgInsert", "click", "SE_TOGGLE_IMGINSERT_LAYER"]);
+		this.oApp.registerBrowserEvent(this.oBtnConfirm, "mousedown", "SE_APPLY_IMAGEINSERT");
+		this.oApp.registerBrowserEvent(this.oBtnCancel, "mousedown", "SE_CLOSE_IMAGEINSERT");
+		this.oApp.registerBrowserEvent(this.oBtnClose, "mousedown", "SE_CLOSE_IMAGEINSERT");
+	},
+
+	$ON_SE_APPLY_IMAGEINSERT : function() {
+		var sURL = this.oUrlInput.value;
+		this.oSelection = this.oApp.getSelection();
+		if (sURL != "") {
+			var str = "<img src='" + sURL + "' alt='" + this.oAltInput.value + "' />";
+			this.oSelection.pasteHTML(str);
+			this.oUrlInput.value = "";
+			this.oAltInput.value = "";
+			this.oApp.exec("HIDE_ACTIVE_LAYER");
+		} else {
+			alert("input file path!");
+			this.oUrlInput.focus();
+		}
+	},
+
+	$ON_SE_CLOSE_IMAGEINSERT : function() {
+		this.oUrlInput.value = "";
+		this.oAltInput.value = "";
+		this.oApp.exec("HIDE_ACTIVE_LAYER");
+	},
+
+	$ON_SE_TOGGLE_IMGINSERT_LAYER : function(){
+		this.oApp.exec("TOGGLE_TOOLBAR_ACTIVE_LAYER", [this.oImageInsertLayer]);
+	}
+});

Файловите разлики са ограничени, защото са твърде много
+ 172 - 0
style24.admin/src/main/webapp/smartEditor/js/jindo.min.js


+ 10 - 0
style24.admin/src/main/webapp/smartEditor/se_blank.html

@@ -0,0 +1,10 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Smart Editor&#8482; WYSIWYG Mode [반드시 필요한 에디터의 빈 페이지 파일 입니다]</title>
+<link href="/smartEditor/css/style.css" rel="stylesheet" type="text/css" />
+<!-- <link rel="stylesheet" type="text/css" href="/ux/css/sisunfront/css_ko.css"/> -->
+</head>
+<body id="smartInput" class="smartOutput">
+</body>
+</html>

BIN
style24.admin/src/main/webapp/smartEditor/swfupload/img/my_img.gif


+ 49 - 0
style24.admin/src/main/webapp/smartEditor/swfupload/js/handlers.js

@@ -0,0 +1,49 @@
+function fileDialogComplete(numFilesSelected, numFilesQueued) {
+	try {
+		if (numFilesQueued > 0) {
+			this.startUpload();
+		}
+	} catch (ex) {
+		this.debug(ex);
+	}
+}
+
+function uploadSuccess(file, serverData) {
+	try {
+		if (serverData.substring(0, 7) === "FILENM:") {
+			paste(serverData.substring(7));
+		} else {
+			alert(serverData);
+		}
+	} catch (ex) {
+		this.debug(ex);
+	}
+}
+
+function fileQueueError(file, errorCode, message) {
+	try {
+		if (errorCode == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
+			alert("한 번에 최대 " + swfu.getSetting("file_queue_limit") + "개 파일을 올릴 수 있습니다.");
+		} else if (errorCode == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE) {
+			alert("파일 크기가 0입니다.");
+		} else if (errorCode == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT) {
+			alert("파일 크기는 최대 " + swfu.getSetting("file_size_limit") + "를 넘을 수 없습니다.");
+		} else if (errorCode == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE) {
+			alert("허용되지 않는 파일 형식입니다.");
+		} 
+	} catch (ex) {
+		this.debug(ex);
+	}
+}
+
+function uploadError(file, errorCode, message) {
+	try {
+		if (errorCode == SWFUpload.QUEUE_ERROR.UPLOAD_LIMIT_EXCEEDED) {
+			alert("총 최대 " + swfu.getSetting("file_upload_limit") + "개 파일만 올릴 수 있습니다.");
+		} else {
+			alert("업로드에 실패했습니다.");
+		} 
+	} catch (ex) {
+		this.debug(ex);
+	}
+}

+ 980 - 0
style24.admin/src/main/webapp/smartEditor/swfupload/js/swfupload.js

@@ -0,0 +1,980 @@
+/**
+ * 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�n 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;
+
+	// Make sure an element with the ID we are going to use doesn't already exist
+	if (document.getElementById(this.movieName) !== null) {
+		throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
+	}
+
+	// Get the element where we will be placing the flash movie
+	targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
+
+	if (targetElement == undefined) {
+		throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
+	}
+
+	// Append the container and load the flash
+	tempParent = document.createElement("div");
+	tempParent.innerHTML = this.getFlashHTML();	// Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
+	targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
+
+	// Fix IE Flash/Form bug
+	if (window[this.movieName] == undefined) {
+		window[this.movieName] = this.getMovieElement();
+	}
+	
+};
+
+// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
+SWFUpload.prototype.getFlashHTML = function () {
+	// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
+	return ['<object id="', this.movieName, '" type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">',
+				'<param name="wmode" value="', this.settings.button_window_mode, '" />',
+				'<param name="movie" value="', this.settings.flash_url, '" />',
+				'<param name="quality" value="high" />',
+				'<param name="menu" value="false" />',
+				'<param name="allowScriptAccess" value="always" />',
+				'<param name="flashvars" value="' + this.getFlashVars() + '" />',
+				'</object>'].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),
+			"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
+			"&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
+			"&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
+			"&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
+			"&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
+			"&amp;params=", encodeURIComponent(paramString),
+			"&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
+			"&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
+			"&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
+			"&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
+			"&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
+			"&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
+			"&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
+			"&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
+			"&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
+			"&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
+			"&amp;buttonText=", encodeURIComponent(this.settings.button_text),
+			"&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
+			"&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
+			"&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
+			"&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
+			"&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
+			"&amp;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&amp;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("&amp;");
+};
+
+// 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('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
+		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);
+	}
+};

BIN
style24.admin/src/main/webapp/smartEditor/swfupload/swf/swfupload.swf


+ 41 - 0
style24.admin/src/main/webapp/smartEditor/swfupload/swfupload_proc.jsp

@@ -0,0 +1,41 @@
+<%@ page language="java" contentType="text/html;charset=utf-8" %>
+<%@ page import="com.gagaframework.web.util.GagaFileUtil" %>
+<%@ page import="com.oreilly.servlet.MultipartRequest" %>
+<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
+
+<%
+    String contentType = request.getContentType();
+    if (contentType == null || !contentType.startsWith("multipart/form-data")) {
+        return;
+    }
+
+    String serverType = System.getProperty("spring.profiles.active");
+    String seUploadPath = "";
+    String seViewUrl = "";
+
+    if (serverType.equals("locd") || serverType.equals("locp")) {
+        seUploadPath = "/WIDE/workspace/files/data/smartEditor";
+        seViewUrl = "//ldimage.pastelmall.com";
+    } else if (serverType.equals("dev")) {
+        seUploadPath = "/data/files/smartEditor";
+        seViewUrl = "//" + serverType + ".image.pastelmall.com";
+    } else if (serverType.equals("qas") || serverType.equals("run")) {
+        seUploadPath = "/data/files/smartEditor";
+        seViewUrl = "//image.pastelmall.com";
+    }
+
+    System.out.println("seUploadPath: " + seUploadPath);
+    System.out.println("seViewUrl: " + seViewUrl);
+
+    MultipartRequest multipartRequest = new MultipartRequest(request
+            , seUploadPath
+            , 50000000
+            , "utf-8"
+            , new DefaultFileRenamePolicy()
+    );
+
+    String objImage = GagaFileUtil.getConcatenationPath(seViewUrl, "smartEditor", multipartRequest.getFilesystemName("Filedata"));
+    System.out.println("objImage: " + objImage);
+
+    out.clear();
+%>FILENM:<%=objImage%>

+ 34 - 0
style24.admin/src/main/webapp/smartEditor/write.html

@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head></head>
+<body>
+
+<script type="text/javascript" src="js/HuskyEZCreator.js" charset="utf-8"></script>
+
+<form action="" method="post">
+	<textarea name="content" id="content" style="width:900px; height:300px;"></textarea>
+	<p>
+		<input type="button" onclick="javascript:_onSubmit(this)" value="submit"></input>
+	</p>
+</form>
+
+<script type="text/javascript">
+var oEditors = [];
+nhn.husky.EZCreator.createInIFrame({
+	oAppRef: oEditors,
+	elPlaceHolder: "content",
+	sSkinURI: "SEditorSkin.html",
+	fCreator: "createSEditorInIFrame"
+});
+
+function _onSubmit(elClicked) {
+	oEditors.getById["content"].exec("UPDATE_IR_FIELD", []);
+	alert($('content').value);
+	try {
+		//elClicked.form.submit();
+	} catch (e) {}
+}
+</script>
+
+</body>
+</html>

Някои файлове не бяха показани, защото твърде много файлове са промени