smart_editor 0.0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/javascripts/smart_editor/application.js +15 -0
  5. data/app/assets/javascripts/smart_editor/editor_images.js +1 -0
  6. data/app/assets/stylesheets/smart_editor/application.css +13 -0
  7. data/app/assets/stylesheets/smart_editor/editor_images.css +4 -0
  8. data/app/controllers/smart_editor/application_controller.rb +4 -0
  9. data/app/controllers/smart_editor/editor_images_controller.rb +41 -0
  10. data/app/helpers/smart_editor/application_helper.rb +4 -0
  11. data/app/helpers/smart_editor/editor_images_helper.rb +4 -0
  12. data/app/models/smart_editor/editor_image.rb +7 -0
  13. data/app/uploaders/file_uploader.rb +55 -0
  14. data/app/views/layouts/smart_editor/application.html.erb +14 -0
  15. data/app/views/smart_editor/editor_images/index.html.erb +4 -0
  16. data/config/routes.rb +7 -0
  17. data/db/migrate/20130101074444_create_smart_editor_editor_images.rb +10 -0
  18. data/lib/generators/smart_editor/smart_editor_generator.rb +18 -0
  19. data/lib/generators/smart_editor/templates/public/smart_editor/SmartEditor2Skin.html +635 -0
  20. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/FileUploader.php +22 -0
  21. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/FileUploader_html5.php +25 -0
  22. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/Photo_Quick_UploadPopup.html +100 -0
  23. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/QuickPhotoPopup.js +675 -0
  24. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/callback.html +32 -0
  25. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/jindo.min.js +12686 -0
  26. data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/jindo_fileUpload.js +390 -0
  27. data/lib/generators/smart_editor/templates/public/smart_editor/smart_editor2_inputarea.html +9 -0
  28. data/lib/generators/smart_editor/templates/public/smart_editor/smart_editor2_inputarea_ie8.html +10 -0
  29. data/lib/smart_editor/class_methods.rb +10 -0
  30. data/lib/smart_editor/engine.rb +5 -0
  31. data/lib/smart_editor/form_builder.rb +11 -0
  32. data/lib/smart_editor/version.rb +3 -0
  33. data/lib/smart_editor.rb +18 -0
  34. data/lib/tasks/smart_editor_tasks.rake +4 -0
  35. data/test/dummy/README.rdoc +261 -0
  36. data/test/dummy/Rakefile +7 -0
  37. data/test/dummy/app/assets/javascripts/application.js +16 -0
  38. data/test/dummy/app/assets/javascripts/posts.js +2 -0
  39. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  40. data/test/dummy/app/assets/stylesheets/posts.css +4 -0
  41. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  42. data/test/dummy/app/controllers/application_controller.rb +3 -0
  43. data/test/dummy/app/controllers/posts_controller.rb +85 -0
  44. data/test/dummy/app/helpers/application_helper.rb +2 -0
  45. data/test/dummy/app/helpers/posts_helper.rb +2 -0
  46. data/test/dummy/app/models/post.rb +4 -0
  47. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  48. data/test/dummy/app/views/posts/_form.html.erb +30 -0
  49. data/test/dummy/app/views/posts/edit.html.erb +6 -0
  50. data/test/dummy/app/views/posts/index.html.erb +27 -0
  51. data/test/dummy/app/views/posts/new.html.erb +5 -0
  52. data/test/dummy/app/views/posts/show.html.erb +20 -0
  53. data/test/dummy/config/application.rb +59 -0
  54. data/test/dummy/config/boot.rb +10 -0
  55. data/test/dummy/config/database.yml +25 -0
  56. data/test/dummy/config/environment.rb +5 -0
  57. data/test/dummy/config/environments/development.rb +37 -0
  58. data/test/dummy/config/environments/production.rb +67 -0
  59. data/test/dummy/config/environments/test.rb +37 -0
  60. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  61. data/test/dummy/config/initializers/inflections.rb +15 -0
  62. data/test/dummy/config/initializers/mime_types.rb +5 -0
  63. data/test/dummy/config/initializers/secret_token.rb +7 -0
  64. data/test/dummy/config/initializers/session_store.rb +8 -0
  65. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  66. data/test/dummy/config/locales/en.yml +5 -0
  67. data/test/dummy/config/routes.rb +7 -0
  68. data/test/dummy/config.ru +4 -0
  69. data/test/dummy/db/development.sqlite3 +0 -0
  70. data/test/dummy/db/migrate/20130103085542_create_posts.rb +11 -0
  71. data/test/dummy/db/migrate/20130103090021_create_smart_editor_editor_images.smart_editor.rb +11 -0
  72. data/test/dummy/db/schema.rb +32 -0
  73. data/test/dummy/log/development.log +713 -0
  74. data/test/dummy/public/404.html +26 -0
  75. data/test/dummy/public/422.html +26 -0
  76. data/test/dummy/public/500.html +25 -0
  77. data/test/dummy/public/favicon.ico +0 -0
  78. data/test/dummy/public/smart_editor/SmartEditor2Skin.html +635 -0
  79. data/test/dummy/public/smart_editor/popup/quick_photo/FileUploader.php +22 -0
  80. data/test/dummy/public/smart_editor/popup/quick_photo/FileUploader_html5.php +25 -0
  81. data/test/dummy/public/smart_editor/popup/quick_photo/Photo_Quick_UploadPopup.html +100 -0
  82. data/test/dummy/public/smart_editor/popup/quick_photo/QuickPhotoPopup.js +675 -0
  83. data/test/dummy/public/smart_editor/popup/quick_photo/callback.html +32 -0
  84. data/test/dummy/public/smart_editor/popup/quick_photo/jindo.min.js +12686 -0
  85. data/test/dummy/public/smart_editor/popup/quick_photo/jindo_fileUpload.js +390 -0
  86. data/test/dummy/public/smart_editor/smart_editor2_inputarea.html +9 -0
  87. data/test/dummy/public/smart_editor/smart_editor2_inputarea_ie8.html +10 -0
  88. data/test/dummy/script/rails +6 -0
  89. data/test/dummy/test/fixtures/posts.yml +11 -0
  90. data/test/dummy/test/functional/posts_controller_test.rb +49 -0
  91. data/test/dummy/test/unit/helpers/posts_helper_test.rb +4 -0
  92. data/test/dummy/test/unit/post_test.rb +7 -0
  93. data/test/dummy/tmp/cache/assets/C39/A20/sprockets%2Fd75302feb7958c52568020a888775667 +0 -0
  94. data/test/dummy/tmp/cache/assets/C8B/9F0/sprockets%2F42090f88c5061f72460d7c83a9bc8990 +0 -0
  95. data/test/dummy/tmp/cache/assets/C8E/A60/sprockets%2F74b1945f4d4a322ab567f73798c32838 +0 -0
  96. data/test/dummy/tmp/cache/assets/CD4/040/sprockets%2F7c241e3470f7210ab843c109c9d68a4b +0 -0
  97. data/test/dummy/tmp/cache/assets/CE3/740/sprockets%2F200278c67b4dde839345d7b018fed561 +0 -0
  98. data/test/dummy/tmp/cache/assets/CEE/680/sprockets%2F6d653ad72aed952816dd79e63c761417 +0 -0
  99. data/test/dummy/tmp/cache/assets/D12/CA0/sprockets%2Fcd507925f6bb1f62170d028ca668ad98 +0 -0
  100. data/test/dummy/tmp/cache/assets/D13/8A0/sprockets%2Fec89fa303e9609b18f50b6de2831433e +0 -0
  101. data/test/dummy/tmp/cache/assets/D6F/A80/sprockets%2F8893ca0d5d16eb3d85c0964bdbbe3381 +0 -0
  102. data/test/dummy/tmp/cache/assets/D86/AF0/sprockets%2Fcfa5f1244012fcd263cee551afe412b2 +0 -0
  103. data/test/dummy/tmp/cache/assets/D92/5A0/sprockets%2Fb0e45a13b900ecbf7011b78bdff2595e +0 -0
  104. data/test/dummy/tmp/cache/assets/D9D/950/sprockets%2F65093fff17b1aa3bed7e0dda53563b79 +0 -0
  105. data/test/dummy/tmp/cache/assets/DF9/8C0/sprockets%2Fc27a71cbee6a5dffdc2534b267b2fa66 +0 -0
  106. data/test/dummy/tmp/cache/assets/E54/F60/sprockets%2Ff1bba5cc065ebbb83addfbba59f82059 +0 -0
  107. data/test/fixtures/smart_editor/editor_images.yml +11 -0
  108. data/test/functional/smart_editor/editor_images_controller_test.rb +9 -0
  109. data/test/integration/navigation_test.rb +10 -0
  110. data/test/smart_editor_test.rb +7 -0
  111. data/test/test_helper.rb +15 -0
  112. data/test/unit/helpers/smart_editor/editor_images_helper_test.rb +6 -0
  113. data/test/unit/smart_editor/editor_image_test.rb +9 -0
  114. data/vendor/assets/images/smart_editor/bg_b1.png +0 -0
  115. data/vendor/assets/images/smart_editor/bg_find_h3.gif +0 -0
  116. data/vendor/assets/images/smart_editor/bg_line1.gif +0 -0
  117. data/vendor/assets/images/smart_editor/bg_quote2.gif +0 -0
  118. data/vendor/assets/images/smart_editor/bg_set.gif +0 -0
  119. data/vendor/assets/images/smart_editor/bg_tool2.gif +0 -0
  120. data/vendor/assets/images/smart_editor/btn_set.png +0 -0
  121. data/vendor/assets/images/smart_editor/bx_set_110302.gif +0 -0
  122. data/vendor/assets/images/smart_editor/editor_guideline_698.gif +0 -0
  123. data/vendor/assets/images/smart_editor/editor_guideline_890.gif +0 -0
  124. data/vendor/assets/images/smart_editor/icon_set.gif +0 -0
  125. data/vendor/assets/images/smart_editor/photoQuickPopup/bg_drag_image.png +0 -0
  126. data/vendor/assets/images/smart_editor/photoQuickPopup/btn_cancel.png +0 -0
  127. data/vendor/assets/images/smart_editor/photoQuickPopup/btn_confirm.png +0 -0
  128. data/vendor/assets/images/smart_editor/photoQuickPopup/btn_confirm2.png +0 -0
  129. data/vendor/assets/images/smart_editor/photoQuickPopup/btn_del.png +0 -0
  130. data/vendor/assets/images/smart_editor/photoQuickPopup/btn_find.png +0 -0
  131. data/vendor/assets/images/smart_editor/text_tool_set.png +0 -0
  132. data/vendor/assets/images/smart_editor/text_tool_set2.png +0 -0
  133. data/vendor/assets/javascripts/smart_editor/HuskyEZCreator.js +133 -0
  134. data/vendor/assets/javascripts/smart_editor/SE2B_Configuration.js +77 -0
  135. data/vendor/assets/javascripts/smart_editor/SE2BasicCreator.js +85 -0
  136. data/vendor/assets/javascripts/smart_editor/hp_SE2M_AttachQuickPhoto.js +106 -0
  137. data/vendor/assets/javascripts/smart_editor/jindo.min.js +12699 -0
  138. data/vendor/assets/javascripts/smart_editor/jindo_component.js +279 -0
  139. data/vendor/assets/javascripts/smart_editor/loader-min.js +120 -0
  140. data/vendor/assets/javascripts/smart_editor.js +21 -0
  141. data/vendor/assets/stylesheets/smart_editor/smart_editor2.css +262 -0
  142. data/vendor/assets/stylesheets/smart_editor/smart_editor2_in.css +20 -0
  143. data/vendor/assets/stylesheets/smart_editor/smart_editor2_items.css +454 -0
  144. data/vendor/assets/stylesheets/smart_editor/smart_editor2_out.css +24 -0
  145. metadata +331 -0
