/** 左メニュー表示速度 */
var MENU_OPEN_SPEED = 1;

/** 表示用class名称 */
var CLASS_OPEN_AREA = "open_area";

/** 非表示用class名称 */
var CLASS_CLOSE_AREA = "close_area";

/**
 * documentの初期化処理
 *
 */
function init(){

    // ブラウザ判定
    checkBrowser();

    // エンター制御
    initOnKeyPress4InputItems();
}


/**
 * IDで指定した範囲内の表示／非表示エリアのclass属性を切り替えを行う。
 * ここで入れ替えの対象となるclass属性は、"open_area"と"close_area"とする。
 *
 * @params id 処理対象のID
 * @params obj トリガーとなるラジオボタン(thisで渡す)
 */
function replaceArea(id, obj){

    var addArea = document.getElementById(id);
    if(addArea == null || obj == null){
        return;
    }

    var activeValue = addArea.getAttribute("activeValue");
    if(activeValue == null && obj.defaultChecked){
        return;
    }else if(activeValue != null && obj.value == activeValue){
        return;
    }else{
        addArea.setAttribute("activeValue", obj.value);
    }

    var allTbody = addArea.getElementsByTagName('tbody');
    changeClass(allTbody, CLASS_OPEN_AREA, CLASS_CLOSE_AREA);

    var allP = addArea.getElementsByTagName('p');
    changeClass(allP, CLASS_OPEN_AREA, CLASS_CLOSE_AREA);

    var allSpan = addArea.getElementsByTagName('span');
    changeClass(allSpan, CLASS_OPEN_AREA, CLASS_CLOSE_AREA);
}

/**
 * Elementに設定されているclassの値を入れ替えます。
 * 引数で受け取ったclassAとclassBの入れ替えをします。
 *
 * @params elementArray elementの配列
 * @params classA 入れ替え対象のクラス。
 * @params classB 入れ替え対象のクラス。
 */
function changeClass(elementArray, classA, classB){

    for(var i = 0; i< elementArray.length; i++){
        if(elementArray[i].className){

            if(elementArray[i].className.match(/ /i)){
                // 複数クラスの場合

                var classArray = elementArray[i].className.split(" ");
                var newClassValue = "";

                for(var j = 0; j < classArray.length; j++){

                    if(classArray[j] == classB){
                        classArray[j] = classA;
                    }else if(classArray[j] == classA){
                        classArray[j] = classB;
                    }

                    newClassValue = newClassValue + classArray[j] + " ";
                }

                newClassValue = newClassValue.substring(0,newClassValue.length-1);
                elementArray[i].className = newClassValue;

            }else{
                // 単独クラスの場合

                if(elementArray[i].className == classB){
                    elementArray[i].className = classA;
                }else if(elementArray[i].className == classA){
                    elementArray[i].className = classB;
                }
            }

        }
    }

}

/**
 * ポップアップウィンドウを表示します。
 *
 * @params url 表示するページのパス
 * @params name ウィンドウ名（null可）
 * @params width 幅
 * @params height 高さ
 */
function popup(url, name, width, height){
    var features='menubar=yes, toolbar=no, location=no, status=no, resizable=yes,scrollbars=yes';

    if (width) {
        width = width + 20;
        if (window.screen.width > width){
            features+=", left="+(window.screen.width-width)/2;
        }else{
            width=window.screen.width;
        }
        features+=", width="+width;
    }
    if (height) {
        if (window.screen.height > height)
        features+=", top="+(window.screen.height-height)/2;
        else height=window.screen.height;
        features+=", height="+height;
    }

    window.open(url,name,features);
}

/**
 * 500（横）×H400（高さ）のポップアップウィンドウを表示します。<br>
 * 主に説明程度の内容表示に使用します。
 *
 * @params page 表示するページのパス
 * @params name ウィンドウ名（null可）
 */
function popupSizeM(page, name){
    popup(page, name,970,600);
}

/**
 * 800（横）×H400（高さ）のポップアップウィンドウを表示します。<br>
 * 主に入力を伴う画面表示に使用します。
 *
 * @params page 表示するページのパス
 * @params name ウィンドウ名（null可）
 */
function popupSizeL(page, name){
    popup(page, name,970,600);
}


/**
 * 共通の確認ダイアログ表示
 * 以下のように利用してください
 * <s2struts:submit onclick="return DialogUtil.confirmXxx()" ～
 */
DialogUtil = {

    //登録
    confirmRegister : function(){
        return DialogUtil.confirmBody("登録します。\nよろしいですか？");
    },
    //削除
    confirmDelete : function(){
        return DialogUtil.confirmBody("削除します。\nよろしいですか？");
    },
    //変更
    confirmUpdate : function(){
        return DialogUtil.confirmBody("変更します。\nよろしいですか？");
    },
    //保存
    confirmSave : function(){
        return DialogUtil.confirmBody("保存します。\nよろしいですか？");
    },
    //設定
    confirmSet : function(){
        return DialogUtil.confirmBody("設定します。\nよろしいですか？");
    },
    //ファイルアップロード処理
    confirmUpload : function(){
        return DialogUtil.confirmBody("ファイルをアップロードします。 \nよろしいですか？");
    },
    //出力（ファイルダウンロード）
    confirmDownload : function(){
        return DialogUtil.confirmBody("ファイルをダウンロードします。\nよろしいですか。");
    },
    //確定
    confirmFix : function(){
        return DialogUtil.confirmBody("この内容で確定します。\nよろしいですか。");
    },
    //全件クリア
    confirmClearAll : function(){
        return DialogUtil.confirmBody("全件クリアします。\nよろしいですか。");
    },
    //クリア
    confirmClear : function(){
       return DialogUtil.confirmBody("クリアします。\nよろしいですか？");
    },
    //キャンセル
    confirmCancel : function(){
        return DialogUtil.confirmBody("キャンセルします。\nよろしいですか？");
    },
    //予約
    confirmReservation : function(){
        return DialogUtil.confirmBody("予約します。\nよろしいですか？");
    },
    //予約キャンセル
    confirmReservationCancel : function(){
        return DialogUtil.confirmBody("予約キャンセルします。\nよろしいですか？");
    },
    //ユーザ定義形
    confirmCustom : function(paramStr){
        return DialogUtil.confirmBody(paramStr);
    },
    //ConfirmDialog本体
    confirmBody : function(paramStr){
        return confirm(paramStr);
    }
}

