/**
    file   : xmlhttp.js

    description :
        For this web site applcation javascript function.
        Function list:
            ‧function push_page(page_file_name, target_id)
                └ Push a xmlhttp page to array stack, but don't process.
            ‧function get_page(page_file_name, target_id)
                └ Push a xmlhttp page to array stack and process.
            ‧function auto_refresh_object(page_file_name, target_id, TimerID)
                └ Execute xmlhttp page and create interval timer object.
            ‧function _get_page()
                └ NOTE : Don't direct call this function,
                          because this function is for interval read array stack xmlhttp page.
            ‧function check()
                └ NOTE : Don't direct call this function,
                          because this function is for xmlhttp commucation of
                          onReadyStateChange event function.
            ‧function ajaxPostRequest(url, formID, target_id)
                └ Use xmlhttp to simulate a form submit action.
            ‧function createXmlHttp()
                └ NOTE : Don't direct call this function.
                          because this function is for other function create xmlhttp object.


            INSIDE PAGE TOOL FUNCTION LIST :
            ‧function loadOtherFrame(frameName, frameURL)
            ‧function CloseClicked()
            ‧function OpenWindow(Href, h, w)
            ‧function bodyOnLoad(M_ROOT_URL, SESSION_ID)
            ‧function rad_onchange_event(rad_obj, obj)
            ‧function add_value_func(Obj1, Obj2, rad_obj1, rad_obj2)
            ‧function odd_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function even_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function high_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function low_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function team1_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function team2_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function m_win_add_value(oFORM, rad_obj1, rad_obj2)
            ‧function s_win_add_value(oFORM, rad_obj1, rad_obj2)

    author : warppeddogskinscat.dnsdojo.net

    date   : 2006/10/27

 **/

/*-------------
| GLOBAL VARS |
-------------*/
DEBUG_MODE = false;
DEBUG_MODE_AUTO_CLEAN = false;  // 目前在 get_page 有效

g_defaultResponsesId = "content_area";
g_responsesId = g_defaultResponsesId;
g_requestStack = new Array();
g_responsesIdStack = new Array();
g_urlRequestStack = new Array();

interval_second_list = new Array();
TimerID = null;
interval_url_request = new Array();

div_update_photo = "div_update_photo";
div_debug_area = "debug_area";

/**
 * output debug function to client page for display
 **/
function debugMsg(msg)
{
    if (DEBUG_MODE)
    {
        DebugAreaNode = document.getElementById(div_debug_area)

        if (DebugAreaNode)
            DebugAreaNode.innerHTML +=  msg + "<br/>";
    }
}
/**
 * 只將靜態頁面推入堆疊但不執行
 **/
function push_page(page_file_name, target_id)
{
    g_requestStack.push(page_file_name);
    g_responsesIdStack.push(target_id);
    g_urlRequestStack.push(false);
    interval_second_list.push(0);

    debugMsg("<b>push_page :</b> " + page_file_name);
}

/**
 * 只將定期更新頁面推入堆疊但不執行
 **/
function push_auto_page(page_file_name, target_id, interval_second)
{
    g_requestStack.push(page_file_name);
    g_responsesIdStack.push(target_id);
    g_urlRequestStack.push(true);
    interval_second_list.push(interval_second);

    debugMsg("<b>push_auto_page :</b> " + page_file_name);
}

/**
 * 由遠端載入一份網頁到 指定的 target_id 元素
 **/
function get_page(page_file_name, target_id)
{
    if (DEBUG_MODE_AUTO_CLEAN)
    {
        document.getElementById(div_debug_area).innerHTML = '';
    }

    debugMsg("<b>get_page :</b> " + page_file_name);

    /**
     * 檢查自動更新陣列
     * 若 target_id 相同, 但要啟動的頁面不同, 就把 timer 停掉, 且把記錄刪掉
     * PS: 這種情況是因為是由 程式直接呼叫 get_page 沒透過 get_auto_refresh_page()
     *     所以沒記錄, 故代表目前要送出的頁面是不需要定期更新的
     **/
    for(var i = 0; i < interval_url_request.length; i ++)
    {
        if (interval_url_request[i].target_id == target_id &&
            interval_url_request[i].page_file_name != page_file_name)
        {
            // (1) 停掉 timer
            clearInterval(interval_url_request[i].TimerID);
            // (2) 從陣列中移除此項目 (沒找到移除陣列元素的指令, 故先把內容清掉)
            interval_url_request[i].page_file_name = '';
            break;
        }
    }

    // 啟動頁面
    push_page(page_file_name, target_id);

    if (TimerID == null)
    {
        TimerID = setTimeout("_get_page()", 100);
    }
    return false;
}