@@ -0,0 +1,675 @@
1
+ //변수 선언 및 초기화
2
+ var nImageInfoCnt = 0;
3
+ var htImageInfo = []; //image file정보 저장
4
+ var aResult = [];
5
+
6
+ var rFilter = /^(image\/bmp|image\/gif|image\/jpg|image\/jpeg|image\/png)$/i;
7
+ var rFilter2 = /^(bmp|gif|jpg|jpeg|png)$/i;
8
+ var nTotalSize = 0;
9
+ var nMaxImageSize = 10*1024*1024;
10
+ var nMaxTotalImageSize = 50*1024*1024;
11
+ var nMaxImageCount = 10;
12
+ var nImageFileCount = 0;
13
+ var bSupportDragAndDropAPI = false;
14
+ var oFileUploader;
15
+ var bAttachEvent = false;
16
+
17
+ //마크업에 따른 할당
18
+ var elContent= $("pop_content");
19
+ var elDropArea = jindo.$$.getSingle(".drag_area",elContent);
20
+ var elDropAreaUL = jindo.$$.getSingle(".lst_type",elContent);
21
+ var elCountTxtTxt = jindo.$$.getSingle("#imageCountTxt",elContent);
22
+ var elTotalSizeTxt = jindo.$$.getSingle("#totalSizeTxt",elContent);
23
+ var elTextGuide = $("guide_text");
24
+ var welUploadInputBox = $Element("uploadInputBox");
25
+ var oNavigator = jindo.$Agent().navigator();
26
+
27
+ //마크업-공통
28
+ var welBtnConfirm = $Element("btn_confirm"); //확인 버튼
29
+ var welBtnCancel= $Element("btn_cancel"); //취소 버튼
30
+
31
+ //진도로 랩핑된 element
32
+ var welTextGuide = $Element(elTextGuide);
33
+ var welDropArea = $Element(elDropArea);
34
+ var welDropAreaUL = $Element(elDropAreaUL);
35
+ var fnUploadImage = null;
36
+
37
+ //File API 지원 여부로 결정
38
+ function checkDragAndDropAPI(){
39
+ try{
40
+ if( !oNavigator.ie ){
41
+ if(!!oNavigator.safari && oNavigator.version <= 5){
42
+ bSupportDragAndDropAPI = false;
43
+ }else{
44
+ bSupportDragAndDropAPI = true;
45
+ }
46
+ } else {
47
+ bSupportDragAndDropAPI = false;
48
+ }
49
+ }catch(e){
50
+ bSupportDragAndDropAPI = false;
51
+ }
52
+ }
53
+
54
+ //--------------- html5 미지원 브라우저에서 (IE9 이하) ---------------
55
+ /**
56
+ * 이미지를 첨부 후 활성화된 버튼 상태
57
+ */
58
+ function goStartMode(){
59
+ var sSrc = welBtnConfirm.attr("src")|| "";
60
+ if(sSrc.indexOf("btn_confirm2.png") < 0 ){
61
+ welBtnConfirm.attr("src","/assets/smart_editor/photoQuickPopup/btn_confirm2.png");
62
+ fnUploadImage.attach(welBtnConfirm.$value(), "click");
63
+ }
64
+ }
65
+ /**
66
+ * 이미지를 첨부 전 비활성화된 버튼 상태
67
+ * @return
68
+ */
69
+ function goReadyMode(){
70
+ var sSrc = welBtnConfirm.attr("src")|| "";
71
+ if(sSrc.indexOf("btn_confirm2.png") >= 0 ){
72
+ fnUploadImage.detach(welBtnConfirm.$value(), "click");
73
+ welBtnConfirm.attr("src","/assets/smart_editor/photoQuickPopup/btn_confirm.png");
74
+ }
75
+ }
76
+
77
+ /**
78
+ * 일반 업로드
79
+ * @desc oFileUploader의 upload함수를 호출함.
80
+ function generalUpload(){
81
+ oFileUploader.upload();
82
+ }
83
+
84
+ /**
85
+ * 이미지 첨부 전 안내 텍스트가 나오는 배경으로 '설정'하는 함수.
86
+ * @return
87
+ */
88
+ function readyModeBG (){
89
+ var sClass = welTextGuide.className();
90
+ if(sClass.indexOf('nobg') >= 0){
91
+ welTextGuide.removeClass('nobg');
92
+ welTextGuide.className('bg');
93
+ }
94
+ }
95
+
96
+ /**
97
+ * 이미지 첨부 전 안내 텍스트가 나오는 배경을 '제거'하는 함수.
98
+ * @return
99
+ */
100
+ function startModeBG (){
101
+ var sClass = welTextGuide.className();
102
+ if(sClass.indexOf('nobg') < 0){
103
+ welTextGuide.removeClass('bg');
104
+ welTextGuide.className('nobg');
105
+ }
106
+ }
107
+
108
+ //--------------------- html5 지원되는 브라우저에서 사용하는 함수 --------------------------
109
+ /**
110
+ * 팝업에 노출될 업로드 예정 사진의 수.
111
+ * @param {Object} nCount 현재 업로드 예정인 사진 장수
112
+ * @param {Object} nVariable 삭제되는 수
113
+ */
114
+ function updateViewCount (nCount, nVariable){
115
+ var nCnt = nCount + nVariable;
116
+ elCountTxtTxt.innerHTML = nCnt +"장";
117
+ nImageFileCount = nCnt;
118
+ return nCnt;
119
+ }
120
+
121
+ /**
122
+ * 팝업에 노출될 업로드될 사진 총 용량
123
+ */
124
+ function updateViewTotalSize(){
125
+ var nViewTotalSize = Number(parseInt((nTotalSize || 0), 10) / (1024*1024));
126
+ elTotalSizeTxt.innerHTML = nViewTotalSize.toFixed(2) +"MB";
127
+ }
128
+
129
+ /**
130
+ * 이미지 전체 용량 재계산.
131
+ * @param {Object} sParentId
132
+ */
133
+ function refreshTotalImageSize(sParentId){
134
+ var nDelImgSize = htImageInfo[sParentId].size;
135
+ if(nTotalSize - nDelImgSize > -1 ){
136
+ nTotalSize = nTotalSize - nDelImgSize;
137
+ }
138
+ }
139
+
140
+ /**
141
+ * hash table에서 이미지 정보 초기화.
142
+ * @param {Object} sParentId
143
+ */
144
+ function removeImageInfo (sParentId){
145
+ //삭제된 이미지의 공간을 초기화 한다.
146
+ htImageInfo[sParentId] = null;
147
+ }
148
+
149
+
150
+ /**
151
+ * byte로 받은 이미지 용량을 화면에 표시를 위해 포맷팅
152
+ * @param {Object} nByte
153
+ */
154
+ function setUnitString (nByte) {
155
+ var nImageSize;
156
+ var sUnit;
157
+
158
+ if(nByte < 0 ){
159
+ nByte = 0;
160
+ }
161
+
162
+ if( nByte < 1024) {
163
+ nImageSize = Number(nByte);
164
+ sUnit = 'B';
165
+ return nImageSize + sUnit;
166
+ } else if( nByte > (1024*1024)) {
167
+ nImageSize = Number(parseInt((nByte || 0), 10) / (1024*1024));
168
+ sUnit = 'MB';
169
+ return nImageSize.toFixed(2) + sUnit;
170
+ } else {
171
+ nImageSize = Number(parseInt((nByte || 0), 10) / 1024);
172
+ sUnit = 'KB';
173
+ return nImageSize.toFixed(0) + sUnit;
174
+ }
175
+ }
176
+
177
+ /**
178
+ * 화면 목록에 적당하게 이름을 잘라서 표시.
179
+ * @param {Object} sName 파일명
180
+ * @param {Object} nMaxLng 최대 길이
181
+ */
182
+ function cuttingNameByLength (sName, nMaxLng) {
183
+ var sTemp, nIndex;
184
+ if(sName.length > nMaxLng){
185
+ nIndex = sName.indexOf(".");
186
+ sTemp = sName.substring(0,nMaxLng) + "..." + sName.substring(nIndex,sName.length) ;
187
+ } else {
188
+ sTemp = sName;
189
+ }
190
+ return sTemp;
191
+ }
192
+
193
+ /**
194
+ * Total Image Size를 체크해서 추가로 이미지를 넣을지 말지를 결정함.
195
+ * @param {Object} nByte
196
+ */
197
+ function checkTotalImageSize(nByte){
198
+ if( nTotalSize + nByte < nMaxTotalImageSize){
199
+ nTotalSize = nTotalSize + nByte;
200
+ return false;
201
+ } else {
202
+ return true;
203
+ }
204
+ }
205
+
206
+ // 이벤트 핸들러 할당
207
+ function dragEnter(ev) {
208
+ ev.stopPropagation();
209
+ ev.preventDefault();
210
+ }
211
+
212
+ function dragExit(ev) {
213
+ ev.stopPropagation();
214
+ ev.preventDefault();
215
+ }
216
+
217
+ function dragOver(ev) {
218
+ ev.stopPropagation();
219
+ ev.preventDefault();
220
+ }
221
+
222
+ /**
223
+ * 드랍 영역에 사진을 떨구는 순간 발생하는 이벤트
224
+ * @param {Object} ev
225
+ */
226
+ function drop(ev) {
227
+ ev.stopPropagation();
228
+ ev.preventDefault();
229
+
230
+ if (nImageFileCount >= 10){
231
+ alert("최대 10장까지만 등록할 수 있습니다.");
232
+ return;
233
+ }
234
+
235
+ if(typeof ev.dataTransfer.files == 'undefined'){
236
+ alert("HTML5 지원이 정상적으로 이루어지지 않는 브라우저입니다.");
237
+ }else{
238
+ //변수 선언
239
+ var wel,
240
+ files,
241
+ nCount,
242
+ sListTag = '';
243
+
244
+ //초기화
245
+ files = ev.dataTransfer.files;
246
+ nCount = files.length;
247
+
248
+ if (!!files && nCount === 0){
249
+ //파일이 아닌, 웹페이지에서 이미지를 드래서 놓는 경우.
250
+ alert("정상적인 첨부방식이 아닙니다.");
251
+ return ;
252
+ }
253
+
254
+ for (var i = 0, j = nImageFileCount ; i < nCount ; i++){
255
+ if (!rFilter.test(files[i].type)) {
256
+ alert("이미지파일 (jpg,gif,png,bmp)만 업로드 가능합니다.");
257
+ } else if(files[i].size > nMaxImageSize){
258
+ alert("이미지 용량이 10MB를 초과하여 등록할 수 없습니다.");
259
+ } else {
260
+ //제한된 수만 업로드 가능.
261
+ if ( j < nMaxImageCount ){
262
+ sListTag += addImage(files[i]);
263
+
264
+ //다음 사진을위한 셋팅
265
+ j = j+1;
266
+ nImageInfoCnt = nImageInfoCnt+1;
267
+ } else {
268
+ alert("최대 10장까지만 등록할 수 있습니다.");
269
+ break;
270
+ }
271
+ }
272
+ }
273
+ if(j > 0){
274
+ //배경 이미지 변경
275
+ startModeBG();
276
+ if ( sListTag.length > 1){
277
+ welDropAreaUL.prependHTML(sListTag);
278
+ }
279
+ //이미지 총사이즈 view update
280
+ updateViewTotalSize();
281
+ //이미치 총 수 view update
282
+ nImageFileCount = j;
283
+ updateViewCount(nImageFileCount, 0);
284
+ // 저장 버튼 활성화
285
+ goStartMode();
286
+ }else{
287
+ readyModeBG();
288
+ }
289
+ }
290
+ }
291
+
292
+ /**
293
+ * 이미지를 추가하기 위해서 file을 저장하고, 목록에 보여주기 위해서 string을 만드는 함수.
294
+ * @param ofile 한개의 이미지 파일
295
+ * @return
296
+ */
297
+ function addImage(ofile){
298
+ //파일 사이즈
299
+ var ofile = ofile,
300
+ sFileSize = 0,
301
+ sFileName = "",
302
+ sLiTag = "",
303
+ bExceedLimitTotalSize = false,
304
+ aFileList = [];
305
+
306
+ sFileSize = setUnitString(ofile.size);
307
+ sFileName = cuttingNameByLength(ofile.name, 15);
308
+ bExceedLimitTotalSize = checkTotalImageSize(ofile.size);
309
+
310
+ if( !!bExceedLimitTotalSize ){
311
+ alert("전체 이미지 용량이 50MB를 초과하여 등록할 수 없습니다. \n\n (파일명 : "+sFileName+", 사이즈 : "+sFileSize+")");
312
+ } else {
313
+ //이미지 정보 저장
314
+ htImageInfo['img'+nImageInfoCnt] = ofile;
315
+
316
+ //List 마크업 생성하기
317
+ aFileList.push(' <li id="img'+nImageInfoCnt+'" class="imgLi"><span>'+ sFileName +'</span>');
318
+ aFileList.push(' <em>'+ sFileSize +'</em>');
319
+ aFileList.push(' <a onclick="delImage(\'img'+nImageInfoCnt+'\')"><img class="del_button" src="/assets/smart_editor/photoQuickPopup/btn_del.png" width="14" height="13" alt="첨부 사진 삭제"></a>');
320
+ aFileList.push(' </li> ');
321
+
322
+ sLiTag = aFileList.join(" ");
323
+ aFileList = [];
324
+ }
325
+ return sLiTag;
326
+ }
327
+
328
+ /**
329
+ * HTML5 DragAndDrop으로 사진을 추가하고, 확인버튼을 누른 경우에 동작한다.
330
+ * @return
331
+ */
332
+ function html5Upload() {
333
+ var tempFile,
334
+ sUploadURL;
335
+
336
+ sUploadURL = '/smart_editor/editor_images/create_for_html5'; //upload URL
337
+
338
+ //파일을 하나씩 보내고, 결과를 받음.
339
+ for(var j=0, k=0; j < nImageInfoCnt; j++) {
340
+ tempFile = htImageInfo['img'+j];
341
+ try{
342
+ if(!!tempFile){
343
+ //Ajax통신하는 부분. 파일과 업로더할 url을 전달한다.
344
+ callAjaxForHTML5(tempFile,sUploadURL);
345
+ k += 1;
346
+ }
347
+ }catch(e){}
348
+ tempFile = null;
349
+ }
350
+ }
351
+
352
+ function callAjaxForHTML5 (tempFile, sUploadURL){
353
+ var oAjax = jindo.$Ajax(sUploadURL, {
354
+ type: 'xhr',
355
+ method : "post",
356
+ onload : function(res){ // 요청이 완료되면 실행될 콜백 함수
357
+ if (res.readyState() == 4) {
358
+ //성공 시에 responseText를 가지고 array로 만드는 부분.
359
+ makeArrayFromString(res._response.responseText);
360
+ }
361
+ },
362
+ timeout : 3,
363
+ onerror : jindo.$Fn(onAjaxError, this).bind()
364
+ });
365
+ oAjax.header("Content-Type","multipart");
366
+ oAjax.header("file-name",encodeURIComponent(tempFile.name));
367
+ oAjax.header("file-size",tempFile.size);
368
+ oAjax.header("file-type",tempFile.type);
369
+ oAjax.request(tempFile);
370
+ }
371
+
372
+ function makeArrayFromString(sResString){
373
+ var aTemp = [],
374
+ aSubTemp = [],
375
+ htTemp = {}
376
+ aResultleng = 0;
377
+
378
+ try{
379
+ if(!sResString || sResString.indexOf("sFileURL") < 0){
380
+ return ;
381
+ }
382
+ aTemp = sResString.split("&");
383
+ for (var i = 0; i < aTemp.length ; i++){
384
+ if( !!aTemp[i] && aTemp[i] != "" && aTemp[i].indexOf("=") > 0){
385
+ aSubTemp = aTemp[i].split("=");
386
+ htTemp[aSubTemp[0]] = aSubTemp[1];
387
+ }
388
+ }
389
+ }catch(e){}
390
+
391
+ aResultleng = aResult.length;
392
+ aResult[aResultleng] = htTemp;
393
+
394
+ if(aResult.length == nImageFileCount){
395
+ setPhotoToEditor(aResult);
396
+ aResult = null;
397
+ window.close();
398
+ }
399
+ }
400
+
401
+ /**
402
+ * 사진 삭제 시에 호출되는 함수
403
+ * @param {Object} sParentId
404
+ */
405
+ function delImage (sParentId){
406
+ var elLi = jindo.$$.getSingle("#"+sParentId);
407
+
408
+ refreshTotalImageSize(sParentId);
409
+
410
+ updateViewTotalSize();
411
+ updateViewCount(nImageFileCount,-1);
412
+ //사진 file array에서 정보 삭제.
413
+ removeImageInfo(sParentId);
414
+ //해당 li삭제
415
+ $Element(elLi).leave();
416
+
417
+ //마지막 이미지인경우.
418
+ if(nImageFileCount === 0){
419
+ readyModeBG();
420
+ //사진 추가 버튼 비활성화
421
+ goReadyMode();
422
+ }
423
+
424
+ // drop 영역 이벤트 다시 활성화.
425
+ if(!bAttachEvent){
426
+ addEvent();
427
+ }
428
+ }
429
+
430
+ /**
431
+ * 이벤트 할당
432
+ */
433
+ function addEvent() {
434
+ bAttachEvent = true;
435
+ elDropArea.addEventListener("dragenter", dragEnter, false);
436
+ elDropArea.addEventListener("dragexit", dragExit, false);
437
+ elDropArea.addEventListener("dragover", dragOver, false);
438
+ elDropArea.addEventListener("drop", drop, false);
439
+ }
440
+
441
+ function removeEvent(){
442
+ bAttachEvent = false;
443
+ elDropArea.removeEventListener("dragenter", dragEnter, false);
444
+ elDropArea.removeEventListener("dragexit", dragExit, false);
445
+ elDropArea.removeEventListener("dragover", dragOver, false);
446
+ elDropArea.removeEventListener("drop", drop, false);
447
+ }
448
+
449
+ /**
450
+ * Ajax 통신 시 error가 발생할 때 처리하는 함수입니다.
451
+ * @return
452
+ */
453
+ function onAjaxError (){
454
+ alert("사진 업로드 실패. 잠시후 다시 시도해 주세요."); //설치 가이드 안내 문구임. 실 서비스에서는 삭제.
455
+ }
456
+
457
+ /**
458
+ * 이미지 업로드 시작
459
+ * 확인 버튼 클릭하면 호출되는 msg
460
+ */
461
+ function uploadImage (e){
462
+ if(!bSupportDragAndDropAPI){
463
+ generalUpload();
464
+ }else{
465
+ html5Upload();
466
+ }
467
+ }
468
+
469
+ /**
470
+ * jindo에 파일 업로드 사용.(iframe에 Form을 Submit하여 리프레시없이 파일을 업로드하는 컴포넌트)
471
+ */
472
+ function callFileUploader (){
473
+ oFileUploader = new jindo.FileUploader(jindo.$("editor_image_file"),{
474
+ sUrl : '/smart_editor/editor_images/create_without_html5', //샘플 URL입니다.
475
+ sCallback : location.href.replace(/\/[^\/]*$/, '') + '/callback.html', //업로드 이후에 iframe이 redirect될 콜백페이지의 주소
476
+ sFiletype : "*.jpg;*.png;*.bmp;*.gif", //허용할 파일의 형식. ex) "*", "*.*", "*.jpg", 구분자(;)
477
+ sMsgNotAllowedExt : 'JPG, GIF, PNG, BMP 확장자만 가능합니다', //허용할 파일의 형식이 아닌경우에 띄워주는 경고창의 문구
478
+ bAutoUpload : true, //파일이 선택됨과 동시에 자동으로 업로드를 수행할지 여부 (upload 메소드 수행)
479
+ bAutoReset : true // 업로드한 직후에 파일폼을 리셋 시킬지 여부 (reset 메소드 수행)
480
+ }).attach({
481
+ select : function(oCustomEvent) {
482
+ //파일 선택이 완료되었을 때 발생
483
+ // oCustomEvent (이벤트 객체) = {
484
+ // sValue (String) 선택된 File Input의 값
485
+ // bAllowed (Boolean) 선택된 파일의 형식이 허용되는 형식인지 여부
486
+ // sMsgNotAllowedExt (String) 허용되지 않는 파일 형식인 경우 띄워줄 경고메세지
487
+ // }
488
+ // 선택된 파일의 형식이 허용되는 경우만 처리
489
+ if(oCustomEvent.bAllowed === true){
490
+ goStartMode();
491
+ }else{
492
+ goReadyMode();
493
+ oFileUploader.reset();
494
+ }
495
+ // bAllowed 값이 false인 경우 경고문구와 함께 alert 수행
496
+ // oCustomEvent.stop(); 수행시 bAllowed 가 false이더라도 alert이 수행되지 않음
497
+ },
498
+ success : function(oCustomEvent) {
499
+ // alert("success");
500
+ // 업로드가 성공적으로 완료되었을 때 발생
501
+ // oCustomEvent(이벤트 객체) = {
502
+ // htResult (Object) 서버에서 전달해주는 결과 객체 (서버 설정에 따라 유동적으로 선택가능)
503
+ // }
504
+ var aResult = [];
505
+ aResult[0] = oCustomEvent.htResult;
506
+ setPhotoToEditor(aResult);
507
+ //버튼 비활성화
508
+ goReadyMode();
509
+ oFileUploader.reset();
510
+ //window.close();
511
+ },
512
+ error : function(oCustomEvent) {
513
+ //업로드가 실패했을 때 발생
514
+ //oCustomEvent(이벤트 객체) = {
515
+ // htResult : { (Object) 서버에서 전달해주는 결과 객체. 에러발생시 errstr 프로퍼티를 반드시 포함하도록 서버 응답을 설정하여야한다.
516
+ // errstr : (String) 에러메시지
517
+ // }
518
+ //}
519
+ //var wel = jindo.$Element("info");
520
+ //wel.html(oCustomEvent.htResult.errstr);
521
+ alert(oCustomEvent.htResult.errstr);
522
+ }
523
+ });
524
+ }
525
+
526
+ /**
527
+ * 페이지 닫기 버튼 클릭
528
+ */
529
+ function closeWindow(){
530
+ if(bSupportDragAndDropAPI){
531
+ removeEvent();
532
+ }
533
+ // window.close();
534
+ }
535
+
536
+ window.onload = function(){
537
+ checkDragAndDropAPI();
538
+
539
+
540
+ if(bSupportDragAndDropAPI){
541
+ $Element("pop_container2").hide();
542
+ $Element("pop_container").show();
543
+
544
+ welTextGuide.removeClass("nobg");
545
+ welTextGuide.className("bg");
546
+
547
+ addEvent();
548
+ } else {
549
+ $Element("pop_container").hide();
550
+ $Element("pop_container2").show();
551
+ callFileUploader();
552
+ }
553
+ fnUploadImage = $Fn(uploadImage,this);
554
+ $Fn(closeWindow,this).attach(welBtnCancel.$value(), "click");
555
+ };
556
+
557
+ /**
558
+ * 서버로부터 받은 데이타를 에디터에 전달하고 창을 닫음.
559
+ * @parameter aFileInfo [{},{},...]
560
+ * @ex aFileInfo = [
561
+ * {
562
+ sFileName : "nmms_215646753.gif",
563
+ sFileURL :"http://static.naver.net/www/u/2010/0611/nmms_215646753.gif",
564
+ bNewLine : true
565
+ },
566
+ {
567
+ sFileName : "btn_sch_over.gif",
568
+ sFileURL :"http://static1.naver.net/w9/btn_sch_over.gif",
569
+ bNewLine : true
570
+ }
571
+ * ]
572
+ */
573
+ function setPhotoToEditor(oFileInfo){
574
+ if (!!opener && !!opener.nhn && !!opener.nhn.husky && !!opener.nhn.husky.PopUpManager) {
575
+ //스마트 에디터 플러그인을 통해서 넣는 방법 (oFileInfo는 Array)
576
+ opener.nhn.husky.PopUpManager.setCallback(window, 'SET_PHOTO', [oFileInfo]);
577
+ //본문에 바로 tag를 넣는 방법 (oFileInfo는 String으로 <img src=....> )
578
+ //opener.nhn.husky.PopUpManager.setCallback(window, 'PASTE_HTML', [oFileInfo]);
579
+ }
580
+ }
581
+
582
+ // 2012.05 현재] jindo.$Ajax.prototype.request에서 file과 form을 지원하지 안함.
583
+ jindo.$Ajax.prototype.request = function(oData) {
584
+ this._status++;
585
+ var t = this;
586
+ var req = this._request;
587
+ var opt = this._options;
588
+ var data, v,a = [], data = "";
589
+ var _timer = null;
590
+ var url = this._url;
591
+ this._is_abort = false;
592
+
593
+ if( opt.postBody && opt.type.toUpperCase()=="XHR" && opt.method.toUpperCase()!="GET"){
594
+ if(typeof oData == 'string'){
595
+ data = oData;
596
+ }else{
597
+ data = jindo.$Json(oData).toString();
598
+ }
599
+ }else if (typeof oData == "undefined" || !oData) {
600
+ data = null;
601
+ } else {
602
+ data = oData;
603
+ }
604
+
605
+ req.open(opt.method.toUpperCase(), url, opt.async);
606
+ if (opt.sendheader) {
607
+ if(!this._headers["Content-Type"]){
608
+ req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
609
+ }
610
+ req.setRequestHeader("charset", "utf-8");
611
+ for (var x in this._headers) {
612
+ if(this._headers.hasOwnProperty(x)){
613
+ if (typeof this._headers[x] == "function")
614
+ continue;
615
+ req.setRequestHeader(x, String(this._headers[x]));
616
+ }
617
+ }
618
+ }
619
+ var navi = navigator.userAgent;
620
+ if(req.addEventListener&&!(navi.indexOf("Opera") > -1)&&!(navi.indexOf("MSIE") > -1)){
621
+ /*
622
+ * opera 10.60에서 XMLHttpRequest에 addEventListener기 추가되었지만 정상적으로 동작하지 않아 opera는 무조건 dom1방식으로 지원함.
623
+ * IE9에서도 opera와 같은 문제가 있음.
624
+ */
625
+ if(this._loadFunc){ req.removeEventListener("load", this._loadFunc, false); }
626
+ this._loadFunc = function(rq){
627
+ clearTimeout(_timer);
628
+ _timer = undefined;
629
+ t._onload(rq);
630
+ }
631
+ req.addEventListener("load", this._loadFunc, false);
632
+ }else{
633
+ if (typeof req.onload != "undefined") {
634
+ req.onload = function(rq){
635
+ if(req.readyState == 4 && !t._is_abort){
636
+ clearTimeout(_timer);
637
+ _timer = undefined;
638
+ t._onload(rq);
639
+ }
640
+ };
641
+ } else {
642
+ /*
643
+ * IE6에서는 onreadystatechange가 동기적으로 실행되어 timeout이벤트가 발생안됨.
644
+ * 그래서 interval로 체크하여 timeout이벤트가 정상적으로 발생되도록 수정. 비동기 방식일때만
645
+
646
+ */
647
+ if(window.navigator.userAgent.match(/(?:MSIE) ([0-9.]+)/)[1]==6&&opt.async){
648
+ var onreadystatechange = function(rq){
649
+ if(req.readyState == 4 && !t._is_abort){
650
+ if(_timer){
651
+ clearTimeout(_timer);
652
+ _timer = undefined;
653
+ }
654
+ t._onload(rq);
655
+ clearInterval(t._interval);
656
+ t._interval = undefined;
657
+ }
658
+ };
659
+ this._interval = setInterval(onreadystatechange,300);
660
+
661
+ }else{
662
+ req.onreadystatechange = function(rq){
663
+ if(req.readyState == 4){
664
+ clearTimeout(_timer);
665
+ _timer = undefined;
666
+ t._onload(rq);
667
+ }
668
+ };
669
+ }
670
+ }
671
+ }
672
+
673
+ req.send(data);
674
+ return this;
675
+ };
@@ -0,0 +1,32 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2
+ <html lang="ko">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>FileUploader Callback</title>
6
+ </head>
7
+ <body>
8
+ <script type="text/javascript">
9
+ // alert("callback");
10
+ // document.domain 설정
11
+ try { document.domain = "http://*.naver.com"; } catch(e) {}
12
+
13
+ // execute callback script
14
+ var sUrl = document.location.search.substr(1);
15
+ if (sUrl != "blank") {
16
+ var oParameter = {}; // query array
17
+
18
+ sUrl.replace(/([^=]+)=([^&]*)(&|$)/g, function(){
19
+ oParameter[arguments[1]] = arguments[2];
20
+ return "";
21
+ });
22
+
23
+ if ((oParameter.errstr || '').length) { // on error
24
+ (parent.jindo.FileUploader._oCallback[oParameter.callback_func+'_error'])(oParameter);
25
+ } else {
26
+ (parent.jindo.FileUploader._oCallback[oParameter.callback_func+'_success'])(oParameter);
27
+ }
28
+ }
29
+ </script>
30
+ </body>
31
+ </html>
32
+