/**
 * Ajax¸¦ ÀÌ¿ëÇÑ ¿äÃ»À» ¼öÇàÇÑ´Ù.
 *
 * @url ¿äÃ» URL·Î »ó´ë °æ·Î¿Í Àý´ë °æ·Î°¡ ¸ðµÎ °¡´ÉÇÔ
 * @params ¿äÃ» ÆÄ¶ó¹ÌÅÍ
 * @theMode ¸ðµå·Î È£ÃâÇÒ ¸Þ¼ÒµåÀÇ ÀÌ¸§À» ÀÇ¹ÌÇÔ. IAction¿¡ ´ëÇÑ ¿äÃ»ÀÎ °æ¿ì¿¡´Â ""¸¦ ÀÔ·Â
 * @after ¼­¹ö¿¡¼­ÀÇ Ã³¸®°¡ ¿Ï·áµÈ ÈÄ¿¡ È£ÃâµÇ´Â ¸Þ¼Òµå
 */
function callAjax(url, params, theMode, after, options) {
    jprivate_callMethod = after;
    jprivate_mode = theMode;

	jprivate_returnValue = null;
	
    var _async = (options && options["async"] == false)? false : true; // async ¿©ºÎ
    var _method = (options && options["method"] == "POST" )? "POST" : "GET"; // GET or POST
	var _params;
	if (params){
		_params = (typeof params == "string")? encodeURI(params) : jprivate_parseParam(params);
	}
	url += "?mode=" + theMode;
    
    /* À¥ ºê¶ó¿ìÀú¿¡ µû¸¥ ºÐ±â */
    if (window.XMLHttpRequest) {                             /* ¸ðÁú¶ó °è¿­ */
        jprivate_request = new XMLHttpRequest();
        jprivate_request.onreadystatechange = jprivate_process;
        if (_method == "GET"){
            jprivate_request.open(_method, url + "&" + _params, _async);
            jprivate_request.send(null);
        }else{
            jprivate_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
            jprivate_request.open(_method, url, _async);
            jprivate_request.send(_params);
        }
        if (_async == false && navigator.userAgent.toLowerCase().indexOf("firefox") > -1){
        	jprivate_process();
        }
    } else if (window.ActiveXObject) {                       /* MS IE */
        jprivate_request = new ActiveXObject("Microsoft.XMLHTTP");
        jprivate_request.onreadystatechange = jprivate_process;
        if (_method == "GET"){
            jprivate_request.open(_method, url + "&" + _params, _async);
            jprivate_request.send();
        }else{
            jprivate_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            jprivate_request.open(_method, url, _async);
            jprivate_request.send(_params);
        }
    }
    
    /*
    var style = "font: 12px ±¼¸², Tahoma, sans-serif;";
    style += "position: absolute; top: 6%; right: 5%;";
    style += "color: #fff; background-color: #008aff;";
    
    jprivate_message = (top) ? top.document.createElement("div") : document.createElement("div");
    jprivate_body = (top) ? top.document.getElementsByTagName("body")[0] : document.getElementsByTagName("body")[0];
    jprivate_message.innerHTML = "<span style=\"" + style + "\">ÀÛ¾÷ÁßÀÔ´Ï´Ù...</span>";
    jprivate_body.appendChild(jprivate_message);
    */
    
    if (_async == false){ // synchronous ¹æ½ÄÀÏ °æ¿ì after ÇÔ¼öÀÇ ¸®ÅÏ°ªÀ» µÇµ¹¸²
    	return jprivate_returnValue;
    }    
}

/**
 * ¼­¹ö¿¡¼­ Ajax ¿äÃ»ÀÌ Ã³¸®°¡ µÈ ÈÄ È£ÃâµÇ´Â ¸Þ¼Òµå·Î °£´ÜÇÑ ¿¡·¯ Ã³¸®¸¦ ÇÑ´Ù. ¼º°øÀûÀ¸·Î ¼öÇàµÈ °æ¿ì¿¡´Â
 * »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ callMethod¸¦ È£ÃâÇÑ´Ù. 
 */
function jprivate_process() {
    try {
    	if (jprivate_request.readyState == 4) {
            //jprivate_body.removeChild(jprivate_message);
            if (jprivate_request.status == 200) {
                jprivate_returnValue = jprivate_callMethod(jprivate_request, jprivate_mode);
            } else {
                alert("¿¹¿Ü°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù. (¸Þ½ÃÁö=" + jprivate_request.statusText + ")");
            }
        }
    } catch (e) {
        alert("¿¹¿Ü°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù. (¸Þ½ÃÁö=" + e.message + ")");
    }
}

function getParams(select, name) {
    var size = select.options.length;
    var result = "";
    for (var i = 0; i < size; i++) {
        if (select.options[i].selected) {
            result += "&" + name + "=" + select.options[i].value
        }
    }
    return result;
}

/**
 * item ÅÂ±×ÀÇ ³»¿ëÀ» ³ªÅ¸³»´Â Å¬·¡½º
 *
 * @param id ¾ÆÀÌµð
 * @param properties ¼Ó¼º ¸®½ºÆ®
 */
