smart_editor 0.0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/smart_editor/application.js +15 -0
- data/app/assets/javascripts/smart_editor/editor_images.js +1 -0
- data/app/assets/stylesheets/smart_editor/application.css +13 -0
- data/app/assets/stylesheets/smart_editor/editor_images.css +4 -0
- data/app/controllers/smart_editor/application_controller.rb +4 -0
- data/app/controllers/smart_editor/editor_images_controller.rb +41 -0
- data/app/helpers/smart_editor/application_helper.rb +4 -0
- data/app/helpers/smart_editor/editor_images_helper.rb +4 -0
- data/app/models/smart_editor/editor_image.rb +7 -0
- data/app/uploaders/file_uploader.rb +55 -0
- data/app/views/layouts/smart_editor/application.html.erb +14 -0
- data/app/views/smart_editor/editor_images/index.html.erb +4 -0
- data/config/routes.rb +7 -0
- data/db/migrate/20130101074444_create_smart_editor_editor_images.rb +10 -0
- data/lib/generators/smart_editor/smart_editor_generator.rb +18 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/SmartEditor2Skin.html +635 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/FileUploader.php +22 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/FileUploader_html5.php +25 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/Photo_Quick_UploadPopup.html +100 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/QuickPhotoPopup.js +675 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/callback.html +32 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/jindo.min.js +12686 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/jindo_fileUpload.js +390 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/smart_editor2_inputarea.html +9 -0
- data/lib/generators/smart_editor/templates/public/smart_editor/smart_editor2_inputarea_ie8.html +10 -0
- data/lib/smart_editor/class_methods.rb +10 -0
- data/lib/smart_editor/engine.rb +5 -0
- data/lib/smart_editor/form_builder.rb +11 -0
- data/lib/smart_editor/version.rb +3 -0
- data/lib/smart_editor.rb +18 -0
- data/lib/tasks/smart_editor_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/javascripts/posts.js +2 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/assets/stylesheets/posts.css +4 -0
- data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/posts_controller.rb +85 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/posts_helper.rb +2 -0
- data/test/dummy/app/models/post.rb +4 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/posts/_form.html.erb +30 -0
- data/test/dummy/app/views/posts/edit.html.erb +6 -0
- data/test/dummy/app/views/posts/index.html.erb +27 -0
- data/test/dummy/app/views/posts/new.html.erb +5 -0
- data/test/dummy/app/views/posts/show.html.erb +20 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +7 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/migrate/20130103085542_create_posts.rb +11 -0
- data/test/dummy/db/migrate/20130103090021_create_smart_editor_editor_images.smart_editor.rb +11 -0
- data/test/dummy/db/schema.rb +32 -0
- data/test/dummy/log/development.log +713 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/smart_editor/SmartEditor2Skin.html +635 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/FileUploader.php +22 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/FileUploader_html5.php +25 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/Photo_Quick_UploadPopup.html +100 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/QuickPhotoPopup.js +675 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/callback.html +32 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/jindo.min.js +12686 -0
- data/test/dummy/public/smart_editor/popup/quick_photo/jindo_fileUpload.js +390 -0
- data/test/dummy/public/smart_editor/smart_editor2_inputarea.html +9 -0
- data/test/dummy/public/smart_editor/smart_editor2_inputarea_ie8.html +10 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/test/fixtures/posts.yml +11 -0
- data/test/dummy/test/functional/posts_controller_test.rb +49 -0
- data/test/dummy/test/unit/helpers/posts_helper_test.rb +4 -0
- data/test/dummy/test/unit/post_test.rb +7 -0
- data/test/dummy/tmp/cache/assets/C39/A20/sprockets%2Fd75302feb7958c52568020a888775667 +0 -0
- data/test/dummy/tmp/cache/assets/C8B/9F0/sprockets%2F42090f88c5061f72460d7c83a9bc8990 +0 -0
- data/test/dummy/tmp/cache/assets/C8E/A60/sprockets%2F74b1945f4d4a322ab567f73798c32838 +0 -0
- data/test/dummy/tmp/cache/assets/CD4/040/sprockets%2F7c241e3470f7210ab843c109c9d68a4b +0 -0
- data/test/dummy/tmp/cache/assets/CE3/740/sprockets%2F200278c67b4dde839345d7b018fed561 +0 -0
- data/test/dummy/tmp/cache/assets/CEE/680/sprockets%2F6d653ad72aed952816dd79e63c761417 +0 -0
- data/test/dummy/tmp/cache/assets/D12/CA0/sprockets%2Fcd507925f6bb1f62170d028ca668ad98 +0 -0
- data/test/dummy/tmp/cache/assets/D13/8A0/sprockets%2Fec89fa303e9609b18f50b6de2831433e +0 -0
- data/test/dummy/tmp/cache/assets/D6F/A80/sprockets%2F8893ca0d5d16eb3d85c0964bdbbe3381 +0 -0
- data/test/dummy/tmp/cache/assets/D86/AF0/sprockets%2Fcfa5f1244012fcd263cee551afe412b2 +0 -0
- data/test/dummy/tmp/cache/assets/D92/5A0/sprockets%2Fb0e45a13b900ecbf7011b78bdff2595e +0 -0
- data/test/dummy/tmp/cache/assets/D9D/950/sprockets%2F65093fff17b1aa3bed7e0dda53563b79 +0 -0
- data/test/dummy/tmp/cache/assets/DF9/8C0/sprockets%2Fc27a71cbee6a5dffdc2534b267b2fa66 +0 -0
- data/test/dummy/tmp/cache/assets/E54/F60/sprockets%2Ff1bba5cc065ebbb83addfbba59f82059 +0 -0
- data/test/fixtures/smart_editor/editor_images.yml +11 -0
- data/test/functional/smart_editor/editor_images_controller_test.rb +9 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/smart_editor_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/helpers/smart_editor/editor_images_helper_test.rb +6 -0
- data/test/unit/smart_editor/editor_image_test.rb +9 -0
- data/vendor/assets/images/smart_editor/bg_b1.png +0 -0
- data/vendor/assets/images/smart_editor/bg_find_h3.gif +0 -0
- data/vendor/assets/images/smart_editor/bg_line1.gif +0 -0
- data/vendor/assets/images/smart_editor/bg_quote2.gif +0 -0
- data/vendor/assets/images/smart_editor/bg_set.gif +0 -0
- data/vendor/assets/images/smart_editor/bg_tool2.gif +0 -0
- data/vendor/assets/images/smart_editor/btn_set.png +0 -0
- data/vendor/assets/images/smart_editor/bx_set_110302.gif +0 -0
- data/vendor/assets/images/smart_editor/editor_guideline_698.gif +0 -0
- data/vendor/assets/images/smart_editor/editor_guideline_890.gif +0 -0
- data/vendor/assets/images/smart_editor/icon_set.gif +0 -0
- data/vendor/assets/images/smart_editor/photoQuickPopup/bg_drag_image.png +0 -0
- data/vendor/assets/images/smart_editor/photoQuickPopup/btn_cancel.png +0 -0
- data/vendor/assets/images/smart_editor/photoQuickPopup/btn_confirm.png +0 -0
- data/vendor/assets/images/smart_editor/photoQuickPopup/btn_confirm2.png +0 -0
- data/vendor/assets/images/smart_editor/photoQuickPopup/btn_del.png +0 -0
- data/vendor/assets/images/smart_editor/photoQuickPopup/btn_find.png +0 -0
- data/vendor/assets/images/smart_editor/text_tool_set.png +0 -0
- data/vendor/assets/images/smart_editor/text_tool_set2.png +0 -0
- data/vendor/assets/javascripts/smart_editor/HuskyEZCreator.js +133 -0
- data/vendor/assets/javascripts/smart_editor/SE2B_Configuration.js +77 -0
- data/vendor/assets/javascripts/smart_editor/SE2BasicCreator.js +85 -0
- data/vendor/assets/javascripts/smart_editor/hp_SE2M_AttachQuickPhoto.js +106 -0
- data/vendor/assets/javascripts/smart_editor/jindo.min.js +12699 -0
- data/vendor/assets/javascripts/smart_editor/jindo_component.js +279 -0
- data/vendor/assets/javascripts/smart_editor/loader-min.js +120 -0
- data/vendor/assets/javascripts/smart_editor.js +21 -0
- data/vendor/assets/stylesheets/smart_editor/smart_editor2.css +262 -0
- data/vendor/assets/stylesheets/smart_editor/smart_editor2_in.css +20 -0
- data/vendor/assets/stylesheets/smart_editor/smart_editor2_items.css +454 -0
- data/vendor/assets/stylesheets/smart_editor/smart_editor2_out.css +24 -0
- metadata +331 -0
data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/QuickPhotoPopup.js
ADDED
@@ -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
|
+
};
|
data/lib/generators/smart_editor/templates/public/smart_editor/popup/quick_photo/callback.html
ADDED
@@ -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
|
+
|