/**
 * 用來記錄自動更新的物件宣告 (此物件類別是用來判斷啟動自動更新或暫停更新頁面的情況)
 **/
function auto_refresh_object(page_file_name, target_id, TimerID)
{
    this.target_id          = target_id;
    this.page_file_name     = page_file_name;
    this.TimerID            = TimerID;
    this.first_time_loading = true;
}

/**
 * 啟動一個自動定時載入的網頁
 **/
function get_auto_refresh_page(page_file_name, target_id, interval_second)
{
    // 檢查 target_id 是否已經有另一頁佔用
    var found_obj = null;
    for(var i = 0; i < interval_url_request.length; i ++)
    {
        if (interval_url_request[i].target_id == target_id)
        {
            // 發現 !! 的確有一頁正在使用
            found_obj = interval_url_request[i];
            break;
        }
    }
    // 目前沒被佔用 ?
    if (found_obj == null)
    {
        // (1) 先啟動第一次
        get_page(page_file_name, target_id);

        // (2) 馬上跟著設定 interval timer, 以啟動下一次的更新
        if (target_id == null)
        {

            autoRefreshTimerID =
                setInterval("get_page('" + page_file_name + "' , null);", 1000 * interval_second);
        }
        else
        {
            autoRefreshTimerID =
                setInterval("get_page('" + page_file_name + "' , '" + target_id + "');", 1000 * interval_second);
        }

        // (3) 產生一個自動定時物件定義
        auto_refresh_page = new auto_refresh_object(page_file_name, target_id, autoRefreshTimerID);

        // (4) 儲存此定義
        interval_url_request.push(auto_refresh_page);
    }
    else    // 目前已被佔用 ?
    {
        // (1) 先啟動第一次
        get_page(page_file_name, target_id);

        clearInterval(found_obj.TimerID);         // stop old timer
        if (target_id == null)
        {
            autoRefreshTimerID =
                setInterval("get_page('" + page_file_name + "' , null);", 1000 * interval_second);
        }
        else
        {
            autoRefreshTimerID =
                setInterval("get_page('" + page_file_name + "' , '" + target_id + "');", 1000 * interval_second);
        }
        found_obj.TimerID = autoRefreshTimerID;     // change new timer
        found_obj.page_file_name = page_file_name;  // modify to new page file name
        found_obj.first_time_loading = true;
    }
}

/**
 * For auto refresh html page. Using timer interval time load and implement.
 **/
function _get_page()
{
    var page_file_name = g_requestStack.pop();
    var target_id = g_responsesIdStack.pop();
    var auto_refresh_flag = g_urlRequestStack.pop();
    var interval_second   = interval_second_list.pop();

    debugMsg("<b>_get_page()</b> ");

    // 若是自動更新頁面, 切換到另一程序
    if(auto_refresh_flag == true)
    {
        get_auto_refresh_page(page_file_name, target_id, interval_second);

        // 清掉計數器指標
        TimerID = null;
        // 若仍有未完成的傳輸工作
        if (g_requestStack.length > 0)
        {
            // 繼續未完成的工作
            TimerID = setTimeout("_get_page()", 100);
        }
        return false;
    }

    if (page_file_name == null)
        return false;

    g_responsesId = g_defaultResponsesId;

    if (target_id != null)
    {
        g_responsesId = target_id;
    }

    // 如果沒辦法取得 目標元素位置, 就不用再繼續了
    if (document.getElementById(g_responsesId) == null)
    {
        // 在這種情況下, 確定一下是否是因為 "自動更新物件" 所造成的
        for(var i = 0; i < interval_url_request.length; i ++)
        {
            if (interval_url_request[i].target_id == target_id)
            {
                // 確定是, 將其 timer 停掉
                clearInterval(interval_url_request[i].TimerID);
                interval_url_request[i].page_file_name = '';
            }
        }

        // 清掉計數器指標
        TimerID = null;
        // 若仍有未完成的傳輸工作
        if (g_requestStack.length > 0)
        {
            // 安排下一個執行工作
            TimerID = setTimeout("_get_page()", 100);
        }
        return false;
    }

    xmlhttp = createXmlHttp();
    if (xmlhttp)
    {
        // 如果是自動更新的頁面, 不要顯示 "載入圖"

        var is_auto_refresh_page = false;
        for(i = 0; i < interval_url_request.length; i ++)
        {
            if (interval_url_request[i].target_id == target_id &&
                interval_url_request[i].page_file_name == page_file_name)
            {
                if (interval_url_request[i].first_time_loading == false)
                {
                    is_auto_refresh_page = true;
                }
                else
                {
                    interval_url_request[i].first_time_loading = false;
                }
            }
        }
        xmlhttp.onreadystatechange = check;  // 在 event onReadyStateChange 時 執行 check()
        xmlhttp.open("GET", page_file_name, true);
        xmlhttp.send(null);
    }
    return false;
}

