//グローバル変数の定義
var httpObj;               // HTTP通信用オブジェクト
var timerId;               // HTTP通信用タイマーオブジェクト
var timeout_sec = 10;      // HTTP通信タイムアウト秒数
var code_list = new Array();  // 商品コードを格納する配列
var currentLine = -1;       // プルダウンのフォーカス行
var maxLine = 0;           // プルダウンの行数

function highlightMenu(e) {
    // 対象要素の参照を取得
    var target_node = getTargetNode(e);
    // ハイライト表示
    target_node.style.backgroundColor = '#ffffff';
    target_node.style.color = '#00bb00';

    currentLine = target_node.id.substring(1);
}

function lowlightMenu(e) {
    // 対象要素の参照を取得
    var target_node = getTargetNode(e);
    // ダウンライト表示
    target_node.style.backgroundColor = '#dddddd';
    target_node.style.color = '#000000';
}

function callMenu(e) {
    // ドロップダウンリストを削除
    eliminateDropdownList();

    // 対象要素の参照を取得
    var target_node = getTargetNode(e);

    // 対象要素のid属性値を取得
    var target_node_id = target_node.id;

    var target_id = code_list['id'];

    // 値をテキストボックスにセット
    document.getElementById( target_id ).value = code_list[target_node_id];
    document.getElementById( target_id ).focus();

    visibleControle( target_id, 0, "visible");
}

function toUpLine(e, param) {

    var sl;

    if ( currentLine < 0 ) {
        return;
    }

    if ( currentLine == 0 ) {
        currentLine = 0;
    } else {
        sl = currentLine;
        currentLine = currentLine - 1;
    }


    id = 'c' + sl;
    if( document.getElementById(id) ) {
        var target = document.getElementById(id);
        target.style.backgroundColor = '#dddddd';
        target.style.color = '#000000';
    }

    id = 'c' + currentLine;
    if( document.getElementById(id) ) {
        var target = document.getElementById(id);
        target.style.backgroundColor = '#ffffff';
        target.style.color = '#00bb00';
        target_node_id = target.id;
        document.getElementById(param).value = code_list[target_node_id];
    }

}
function toDownLine(e, param) {

    var sl;

    if ( currentLine >= maxLine ) {
        return;
    }

    sl = currentLine;
    currentLine = currentLine + 1;

    id = 'c' + sl;
    if( document.getElementById(id) ) {
        var target = document.getElementById(id);
        target.style.backgroundColor = '#dddddd';
        target.style.color = '#000000';
    }

    id = 'c' + currentLine;
    if( document.getElementById(id) ) {
        var target = document.getElementById(id);
        target.style.backgroundColor = '#ffffff';
        target.style.color = '#00bb00';
        target_node_id = target.id;
        document.getElementById(param).value = code_list[target_node_id];
    }

}

// ドロップダウンリストを削除
function eliminateDropdownList() {

    if( document.getElementById('dropframe') ) {
        var dropframe = document.getElementById('dropframe');
        dropframe.parentNode.removeChild(dropframe);
    }
}

function getTargetNode(e) {
    // 対象要素の参照を取得
    var target_node;
    if(e.target) {
      target_node = e.target;
    } else {
      target_node = e.srcElement;
    }
    // Safari対策
    if (target_node.nodeType == 3) {
        target_node = target_node.parentNode;
    }
    return target_node;
}


function getBrowser() {
    var browser = navigator.userAgent.toLowerCase();
    var type = "other";

    if ( browser.indexOf("msie") != -1 ) {
        type = "msie";
    } else if ( browser.indexOf("opera") != -1 ) {
        type = "opera";
    }

    return type;
}

function getWidth(e) {
    var browser = getBrowser();

    if ( browser == "msie" ) {
        return "205px";
    } else {
        return "200px";
    }
}

function getArrowKey(e) {
    var browser = getBrowser();


    if ( browser == "msie" || browser == "opera" ) {
        keycode = e.keyCode;
    } else {
        keycode = e.which;
    }

    return keycode;
}

// 要素の位置を取得し、オブジェクトとして返す
function getElemPos(elem) {
    var obj = new Object();
    obj.x = elem.offsetLeft;
    obj.y = elem.offsetTop;
    while(elem.offsetParent) {
       elem = elem.offsetParent;
       obj.x += elem.offsetLeft;
       obj.y += elem.offsetTop;
    }
    return obj;
}

