attach_photo.js 21 KB

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