// XMLHttpRequest의 readyState 프로퍼티 결과 값 정의 var READY_STATE_UNINITIALIZED = 0; // 객체만 생성되고 아직 초기화되지 않은 상태 (open 메서드가 호출되지 않음) var READY_STATE_LOADING = 1; // open 메서드가 호출되고 아직 send 메서드가 호출되지 않은 상태 var READY_STATE_LOADED = 2; // send 메서드가 호출되었지만 status와 헤더는 도착하지 않은 상태 var READY_STATE_INTERACTIVE = 3; // 데이터의 일부를 받은 상태 var READY_STATE_COMPLETED = 4; // 데이터를 전부 받은 상태 // XMLHttpRequest의 status 프로퍼티 결과 값 정의 var STATUS_OK = 200; // 요청 성공 var STATUS_FORBIDDEN = 403; // 접근 거부 var STATUS_NOT_FOUND = 404; // 페이지 없음 var STATUS_INTERNAL_SERVER_ERROR= 500; // 서버 오류 발생 // 리스트를 출력할 때의 테이블을 초기화한다. function initAJAXListTable(szAjaxDisplayTableName, szTRClassName, szTDClassName, nRecordCount, nRowCountPerPage, nRowCountOfHeader, nMaxCellCount, bUsePaging, szPageTableName, szPageClassName) { var table = document.getElementById(szAjaxDisplayTableName); var table = null; if(!IsEmpty_ajax(szAjaxDisplayTableName)){ table = document.getElementById(szAjaxDisplayTableName); } //alert(nRowCountPerPage + ':' + nRowCountOfHeader + ':' + table.rows.length + ':'); if(eval(table) != null) { if(nRowCountPerPage == 0) { while(table.rows.length > nRowCountOfHeader) table.deleteRow(nRowCountOfHeader); } else { // 기존 Row의 스타일을 변경하고 내용을 지운다. for(var nRowIndex = nRowCountOfHeader; nRowIndex < table.rows.length; nRowIndex++) { var oldRow = table.rows.item(nRowIndex); oldRow.className = szTRClassName; if(oldRow.cells.length < nMaxCellCount) { while(oldRow.cells.length > 0) oldRow.deleteCell(0); } for(var nCellIndex = 0; nCellIndex < nMaxCellCount; nCellIndex++) { var oldCell = oldRow.cells.item(nCellIndex); if(eval(oldCell) == null) { oldCell = document.createElement("TD"); oldRow.appendChild(oldCell); } oldCell.className = szTDClassName; oldCell.innerHTML = " "; } } } // 페이지당 표시해야 할 Row수에서 부족한 부분을 생성한다. var nTotalRowCount = 0; if(nRowCountPerPage == 0) nTotalRowCount = parseInt(nRecordCount) + parseInt(nRowCountOfHeader); else nTotalRowCount = parseInt(nRowCountPerPage) + parseInt(nRowCountOfHeader); for(var nRowIndex = table.rows.length; nRowIndex < nTotalRowCount; nRowIndex++) { var newRow = table.insertRow(nRowIndex); newRow.className = szTRClassName; for(var nCellIndex = 0; nCellIndex < nMaxCellCount; nCellIndex++) { var newCell = document.createElement("TD"); newRow.appendChild(newCell); newCell.className = szTDClassName; newCell.innerHTML = " "; } } // 페이징을 사용하는 경우, 페이징 네비게이터를 표시하기 위한 Table을 정리한다. if(bUsePaging) { // 페이징 네비게이터 Table 객체를 가져온다. var pageNavigatorTable = document.getElementById(szPageTableName); // 페이징 네비게이터 Table의 Row가 없는 경우 추가 if(pageNavigatorTable.rows.length < 1) pageNavigatorTable.insertRow(0); // 페이징 네비게이터 Table의 Row가 있는 경우 하나만 남겨놓는다. else { while(pageNavigatorTable.rows.length > 1) pageNavigatorTable.deleteRow(0); } // 페이징 네비게이터 Table의 첫번째 Row 객체를 가져온다. var pageRow = pageNavigatorTable.rows.item(0); // Row의 Cell이 없는 경우 추가 if(pageRow.cells.length < 1) { pageCell = document.createElement("TD"); pageRow.appendChild(pageCell); } // Row의 Cell이 있는 경우 하나만 남겨놓는다. else { while(pageRow.cells.length > 1) pageRow.deleteCell(0); } pageRow.cells.item(0).className = szPageClassName; } } return table; } // @sample sendRequest(onloaded,'&prog=1','POST','./about2.php',true,true) // @param data 송신하는 데이터 (&이름1=값1&이름2=값2...) // @param method "POST" 또는 "GET" // @param url 요청하는 파일의 URL // @param actionFormName 결과가 저장될 ActionForm의 클래스명 // @param ajaxTableName AJAX 요청 결과가 표시될 테이블명 // @param pageTableName Page Navigator가 표시될 테이블명 // @param prgbarName 프로그레스바를 출력하는 div의 ID // @param trClassName 목록의 CSS Class명 // @param fieldCount 출력할 항목 수 (테이블 초기화에 사용) // @param async 비동기라면 true 동기라면 false // @param sload 수퍼 로드 true로 강제、생략 또는 false는 기본 // @param user 인증 페이지용 사용자 이름 // @param password 인증 페이지용 암호 // @param usePrgbar 로딩바 출력 여부 // @param usePaging 페이징 사용여부 AJAXObject = function(data, method, url, ajaxTableName, pageTableName, prgbarName , trClassName, tdClassName, pageClassName, rowPerPage, async , sload, user, password, usePrgbar, usePaging, clearTable, nHeaderRowCount, nCellCount) { // XML 객체 var objXMLHttp = createHttpRequest(); // Ajax 출력 테이블명 var szAjaxDisplayTableName = ajaxTableName; // TR 태그의 클래스명 var szTRClassName = trClassName; // TD 태그의 클래스명 var szTDClassName = tdClassName; // 페이지 네비케이터의 스타일 클래스명 var szPageClassName = pageClassName; // 한 페이지당 표시할 TR 수 var nRowPerPage = parseInt(rowPerPage); // Page Navigator 출력 테이블명 var szPageTableName = pageTableName; // 로딩바 출력여부 var bUsePrgbar = usePrgbar; // 페이징 사용여부 var bUsePaging = usePaging; // 헤더 라인수 var nRowCountOfHeader = nHeaderRowCount; // 최대 셀수 var nMaxCellCount = nCellCount; // 값 세팅시 호출되는 이벤트 var onSetRecord; // 테이블 화면 내 위치 var nTableLeft = 0; var nTableTop = 0; if(clearTable == false) { initAJAXListTable(ajaxTableName, trClassName, tdClassName, 0, rowPerPage, nRowCountOfHeader, nMaxCellCount, bUsePaging, szPageTableName, szPageClassName); } this.onSetRecord = function(objRow, objRowCells, objRecord, nIndex) { } //// // 송수신 함수 // this.send = function() { if(objXMLHttp == null ) return null; onSetRecord = this.onSetRecord; var loadingBar = null; //var table = document.getElementById(szAjaxDisplayTableName); var table = null; if(!IsEmpty_ajax(szAjaxDisplayTableName)){ table = document.getElementById(szAjaxDisplayTableName); } if(eval(table) != null) { if(eval(nRowCountOfHeader) == null || nRowCountOfHeader == 0) nRowCountOfHeader = 1; if(eval(nMaxCellCount) == null || nMaxCellCount == 0) { nMaxCellCount = 0; for(var nHeaderRowIndex = 0; nHeaderRowIndex < nRowCountOfHeader; nHeaderRowIndex++) { if(nMaxCellCount < table.rows.item(nHeaderRowIndex).cells.length) nMaxCellCount = table.rows.item(nHeaderRowIndex).cells.length; } } } if(clearTable == true) { while(table != null && table.rows.length > nRowCountOfHeader){ table.deleteRow(nRowCountOfHeader); } } else { initAJAXListTable(ajaxTableName, trClassName, tdClassName, 0, rowPerPage, nRowCountOfHeader, nMaxCellCount, bUsePaging, szPageTableName, szPageClassName); } if(prgbarName != null && prgbarName != "") { loadingBar = document.getElementById(prgbarName); if(loadingBar != null) { if(!bUsePrgbar) loadingBar.style.display = "none"; else loadingBar.style.display = "block"; if(typeof(table.left) == "undefined") { table.left = new Object(); table.left = table.getBoundingClientRect().left; } if(typeof(table.top) == "undefined") { table.top = new Object(); table.top = table.getBoundingClientRect().top; } loadingBar.style.left = table.left + table.offsetWidth / 2 - loadingBar.offsetWidth / 2; if(table.offsetHeight / 2 - loadingBar.offsetHeight / 2 > 0) loadingBar.style.top = table.top + table.offsetHeight / 2 - loadingBar.offsetHeight / 2; else loadingBar.style.top = table.top + table.offsetHeight; } } //강제 로드의 설정 if(sload || method.toUpperCase() == 'GET') url += "?"; if(sload) url = url + "t=" + (new Date()).getTime(); //브라우저 판정 var bwoj = new chkAjaBrowser(); var opera = bwoj.bw.opera; var safari = bwoj.bw.safari; var konqueror = bwoj.bw.konqueror; var mozes = bwoj.bw.mozes; //송신 처리 //opera는 onreadystatechange에 중복 응답이 있을 수 있어 onload가 안전 //Moz,FireFox는 this.XMLHttp.readyState==3에서도 수신하므로 보통은 onload가 안전 //Win ie에서는 onload가 동작하지 않는다 //Konqueror은 onload가 불안정 //참고 http://jsgt.org/ajax/ref/test/response/responsetext/try1.php if(opera || safari || mozes) { objXMLHttp.onload = function () { if(loadingBar != null) loadingBar.style.display = "none"; if(table != null) callbackAJAXList(objXMLHttp); else callbackAJAXForm(objXMLHttp); } } else { objXMLHttp.onreadystatechange = function () { if (objXMLHttp.readyState == READY_STATE_COMPLETED ){ if(loadingBar != null) loadingBar.style.display = "none"; if(table != null) { callbackAJAXList(objXMLHttp); } else { callbackAJAXForm(objXMLHttp); } } } } //URL 인코딩 if(method.toUpperCase() == 'GET') { data = uriEncode(data); url += data } //open 메소드 objXMLHttp.open(method,url,async,user,password); //헤더 application/x-www-form-urlencoded 설정 setEncHeader(objXMLHttp) //send 메소드 objXMLHttp.send(data); //// // 동작가능한 브라우저 판정 // // @sample if(chkAjaBrowser()){ location.href='nonajax.htm' } // @sample XMLHttp = new chkAjaBrowser();if(XMLHttp.bw.safari){ /* Safari 코드 */ } // @return 라이브러리가 동작가능한 브라우저만 true true|false // // Enable list (v038현재) // WinIE 5.5+ // Konqueror 3.3+ // AppleWebKit계(Safari,OmniWeb,Shiira) 124+ // Mozilla계(Firefox,Netscape,Galeon,Epiphany,K-Meleon,Sylera) 20011128+ // Opera 8+ function chkAjaBrowser() { var a,ua = navigator.userAgent; this.bw= { safari : ((a=ua.split('AppleWebKit/')[1])?a.split('(')[0]:0)>=124 , konqueror : ((a=ua.split('Konqueror/')[1])?a.split(';')[0]:0)>=3.3 , mozes : ((a=ua.split('Gecko/')[1])?a.split(" ")[0]:0) >= 20011128 , opera : (!!window.opera) && ((typeof XMLHttpRequest)=='function') , msie : (!!window.ActiveXObject)?(!!createHttpRequest()):false } return (this.bw.safari||this.bw.konqueror||this.bw.mozes||this.bw.opera||this.bw.msie) } //URI 인코딩 헤더 설정 function setEncHeader(XMLHttp){ //헤더 application/x-www-form-urlencoded 설정 // @see http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/forms.html#h-17.13.3 // @see #h-17.3 // ( enctype의 기본값은 "application/x-www-form-urlencoded") // h-17.3에 의해、POST/GET 상관없이 설정 // POST에서 "multipart/form-data"을 설정할 필요가 있는 경우에는 커스터마이즈 해주세요. // // 이 메소드가 Win Opera8.0에서 에러가 나므로 분기(8.01은 OK) var contentTypeUrlenc = 'application/x-www-form-urlencoded; charset=UTF-8'; if(!window.opera){ XMLHttp.setRequestHeader('Content-Type',contentTypeUrlenc); } else { if((typeof XMLHttp.setRequestHeader) == 'function') XMLHttp.setRequestHeader('Content-Type',contentTypeUrlenc); } return XMLHttp } //URL 인코딩 function uriEncode(data){ if(data!=""){ //&와=로 일단 분해해서 encode var encdata = ''; var datas = data.split("&"); for(i=1;i