// ドロップダウンリストを生成
function generateDropdownList(text_data, param) {

	var sg_codes = text_data.getElementsByTagName('sg_code');
	var codes = text_data.getElementsByTagName('code');
	var i;


        // 項目を追加
        var dropframe = document.createElement('div');
        dropframe.id = 'dropframe';

	if( codes.length <= 0 ) { return; }

        code_list['id'] = param;

        for(i=0; i < codes.length; i++) {
            var code = codes[i].firstChild.nodeValue;

            // id属性値
            var id_value = 'c' + i;

            // 配列にデータを蓄積
            code_list[id_value] = code;

            // divタグを生成
            var child_div = document.createElement('div');

            // divタグにid属性を追加
            child_div.id = id_value;

            // divタグのテキストノードを新規に生成する
            var caption = document.createTextNode(code);

            // 生成したテキストノードをdivタグノードの子ノードとして結合する
            child_div.appendChild(caption);

            // divタグを追加する。
            dropframe.appendChild(child_div);

            // divタグにイベントリスナーをセット
            addListener(child_div, 'mouseover', highlightMenu, false);
            addListener(child_div, 'mouseout', lowlightMenu, false);
            addListener(child_div, 'click', callMenu, false);
        }

        currentLine = -1;
        maxLine = i - 1;

        // ドロップダウンメニューを表示
        var code_elem = document.getElementById(param);
        var pos_obj = getElemPos(code_elem);
        pos_obj.y += document.getElementById(param).offsetHeight;
        dropframe.style.left = pos_obj.x + 'px';
        dropframe.style.top = pos_obj.y + 'px';
        dropframe.style.width = getWidth();
        document.body.appendChild(dropframe);

        if( codes.length >= 2 ) {
            visibleControle( param, codes.length, "hidden" );
        } else {
            visibleControle( param, codes.length, "visible" );
        }
}

function drawexecute( e, param ) {

    // 矢印キーの処理
    var arrowkey = getArrowKey(e);
    var upArrow   = 38;
    var downArrow = 40;


    if ( arrowkey == upArrow ) {
        toUpLine(e, param);
        return;
    } else if ( arrowkey == downArrow ) {
        toDownLine(e, param);
        return;
    }

    // ドロップダウンリストを削除
    eliminateDropdownList();

    // 商品コードの入力文字を取得
    var in_code = document.getElementById( param ).value;

    if ( in_code.length > 0 ) {
        var target_url;
        target_url = '/material/detailSearchSuggest.php?id=' + param + '&code=' + in_code;

        // HTTP通信を開始し、完了したら上記関数を実行させる
        httpXmlRequest(target_url, generateDropdownList, param);
    } else {
        visibleControle( param, 0, "visible" );
    }
}

function visibleControle( param, line, controle) {

    var target_elem;

    if ( param == "a_execution" ) {
        target_elem = document.getElementById("a_pref");
        target_elem.style.visibility = controle;
    }
    if ( param == "a_scale_note" ) {
        target_elem = document.getElementById("a_base_start_y");
        target_elem.style.visibility = controle;
        target_elem = document.getElementById("a_base_start_m");
        target_elem.style.visibility = controle;
        target_elem = document.getElementById("a_enforcement_end_y");
        target_elem.style.visibility = controle;
        //target_elem = document.getElementById("a_enforcement_end_m");
        //target_elem.style.visibility = controle;

        if ( line >= 8 && controle == "hidden" ) {
            target_elem = document.getElementById("a_start_y");
            target_elem.style.visibility = controle;
            target_elem = document.getElementById("a_start_m");
            target_elem.style.visibility = controle;
            target_elem = document.getElementById("a_completion_y");
            target_elem.style.visibility = controle;
            //target_elem = document.getElementById("a_completion_m");
            //target_elem.style.visibility = controle;
        }
        if ( controle == "visible" ) {
            target_elem = document.getElementById("a_start_y");
            target_elem.style.visibility = controle;
            target_elem = document.getElementById("a_start_m");
            target_elem.style.visibility = controle;
            target_elem = document.getElementById("a_completion_y");
            target_elem.style.visibility = controle;
            //target_elem = document.getElementById("a_completion_m");
            //target_elem.style.visibility = controle;
        }
    }
    if ( param == "a_plan_note" ) {
        target_elem = document.getElementById("a_start_y");
        target_elem.style.visibility = controle;
        target_elem = document.getElementById("a_start_m");
        target_elem.style.visibility = controle;
        target_elem = document.getElementById("a_completion_y");
        target_elem.style.visibility = controle;
        //target_elem = document.getElementById("a_completion_m");
        //target_elem.style.visibility = controle;
    }
    if ( param == "ai_magazine" ) {
        target_elem = document.getElementById("ai_publish_s_y");
        target_elem.style.visibility = controle;
        target_elem = document.getElementById("ai_publish_s_m");
        target_elem.style.visibility = controle;
        target_elem = document.getElementById("ai_publish_e_y");
        target_elem.style.visibility = controle;
        //target_elem = document.getElementById("ai_publish_e_m");
        //target_elem.style.visibility = controle;
    }
}