//------------------------------------------------------------------------------
function check()
{
    debugMsg("<b>check()</b> ");
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
    {
        try
        {
            debugMsg("step_0");
            var new_msg = xmlhttp.responseText;
            // no error ? (若發生 paser error 就不處理)
            debugMsg("step_1");
            var content_area_obj = document.getElementById(g_responsesId);
            if (content_area_obj == null)
            {
                debugMsg("目標元素指標為 null !! (STEP1)");
            }
            debugMsg("step_2");
            if (content_area_obj != null)
            {
                debugMsg("step_2_1");
                debugMsg(xmlhttp.responseText);

                content_area_obj.innerHTML = '';



                content_area_obj.innerHTML = new_msg ;

                debugMsg("step_2_2");
                // 清掉計數器指標
                TimerID = null;
                // 若仍有未完成的傳輸工作
                if (g_requestStack.length > 0)
                {
                    // 繼續未完成的工作
                    TimerID = setTimeout("_get_page()", 100);
                }
                debugMsg("step_3");

                var loading_graphic_obj = document.getElementById(div_update_photo);
                if (loading_graphic_obj != null)
                {
                    debugMsg("step_4");
                    loading_graphic_obj.innerHTML = '';
                }
            }
            else
            {
                debugMsg("step_5");
                alert('無法找到 內容目標 物件');

                // 若仍有未完成的傳輸工作
                if (g_requestStack.length > 0)
                {
                    // 繼續未完成的工作
                    TimerID = setTimeout("_get_page()", 100);
                }
                debugMsg("step_6");
                var loading_graphic_obj = document.getElementById(div_update_photo);
                if (loading_graphic_obj != null)
                {
                    loading_graphic_obj.innerHTML = '';
                }

                debugMsg("step_7");
            }
        }
        catch(e)
        {
            debugMsg("step_8");
            var msggg = '';
            for(i in e)
            {
                msggg += i + "=" + e[i] + " ";
            }

            if (xmlhttp == null)
                debugMsg("xmlhttp is null !!");

            for(i in xmlhttp)
            {
                msggg += "<br/>";
                msggg += i + " = " + xmlhttp[i];
            }

            debugMsg(e["message"] + "<br/>" + msggg);

            setTimeout("_get_page()", 100);
        }
    }
}

//------------------------------------------------------------------------------
// 使用 xmlHttp 傳送 POST 請求, 並回饋到指定的網頁
// url => 伺服程式的網址 (可以包含 GET 請求)

// targetID => 目標元素代號
// multipart => false 一般 post or get 協定 true -> 檔案上傳用協定


/**
 * Post request using xmlhttp object, and feedback responses replace targetId
 * dom-node.
 * @return false (for turn-off submit action.)
 **/