function JItem(id, properties) {
    this.id = id;
    this.properties = properties;

    this.getProperty = function(name) {
                           return properties[name]; 
                       };
}

/**
 * id¿¡ ÇØ´çÇÏ´Â item ÅÂ±×ÀÇ ³»¿ëÀ» JItem °´Ã¼·Î ¹ÝÈ¯ÇÑ´Ù.
 *
 * @param element response ÅÂ±×¸¦ ³ªÅ¸³»´Â DOM °´Ã¼
 * @param id ¾ÆÀÌµð. ¾ÆÀÌµð°¡ ¾ø´Â °æ¿ì¿¡´Â Ã¹¹øÂ° item ÅÂ±×°¡ ¹ÝÈ¯µÈ´Ù.
 */
function getItem(element, id) {
    var items = element.getElementsByTagName("item");
    for (var i = 0; i < items.length; i++) {
        if (id == null || items[i].getAttribute("id") == id) {
            var properties = items[i].getElementsByTagName("property");
            var args = new Array;
            for (var j = 0; j < properties.length; j++) {
                args[properties[j].getAttribute("name")] = properties[j].getAttribute("value");
            }
            return new JItem(id, args);
        }
    }
    return;
}

/**
 * id¿¡ ÇØ´çÇÏ´Â list ÅÂ±×ÀÇ ³»¿ëÀ» JItem °´Ã¼¸¦ ´ã°í ÀÖ´Â ¹è¿­·Î ¹ÝÈ¯ÇÑ´Ù.
 *
 * @param element response ÅÂ±×¸¦ ³ªÅ¸³»´Â DOM °´Ã¼
 * @param id ¾ÆÀÌµð. ¾ÆÀÌµð°¡ ¾ø´Â °æ¿ì¿¡´Â Ã¹¹øÂ° list ÅÂ±×°¡ ¹ÝÈ¯µÈ´Ù.
 */
function getList(element, id) {
    var lists = element.getElementsByTagName("list");
    for (var i = 0; i < lists.length; i++) {
        if (id == null || lists[i].getAttribute("id") == id) {
            var result = new Array;
            var items = lists[i].getElementsByTagName("item");
            for (var j = 0; j < items.length; j++) {
                var properties = items[j].getElementsByTagName("property");
                var args = new Array;
                for (var k = 0; k < properties.length; k++) {
                    args[properties[k].getAttribute("name")] = properties[k].getAttribute("value");
                }
                result[j] = new JItem(j, args);
            }
            return result;
        }
    }
    return new Array;
}



/*

    ¾Æ·¡´Â ¸®½ºÆ®¸¦ »õ·Ó°Ô ±×¸®¸¦ ÀÚ¹Ù ½ºÅ©¸³Æ® ÇÔ¼ö

*/

/**
 * Å×ÀÌºí ¸®½ºÆ®¸¦ ±×¸°´Ù.
 * 
 * @param id tbody ÅÂ±×ÀÇ ¾ÆÀÌµð
 * @param size Å×ÀÌºíÀÇ Ä®·³ ¼ö
 * @param countMessage ÃÑ ¸®½ºÅ© ¼ö¸¦ Ç¥ÇöÇÏ´Â ¸Þ½ÃÁö
 */
function renderList(id, size, countMessage) {
    var table = new JTable(id, size, new JTableFormat());    
    jprivate_clearTbody(id);
    var response = jprivate_request.responseXML.documentElement;
    var list = getList(response);
    for (var i = 0; i < list.length; i++) {
        table.createRow(list[i]);
    }
    jprivate_renderNavigation(response, countMessage);
}

/**
 * Å×ÀÌºíÀ» Æ÷¸äÇÏ´Â Å¬·¡½º
 */
function JTableFormat() {
    this.formatCell = formatCell;
}

/**
 * tbody ÅÂ±×ÀÇ ¸ðµç tr ÅÂ±×¸¦ Áö¿î´Ù.<b> 
 *
 * @param tbodyId tbody ÅÂ±×ÀÇ ¾ÆÀÌµð
 */
function jprivate_clearTbody(tbodyId) {
    var body = document.getElementById(tbodyId);
    if (!body) {
        alert("tbody ÅÂ±×ÀÇ ¾ÆÀÌµð¸¦ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù.");
    }
    var rows = body.getElementsByTagName("tr");
    for (var i = rows.length; i > 0; i--) {
        body.deleteRow(i - 1);
    }
}

/**
 * ¸®½ºÆ®ÀÇ ³×ºñ°ÔÀÌ¼Ç ¹Ù¸¦ µ¿ÀûÀ¸·Î ±×¸®´Â ÇÔ¼ö.
 * @param response XMLÀÇ response ÅÂ±×¸¦ ³ªÅ¸³»´Â element
 * @param countMessage ÃÑ ¸®½ºÅ© ¼ö¸¦ Ç¥ÇöÇÏ´Â ¸Þ½ÃÁö
 */