// 引数に与えられたURLにHTTPリクエストを行ない、指定された関数を実行
function httpXmlRequest(target_url, functionReference, param) {
    try {
        if(window.XMLHttpRequest) {
            httpObj = new XMLHttpRequest();
        } else if(window.ActiveXObject) {
            httpObj = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            httpObj = false;
        }
    } catch(e) {
        httpObj = false;
    }
    if(! httpObj) {
        httpObjGenerateFail();
    }
    // タイマーをセット
    //timerId = setInterval('timeoutCheck()', 1000);

    httpObj.open("GET", target_url, true);
    httpObj.onreadystatechange = function() {
        //clearInterval(timerId);
        if (httpObj.readyState == 4) {
            if (httpObj.status == 200) {
                functionReference(httpObj.responseXML, param);
            } else {
                alert(httpObj.status + ' : ' + httpObj.statusText);
                return false;
            }
        }
    }
    httpObj.send('');
}

// XMLHttpRequestオブジェクト生成に失敗した場合の処理
function httpObjGenerateFail() {
    alert('ご利用のブラウザーでは、当サイトをご利用頂けません。');
    return false;
}
// HTTPタイムアウト処理
function timeoutCheck() {
    timeout_sec --;
    if(timeout_sec <= 0) {
        // タイマーをストップする
        clearInterval(timerId);
        // HTTPリクエストを中断する
        httpObj.abort();
        // エラーダイアログを表示
        alert('タイムアウトです。');
        return false;
    }
}

// テキストの内容をドロップダウンリストとして表示
function a_name_list_el(e) {
    eliminateDropdownList();
}
function a_office_list_el(e) {
    eliminateDropdownList();
}
function a_designer_list_el(e) {
    eliminateDropdownList();
}
function a_execution_list_el(e) {
    eliminateDropdownList();
    visibleControle( "a_execution", 0, "visible");
}
function a_addr_list_el(e) {
    eliminateDropdownList();
}
function a_kind_list_el(e) {
    eliminateDropdownList();
}
function a_structure_list_el(e) {
    eliminateDropdownList();
}
function a_zone_list_el(e) {
    eliminateDropdownList();
}
function a_ground_note_list_el(e) {
    eliminateDropdownList();
}
function a_floor_note_list_el(e) {
    eliminateDropdownList();
}
function a_scale_list_el(e) {
    eliminateDropdownList();
}
function a_scale_note_list_el(e) {
    eliminateDropdownList();
    visibleControle( "a_scale_note", 0, "visible");
}
function a_plan_note_list_el(e) {
    eliminateDropdownList();
    visibleControle( "a_plan_note", 0, "visible");
}
function a_execution_note_list_el(e) {
    eliminateDropdownList();
}
function a_tag_list_el(e) {
    eliminateDropdownList();
}
function ai_caption_list_el(e) {
    eliminateDropdownList();
}
function ai_magazine_list_el(e) {
    eliminateDropdownList();
    visibleControle( "ai_magazine", 0, "visible");
}
function ai_owner_list_el(e) {
    eliminateDropdownList();
}
function ai_guide_list_el(e) {
    eliminateDropdownList();
}
function ai_note_list_el(e) {
    eliminateDropdownList();
}
function ai_tag_list_el(e) {
    eliminateDropdownList();
}

function a_name_list(e) {
	drawexecute( e, 'a_name' );
}
function a_office_list(e) {
	drawexecute( e, 'a_office' );
}
function a_designer_list(e) {
	drawexecute( e, 'a_designer' );
}
function a_execution_list(e) {
	drawexecute( e, 'a_execution' ) ;
}
function a_addr_list(e) {
	drawexecute( e, 'a_addr' ) ;
}
function a_kind_list(e) {
	drawexecute( e, 'a_kind' ) ;
}
function a_structure_list(e) {
	drawexecute( e, 'a_structure' ) ;
}
function a_zone_list(e) {
	drawexecute( e, 'a_zone' ) ;
}
function a_ground_note_list(e) {
	drawexecute( e, 'a_ground_note' ) ;
}
function a_floor_note_list(e) {
	drawexecute( e, 'a_floor_note' ) ;
}
function a_scale_list(e) {
	drawexecute( e, 'a_scale' ) ;
}
function a_scale_note_list(e) {
	drawexecute( e, 'a_scale_note' ) ;
}
function a_plan_note_list(e) {
	drawexecute( e, 'a_plan_note' ) ;
}
function a_execution_note_list(e) {
	drawexecute( e, 'a_execution_note' ) ;
}
function a_tag_list(e) {
	drawexecute( e, 'a_tag' ) ;
}
function ai_caption_list(e) {
	drawexecute( e, 'ai_caption' ) ;
}
function ai_magazine_list(e) {
	drawexecute( e, 'ai_magazine' ) ;
}
function ai_owner_list(e) {
	drawexecute( e, 'ai_owner' ) ;
}
function ai_guide_list(e) {
	drawexecute( e, 'ai_guide' ) ;
}
function ai_note_list(e) {
	drawexecute( e, 'ai_note' ) ;
}
function ai_tag_list(e) {
	drawexecute( e, 'ai_tag' ) ;
}