/**
 * 親子関係にあるプルダウンの中身を置き換えます。<br>
 * 親プルダウンの選択値により、子プルダウンの値を置き換えます。<br>
 * 子プルダウンの値は、「options_xx」により個別に定義する必要があります。<br>
 * また、「options_def_xx」は初期値を設定する場合に使用してください。<br>
 * "xx"には、親のプルダウンのvalue値を使用してください。<br>
 *
 * @params id 置き換え対象エレメントのID（子プルダウンとなるエレメントのID）
 * @params parentObj 親プルダウンのオブジェクト（thisで指定してください）
 * @params blankFlg プルダウンの最初に空optionを付けるためのフラグ
 */
var OPTIONS_KEY = "options_";
var OPTIONS_DEF_KEY = "options_def_";
function replaceOptions(id, parentObj, blankFlg){

    /**
     * 子エレメントを削除します。<br>
     *
     * @params element 削除対象の親エレメント
     */
    function removeChild(element){
        for (var i =element.childNodes.length-1; i>=0; i--) {
            element.removeChild(element.childNodes[i]);
        }
    }

    /**
     * optionエレメントを生成します。<br>
     *
     * @params value optionのvalue属性値
     * @params text optionのtext値
     * @params defValue optionの初期値
     */
    function createOptionElement(value, text, defValue){
        optionElement = document.createElement('option');
        optionElement.setAttribute("value", value);
        if(defValue == value) optionElement.setAttribute("selected", "selected");
        optionElement.appendChild(document.createTextNode(text));
        return optionElement;
    }

    var selectElement = document.getElementById(id);
    if(selectElement == null){
        return;
    }else{
        removeChild(selectElement)
    }

    var optionElement;
    if(blankFlg){
        optionElement = createOptionElement("", "");
        selectElement.appendChild(optionElement);
    }

    var optionData = eval("try { "+OPTIONS_KEY+parentObj.value+"; } catch (error) { null; }");
    var optionDefValue = eval("try { "+OPTIONS_DEF_KEY+parentObj.value+"; } catch (error) { null; }");
    for (var i in optionData) {
        optionElement = createOptionElement(i, optionData[i], optionDefValue);
        selectElement.appendChild(optionElement);
    }
}

/**
 * メインウィンドウの存在をチェックしエラー場面に表示するボタンの表示／非表示を制御。<br>
 * エラー画面にてボタンをハンドリングするために使用します。
 *
 */
function initButton(){

    if(!window.opener || window.opener.closed){
        document.getElementById("WindowClose").style.display = "none";
    }else{
        document.getElementById("WindowBack").style.display = "none";
    }
}

/*
 * チェックボックスを全て選択／解除する
 */
function changeCheckboxStatus(triggerId, prefixId) {
    var boxValue = document.getElementById(triggerId).checked;

    var checkboxNumber = 1;
    while (checkboxNumber < 10000) {
        var checkboxObject = document.getElementById(prefixId + checkboxNumber);
        if (!checkboxObject) {
          break;
        }
        checkboxObject.checked = boxValue;
        checkboxNumber++;
    }
}

/*
 * InputタグonKeyPressイベントを初期化します。
 */
function initOnKeyPress4InputItems(){

    /*
     * Elementのtype属性から初期化対象かチェックします。
     */
    function isNotEnterElement(element){

        var inputType = element.getAttribute("type");
        var flg = false;

        if(inputType == null){
            return flg;
        }else{
            inputType = inputType.toLowerCase()
        }

        switch(inputType){
            case 'text':
                flg = true;
                break;
            case 'radio':
                flg = true;
                break;
            case 'checkbox':
                flg = true;
                break;
            case 'file':
                flg = true;
                break;
            case 'password':
                flg = true;
                break;
        }

        return flg;
    }

    /*
     * Enterの場合に無効。
     */
    function onKeyPressInvalidEnter(e){

        e = getEvent(e);

        if(e != null && e.keyCode == 13 ){
            e.cancelBubble = true;
            return false;
        }
        return true;
    }

    var inputElements = document.getElementsByTagName("input");
    for(var i = 0; i < inputElements.length; i++){
        if(isNotEnterElement(inputElements[i])){
            inputElements[i].onkeypress = onKeyPressInvalidEnter;
        }
    }
}

/*
 * ブラウザのタイプを判定します。<br>
 * 判定はIEおよびFFとする。
 */
var BROWSER_TYPE;
var BROWSER_TYPE_IE = 1;
var BROWSER_TYPE_FF = 2;
function checkBrowser(){

    if(navigator.appName.charAt(0)=="M"){
        BROWSER_TYPE = BROWSER_TYPE_IE;
    }else if(navigator.appName.charAt(0)=="N"){
        BROWSER_TYPE = BROWSER_TYPE_FF;
    }
}

/*
 * イベントをブラウザ判定して返却します。<br>
 */
function getEvent(e){

    if(BROWSER_TYPE == BROWSER_TYPE_IE){
        return event;
    }else{
        return e;
    }
}