function jprivate_renderNavigation(response, countMessage) {
    var navigation = document.getElementById("navigationArea");
    if (!navigation) {
        return;
    }
    jprivate_tabSize = 10;
    jprivate_pageNo = document.forms[0].pageNo.value;
    jprivate_totalSize = response.getAttribute("totalSize");
    jprivate_listSize = response.getAttribute("listSize");

    var html = "";
    if (jprivate_lastPage() > 1) {
        html += "<a href='javascript:document.forms[0].pageNo.value=1;movePage()'>[Ã³À½]</a>&nbsp;";
    }
    if (jprivate_hasPreviousTab()) {
        html += "<a href='javascript:document.forms[0].pageNo.value=" + (jprivate_firstPageInTab() - 1) + ";movePage()'>[ÀÌÀü]</a>&nbsp;";
    }
    for (var i = jprivate_firstPageInTab(); i <= jprivate_lastPageInTab(); i++) {
        if (jprivate_pageNo == i) {
            html += "<strong>" + i + "</strong>&nbsp;";
        } else {
            html += "<a href='javascript:document.forms[0].pageNo.value=" + i + ";movePage()'>" + i + "</a>&nbsp;";
        }
    }
    if (jprivate_hasNextTab()) {
        html += "<a href='javascript:document.forms[0].pageNo.value=" + (jprivate_lastPageInTab() + 1) + ";movePage()'>[´ÙÀ½]</a>&nbsp;";
    }
    if (jprivate_lastPage() > 1) {
        html += "<a href='javascript:document.forms[0].pageNo.value=" + jprivate_lastPage() + ";movePage()'>[¸¶Áö¸·]</a>";
    }
    if (countMessage) {
        html += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + countMessage.replace(/\{0\}/, jprivate_totalSize);
    }
    navigation.innerHTML = html;
}

/**
 * ¸¶Áö¸· ÆäÀÌÁö ¹øÈ£¸¦ ¹ÝÈ¯ÇÑ´Ù. Ç×»ó Á¤¼öÇüÀ» ¹ÝÈ¯ÇÑ´Ù.
 */
function jprivate_lastPage() {
    return Math.floor(jprivate_totalSize / jprivate_listSize) + ((jprivate_totalSize % jprivate_listSize) != 0 ? 1 : 0);
}

/**
 * ÇöÀç ÅÇÀÇ ¹øÈ£¸¦ ¹ÝÈ¯ÇÑ´Ù. ÃÖ¼Ò °ªÀº 1ÀÌ¸ç Ç×»ó Á¤¼öÇüÀ» ¹ÝÈ¯ÇÑ´Ù.
 */
function jprivate_currentTab() {
    return 1 + Math.floor(((jprivate_pageNo - 1) / jprivate_tabSize));
}

/**
 * ÇöÀç ÅÇÀÇ ¹øÈ£°¡ 1º¸´Ù Å©¸é true¸¦, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ ¹ÝÈ¯ÇÑ´Ù.
 */
function jprivate_hasPreviousTab() {
    return jprivate_currentTab() > 1;
}

/**
 * ÇöÀç ÅÇ¿¡ ¸¶Áö¸· ÆäÀÌÁö ¹øÈ£°¡ Æ÷ÇÔµÇ¾î ÀÖÀ¸¸é false¸¦, ±×·¸Áö ¾ÊÀ¸¸é true¸¦ ¹ÝÈ¯ÇÑ´Ù.
 */
function jprivate_hasNextTab() {
    return (jprivate_currentTab() * jprivate_tabSize) - jprivate_lastPage() < 0;
}

/**
 * ÇöÀç ÅÇÀÇ Ã¹¹øÂ° ÆäÀÌÁö ¹øÈ£¸¦ ¹ÝÈ¯ÇÑ´Ù.
 */
function jprivate_firstPageInTab() {
    return ((jprivate_currentTab() - 1) * jprivate_tabSize) + 1;
}

/**
 * ÇöÀç ÅÇÀÇ ¸¶Áö¸· ÆäÀÌÁö ¹øÈ£¸¦ ¹ÝÈ¯ÇÑ´Ù.
 */
function jprivate_lastPageInTab() {
    return jprivate_hasNextTab() ? jprivate_currentTab() * jprivate_tabSize : jprivate_lastPage();
}

/**
 * objectÇüÅÂ·Î ¹ÞÀº ÆÄ¶ó¹ÌÅÍ¸¦ URLÇüÅÂ·Î ÀÎÄÚµå ÇÑ´Ù.
 */
function jprivate_parseParam(params) {
	if (typeof params == "string") return encodeURI(params);
	var sb = [];
	for(property in params){
		var value = params[property];
		if (typeof value == "object" && !!value.length){ // °ªÀÌ ¹è¿­ÀÌ¸é ¿ø¼Ò ÇÏ³ªÇÏ³ª¸¦  
		    for(var i = 0; i < value.length; i++){
		        sb.push(encodeURIComponent(property) + "=" + encodeURIComponent(value[i]));
		    }
		}else{
		    sb.push(encodeURIComponent(property) + "=" + encodeURIComponent(params[property]));
		}
	}
	return sb.join("&");
}