// イベントリスナーをセットする
function setListeners(e) {
    var code = document.getElementById('a_name');
    addListener(code, 'keyup', a_name_list, false);
    addListener(code, 'mousedown', a_name_list_el, false);

    var code = document.getElementById('a_office');
    addListener(code, 'keyup', a_office_list, false);
    addListener(code, 'mousedown', a_office_list_el, false);

    var code = document.getElementById('a_designer');
    addListener(code, 'keyup', a_designer_list, false);
    addListener(code, 'mousedown', a_designer_list_el, false);

    var code = document.getElementById('a_execution');
    addListener(code, 'keyup',a_execution_list, false);
    addListener(code, 'mousedown',a_execution_list_el, false);

    var code = document.getElementById('a_addr');
    addListener(code, 'keyup',a_addr_list, false);
    addListener(code, 'mousedown',a_addr_list_el, false);

    var code = document.getElementById('a_kind');
    addListener(code, 'keyup',a_kind_list, false);
    addListener(code, 'mousedown',a_kind_list_el, false);

    var code = document.getElementById('a_structure');
    addListener(code, 'keyup',a_structure_list, false);
    addListener(code, 'mousedown',a_structure_list_el, false);

    var code = document.getElementById('a_zone');
    addListener(code, 'keyup',a_zone_list, false);
    addListener(code, 'mousedown',a_zone_list_el, false);

    var code = document.getElementById('a_ground_note');
    addListener(code, 'keyup',a_ground_note_list, false);
    addListener(code, 'mousedown',a_ground_note_list_el, false);

    var code = document.getElementById('a_floor_note');
    addListener(code, 'keyup',a_floor_note_list, false);
    addListener(code, 'mousedown',a_floor_note_list_el, false);

    var code = document.getElementById('a_scale');
    addListener(code, 'keyup',a_scale_list, false);
    addListener(code, 'mousedown',a_scale_list_el, false);

    var code = document.getElementById('a_scale_note');
    addListener(code, 'keyup',a_scale_note_list, false);
    addListener(code, 'mousedown',a_scale_note_list_el, false);

    var code = document.getElementById('a_plan_note');
    addListener(code, 'keyup',a_plan_note_list, false);
    addListener(code, 'mousedown',a_plan_note_list_el, false);

    var code = document.getElementById('a_execution_note');
    addListener(code, 'keyup',a_execution_note_list, false);
    addListener(code, 'mousedown',a_execution_note_list_el, false);

    var code = document.getElementById('a_tag');
    addListener(code, 'keyup',a_tag_list, false);
    addListener(code, 'mousedown',a_tag_list_el, false);

    var code = document.getElementById('ai_caption');
    addListener(code, 'keyup',ai_caption_list, false);
    addListener(code, 'mousedown',ai_caption_list_el, false);

    var code = document.getElementById('ai_magazine');
    addListener(code, 'keyup',ai_magazine_list, false);
    addListener(code, 'mousedown',ai_magazine_list_el, false);

    var code = document.getElementById('ai_owner');
    addListener(code, 'keyup',ai_owner_list, false);
    addListener(code, 'mousedown',ai_owner_list_el, false);

    var code = document.getElementById('ai_guide');
    addListener(code, 'keyup',ai_guide_list, false);
    addListener(code, 'mousedown',ai_guide_list_el, false);

    var code = document.getElementById('ai_note');
    addListener(code, 'keyup',ai_note_list, false);
    addListener(code, 'mousedown',ai_note_list_el, false);

    var code = document.getElementById('ai_tag');
    addListener(code, 'keyup',ai_tag_list, false);
    addListener(code, 'mousedown',ai_tag_list_el, false);

}

// イベントリスナー登録
function addListener(elem, eventType, func, cap) {
    if(elem.addEventListener) {
        elem.addEventListener(eventType, func, cap);
    } else if(elem.attachEvent) {
        elem.attachEvent('on' + eventType, func);
    } else {
        alert('ご利用のブラウザーはサポートされていません。');
        return false;
    }
}

// load時のイベントリスナーをセットする
addListener(window, 'load', setListeners, false);