multipart = false;
function postRequest(url, formId, targetId, thisObj)
{
    // Get from element.
    var formNode = document.getElementById(formId);
    if (formNode == null)
    {
        alert("formObj can't be null !!");
        return;
    }

    // Get form inside elements.
    var inputParams    = formNode.getElementsByTagName("input");
    var selectParams   = formNode.getElementsByTagName("select");
    var textareaParams = formNode.getElementsByTagName("textarea");

    if (url == null || url == '')
        url = location.href;

    // param => post 參數 EX: 若要送出 a=1 及 b=2 以及 c=3 要寫成 "a=1&b=2&c=3" 格式
    var param = "";
    var spritChar = "";
    var debugInfo = "";

    // Prepare input element post value.
    for(var i = 0; i < inputParams.length; i++)
    {

        var elm     = inputParams[i];
        var name    = elm.name;
        var tagName = elm.tagName.toLowerCase();
        var type    = elm.type.toLowerCase();

        if (type == "checkbox" || type == "radio")
        {
            if (elm.checked)
            {
                param       += spritChar + name + "=" + inputParams[i].value;
                debugInfo   += "<font color=blue>" + name +
                               "=" + inputParams[i].type + "</font><br/>";
            }

        }
        else
        {
            if (type != "button" || (type == "button" && elm == thisObj))
            {
                param       += spritChar + name + "=" + inputParams[i].value;
                debugInfo   += name + "=" + inputParams[i].type + "<br/>";
            }
        }
        spritChar   = "&";
    }

    // Prepare select element post value.
    for(i in selectParams)
    {
        var elm     = selectParams[i];
        var name    = elm.name;

        param       += spritChar + name + "=" + selectParams[i].value;
        spritChar   = "&";
    }

    // Prepare textarea element post value.
    for(i in textareaParams)
    {
        var elm     = textareaParams[i];
        var name    = elm.name;

        param       += spritChar + name + "=" + textareaParams[i].value;
        spritChar   = "&";
    }


    // 指定目標元素
    g_responsesId = g_defaultResponsesId;

    if (targetId != null)
    {
        g_responsesId = targetId;
    }

    // 建立 xml http ActiveX 物件
    xmlhttp = createXmlHttp();

    // 若 xmlhttp 建立成功
    if (xmlhttp)
    {
        // 在滑鼠點選的位置繪出載入 gif 動畫
        var mouse_x = 0;
        var mouse_y = 0;

        if (document.all)
        {
            win_w = event.clientX + document.body.scrollLeft - 8;
            win_h = event.clientY + document.body.scrollTop - 8;
        }
        else
        {
            win_w = 100;
            win_h = 100;
        }

        // 先在目標元素位置顯示 loading gif 動畫
        var loading_graphic_obj = document.getElementById(div_update_photo);
        if (loading_graphic_obj != null)
        {
            loading_graphic_obj.style.position  = "absolute";
            loading_graphic_obj.style.left      = win_w;
            loading_graphic_obj.style.top       = win_h;
            loading_graphic_obj.innerHTML       = "<center><img src='loading.gif'><center>";
        }

        // 安排 onreadystatechange 事件 callback function
        xmlhttp.onreadystatechange = check;

        if (formNode.method == null)
        {
            formNode['method'] = "post";
        }

        if (formNode.method.toLowerCase() == "get")
        {
            if (url.indexOf("?") == -1)
            {
                url += "?" + param; // 找不到 '?' 時, 先用 '?' 連接
            }
            else
            {
                url += "&" + param; // 已經有 '?', 用 '&' 連接
            }
        }

        // 開啟通訊
        xmlhttp.open(formNode.method, url, true);

        // 設定請求標頭
        if (formNode.method.toLowerCase() == "post")
        {
            if (multipart == true)
            {   // 上傳檔案使用的模式
                xmlhttp.setRequestHeader("Content-Type", "multipart/form-data, boundary=45309FFF-BD65-4d50-99C9-36986896A96F");
                multipart = false; // 傳送一次之後關掉 (以免下次進入又使用到)
            }
            else
            {
                xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
            }
        }
        // 送出參數
        if (formNode.method.toLowerCase() == "get")
        {
            xmlhttp.send(null);
        }
        else
        {
            xmlhttp.send(param);
        }
    }
    return false;
}

/**
 * Create XMLHttp Object
 **/
function createXmlHttp()
{
    try
    {
        debugMsg("create Microsoft.XMLHTTP");
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch(e)
    {
        try
        {
            return new XMLHttpRequest();
        }
        catch(e)
        {
            return null;
        }
    }
}

/**
 * Implement another frame update.
 **/
function loadOtherFrame(frameName, url_request)
{
    frameName.location.href=url_request;
}
