/**
 * ボタンにオーバーレイ画面表示イベントハンドラーをセット
 */
function initOverlay(_baseUri){

    //出力値設定変数
    var ie6=$.browser.msie&&parseInt($.browser.version)==6&&typeof window['XMLHttpRequest']!="object";
    var insertNode;
    var overLayType = null;
    var check = null;
    var config = {
            overlaySrc:  '<div id="overlay" style="display: none;"></div>\n',
            modalBoxSrc: '<div id="modalBox" class="modalBox" style="display: none;">\n',
            fadeSpeed: 120,
            overlayOpacity: 0.9
    }

    /**
     * show overlay
     */
    //overlay area select
    var showOverlay = $('#showArea, #showCategory');
    showOverlay.click(function(){
        var self = $(this).attr('id');
        insertNode = '#' + self;

        if(ie6){
            selectBox = $('select').css('display', 'none');
        }
        switch(self){
            case 'showArea':
                inputNode = $('#area :checked, #area :hidden');
                OLType = $('#area :hidden').attr('value');
                switch(OLType){
                    case 'line':
                        OLType = "line";
                        message = '路線の選択は';
                        break;
                    default:
                        OLType = "area";
                        message = 'エリアの選択は';
                        break;

                }
                break;

            case 'showCategory':
                inputNode = $('#category :checked, #category :hidden');
                OLType = 'cate';
                message = 'カテゴリの選択は';

                break;
        }

        var params = new Array();
        check = true;

        for(i=0; i<inputNode.length; i++){
            name = inputNode.get(i).getAttribute('name');
            if(!(params[name] instanceof Array)){
                params[name] = new Array();
            }
            params[name].push(encodeURIComponent(inputNode.get(i).getAttribute('value')));
        }

        //選択路線駅パラメータは、選択駅で再生成する
//        if (array_key_exists('lstn',params)){
//            var _nodes = params['lstn'];
//            delete(params['lstn']);
//            for(i=0; i<_nodes.length; i++){
//                var _lstnValue = _nodes[i];
//                var _lstnPos = _lstnValue.indexOf("s");
//                if (_lstnPos != -1){
//                    var _lstnStn = _lstnValue.substring(_lstnPos + 1,_lstnValue.length);
//                    if (in_array(_lstnStn,params['stn'])){
//                        if(!(params['lstn'] instanceof Array)){
//                            params['lstn'] = new Array();
//                        }
//                        params['lstn'].push(_lstnValue);
//                    }
//                }
//            }
//        }
        lstnParams = lstnFilter(params,params);
        if (lstnParams == null){
            delete(params['lstn']);
        }else{
            params['lstn'] = lstnParams;
        }

        var param;
        for(key in params){
            var addGetParam = '';
            for(var getI=0; getI < params[key].length; getI++){
               if(addGetParam == ''){
                    addGetParam = params[key][getI];
                }else{
                    addGetParam += '-' + params[key][getI];
                }
            }
            if(typeof param == 'undefined'){
                param = '?' + key + '=' + addGetParam;
            }else{
                param = param + '&' + key + '=' + addGetParam;
            }
        }
        //gronga用パラメータ取得
        if(typeof param =='undefined'){
            param = '?table=' + $('#groonga').attr('value');
        }else{
            param = param + '&table=' + $('#groonga').attr('value');
        }

        $('#frame').after(config.overlaySrc);
        $('#overlay').bgiframe().after(config.modalBoxSrc).fadeTo(config.fadeSpeed, config.overlayOpacity);
        $('#modalBox').fadeIn(config.fadeSpeed).load(_baseUri + 'beauty/overlay/' + OLType + '/' + param, null, function(){
            $('#modalBox .rollover').rollover('_o');
            $('#modalBox .button').rollover('_o','_a');
            $('#nextArea').addClass('hidden');
            toggleNextButtonStatus()
        });
        return false;
    });

    /**
     * toggle
     */
    var toggle = $('#toggleStation, #toggleArea');
    toggle.live('click', function(){
        param = '';
        if($('#toggleStation').size() == 1){
            message = '路線の選択は';
            togglePage = 'line/';
        }
        if($('#toggleArea').size() == 1){
            message = 'エリアの選択は';
            togglePage = 'area/';
        }

        togglePage = togglePage + '?table=' + $('#groonga').attr('value');

        check = true;

        $('#modalBox').load(_baseUri + 'beauty/overlay/' + togglePage, null, function(){
            $('#modalBox .rollover').rollover('_o');
            $('#modalBox .button').rollover('_o','_a');
            $('#nextStation').addClass('hidden');
        });
        return false;
    });


    /**
     * next button
     */
    var next = $('#nextArea, #nextStation, #nextCategory');
    next.live('click', function(){
        var condition;
        if($('#nextArea').size() == 1){
            overLayType = 'area';
            nextPage = 'areastn/';
        }
        if($('#nextStation').size() == 1){
            overLayType = 'line';
            nextPage = 'linestn/';
        }
        if($('#nextCategory').size() == 1){
            overLayType = 'cate';
            nextPage = 'scate/';
        }
        condition = checkCount();

        if(condition == false){
            return false;
        }

        check = false;

        param = setParams();
        if(typeof param == 'undefined'){
            param = '';
        }
        $('#modalBox').load(_baseUri + 'beauty/overlay/'+ nextPage + param, null, function(){
            $('#modalBox .rollover').rollover('_o');
            $('#modalBox .button').rollover('_o','_a');
        });
        return false;
    });

    /**
     * back button
     */
    var back = $('#backArea, #backStation, #backCategory');
    back.live('click', function(){

        if($('#backArea').size() == 1){
            backPage = 'area/';
        }
        if($('#backStation').size() == 1){
            backPage = 'line/';
        }
        if($('#backCategory').size() == 1){
            backPage = 'cate/';
        }
        param = setParams();
        check = true;
        if(typeof param == 'undefined'){
            param = '';
        }
        $('#modalBox').load(_baseUri + 'beauty/overlay/' + backPage + param, null, function(){
            $('#modalBox .rollover').rollover('_o');
            $('#modalBox .button').rollover('_o','_a');
        });
        overLayType = null;
        return false;
    });

    /**
     * apply button
     */
    var apply = $('#applyArea, #applyStation, #applyCategory');
    apply.live('click', function(){
        var condition;
        condition = setInputNodes(insertNode, overLayType, check);
        if(condition == false){
            return false;
        }
        $('#overlay, #modalBox').fadeOut(config.fadeSpeed);
        $('#overlay, #modalBox').remove();
        if(ie6){
            selectBox = $('select').css('display', '');
        }
        return false;
    });

    /**
     * close button
     */
    var close = $('#modalBoxClose');
    close.live('click', function(){
        $('#overlay, #modalBox').fadeOut(config.fadeSpeed);
        $('#overlay, #modalBox').remove();
        if(ie6){
            selectBox = $('select').css('display', '');
        }
        return false;
    });

    // bind "Next" button behavior
    $('#modalBox :checkbox').live('click',toggleNextButtonStatus);

    //IE6対策
    //:checkboxセレクタを利用するとバグが発生する。
    //現状、以下の部分はHTML構造上[input]と[:checkbox]が同義のため置き換え）
    $('.selectAll input').live('click', largeGroupSelectAllBehavior);
    $('dl.area dd input').live('click', checkboxBehavior);
    $('dl.area dt input').live('click', smallGroupSelectAllBehavior);
//    $('.selectAll :checkbox').live('click', largeGroupSelectAllBehavior);
//    $('dl.area dd :checkbox').live('click', checkboxBehavior);
//    $('dl.area dt :checkbox').live('click', smallGroupSelectAllBehavior);

}

/**
 * オーバーレイ画面にて選択した値をチェックボックスとして選択条件にセットする。
 */
function setInputNodes(insertNode, overLayType, _check){

    var condition;
    var base  = $(insertNode).parents('ul:first');
    var wrapfront = '<li><label>';
    var wrapTail = '</label></li>';
    var erase = base.children();
    var buttonNode = erase.get(erase.length-1);

    if(_check == true || _check==null){
        condition = checkCount();
        if(condition == false){
            return false;
        }
    }

    //erase prepended input nodes.
    for(var i=0; i<erase.length; i++){
        eraseNode = erase.get(i);
        eraseNode.parentNode.removeChild(eraseNode);
    }

    appendNodes = new Array;
    appendNodes['large'] = new Array;
    appendNodes['middle'] = new Array;
    appendNodes['small'] = new Array;

    //最上位inputノードをすべて取得
    nodes = $('#modalBoxMdl #top input[type=checkbox]');

    cateId = new Array;
    for(i=0; i<getScorp.length; i++){
        if (getScorp[i].substring(0, 2) == "of"){
            cateId.push(getScorp[i]);
        }
    }

    if(nodes[0].name == 'line'){
        base.append('<input type="hidden" name="val" value="' + nodes[0].name + '"/>');
    }
    base.append('<input type="hidden" name="overLayType" value="' + overLayType + '"/>');

    noId = new Array;
    appendedNode = new Array();
    appendedChild = new Array();
    appendedGChild = new Array();
    for(i=0; i<nodes.length; i++){

        if(nodes[i].checked == true){
            if(!in_array(nodes[i].value, appendedNode)){
                //チェックしてある場合：追加ノードとして処理
                if(navigator.userAgent.indexOf("MSIE") != -1){
                    text = nodes[i].parentNode.innerText.replace(/エリアをすべて選択/,'');
                }else{
                    text = nodes[i].parentNode.textContent.replace(/エリアをすべて選択/,'');
                }
                text = text.replace(/をすべて選択/,'');

                // カテゴリのみ親カテゴリを入れる
                if (nodes[i].name == 'cate'){
                    if(_check == false){
                        appendNodes['large'].push('<input type="hidden" name="pcate" value="' + nodes[i].value + '" / >');
                    }
                    appendNodes['large'].push('<input id="cate_' + nodes[i].value + '" type="hidden" name="cate_' + nodes[i].value + '" value="' + nodes[i].value + '" / >');
                }
                // カテゴリのみ親カテゴリを入れる
                if (nodes[i].name == 'area'){
                    if(_check == false){
                        appendNodes['large'].push('<input type="hidden" name="parea" value="' + nodes[i].value + '" / >');
                    }
                }
                if (nodes[i].name == 'line'){
                    if(_check == false){
                        appendNodes['large'].push('<input type="hidden" name="pline" value="' + nodes[i].value + '" / >');
                    }
                }

                appendNodes['large'].push( wrapfront + '<input type=checkbox name="' + nodes[i].name + '" value="' + nodes[i].value + '" checked="checked" / ><span>' + text + '</span>' + wrapTail);
                noId.push(nodes[i].value);
                appendedNode.push(nodes[i].value);
            }

        }else{
            cateIdCheck = false;
            largeIdCheck = false;

            //配下inputの取得：
            childNode = $('#modalBoxMdl #' + nodes[i].value + ' input[type=checkbox]');


            for(var ci=0; ci<childNode.length; ci++){

                //チェック判定
                if(childNode[ci].checked == true){
                    if(nodes[i].name == "line"){
                        appendNodes['middle'].push('<input type="hidden" name="lstn" value="' + nodes[i].value + "s" + childNode[ci].value + '" / >');
                    }
                    cateIdCheck = true;
                    largeIdCheck = true;
                    if(!in_array(childNode[ci].value, appendedChild)){

                        // カテゴリのみ親カテゴリを入れる
                        if (nodes[i].name == 'cate'){
                            appendNodes['middle'].push('<input id="cate_' + nodes[i].value + '" type="hidden" name="cate_' + childNode[ci].value + '" value="' + nodes[i].value + '" / >');
                        }

                        //チェックしてある場合：追加ノードとして処理
                        if(navigator.userAgent.indexOf("MSIE") != -1){
                            appendNodes['middle'].push( wrapfront + '<input type=checkbox name="' + childNode[ci].name + '" value="' + childNode[ci].value + '" checked="checked" / ><span>' + childNode[ci].parentNode.innerText + '</span>' + wrapTail);
                        }else{
                            appendNodes['middle'].push( wrapfront + '<input type=checkbox name="' + childNode[ci].name + '" value="' + childNode[ci].value + '" checked="checked" / ><span>' + childNode[ci].parentNode.textContent + '</span>' + wrapTail);
                        }
                        appendedChild.push(childNode[ci].value);
                    }

                }else{

                    //最下位で選択済みinputの取得
                    gChildNodes = $('#modalBoxMdl #' + childNode[ci].value + ' input[type=checkbox][checked=true]');
                    for(var gsi=0; gsi<gChildNodes.length; gsi++){

                        if(!in_array(gChildNodes[gsi].value, appendedGChild)){
                        // カテゴリのみ親カテゴリを入れる
                            if (nodes[i].name == 'cate'){
                                appendNodes['middle'].push('<input id="cate_' + nodes[i].value + '" type="hidden" name="cate_' + gChildNodes[gsi].value + '" value="' + nodes[i].value + '" / >');
                            }
                            cateIdCheck = true;
                            largeIdCheck = true;
                            //ノードとして追加処理
                            if(navigator.userAgent.indexOf("MSIE") != -1){
                                appendNodes['small'].push( wrapfront + '<input type=checkbox name="' + gChildNodes[gsi].name + '" value="' + gChildNodes[gsi].value + '" checked="checked" / ><span>' + gChildNodes[gsi].parentNode.innerText + '</span>' + wrapTail);
                            }else{
                                appendNodes['small'].push( wrapfront + '<input type=checkbox name="' + gChildNodes[gsi].name + '" value="' + gChildNodes[gsi].value + '" checked="checked" / ><span>' + gChildNodes[gsi].parentNode.textContent + '</span>' + wrapTail);
                            }
                            appendedGChild.push(gChildNodes[gsi].value);
                        }
                    }
                }
            }

            overlayLevel = $('#modalBoxMdl #modalAreaFirst input[name=from]').attr('value');

            if ((largeIdCheck == false) && (overlayLevel == "child")){
                if(navigator.userAgent.indexOf("MSIE") != -1){
                    text = nodes[i].parentNode.innerText.replace(/エリアをすべて選択/,'');
                }else{
                    text = nodes[i].parentNode.textContent.replace(/エリアをすべて選択/,'');
                }
                text = text.replace(/をすべて選択/,'');
                appendNodes['large'].push( wrapfront + '<input type=checkbox name="' + nodes[i].name + '" value="' + nodes[i].value + '" checked="checked" / ><span>' + text + '</span>' + wrapTail);
            }
            if (cateIdCheck) {
                noId.push(nodes[i].value);
            }
        }
    }

    //こだわり条件チェックボックス連携
    if(insertNode == '#showCategory'){
        for(i=0; i<cateId.length; i++){
            noflg = true;
            for(j=0; j<noId.length; j++){
                if (cateId[i] == ("of" + noId[j])) {
                    noflg = false;
                    break;
                }
            }

            if (noflg) {
                $("input[name='" + cateId[i] + "']").attr("disabled", true).attr("checked", false);
            }else{
                $("input[name='" + cateId[i] + "']").attr("disabled", false);
            }
        }
    }

    //情報階層順にノードを追加
    if(typeof appendNodes['large'] != 'undefined'){
        for(i=0; i<appendNodes['large'].length; i++){
            base.append(appendNodes['large'][i]);
        }
    }
    if(typeof appendNodes['middle'] != 'undefined'){
        for(i=0; i<appendNodes['middle'].length; i++){
            base.append(appendNodes['middle'][i]);
        }
    }
    if(typeof appendNodes['small'] != 'undefined'){
        for(i=0; i<appendNodes['small'].length; i++){
            base.append(appendNodes['small'][i]);
        }
    }

    if(appendNodes['large'].length + appendNodes['middle'].length + appendNodes['small'].length == 0){
        base.append('<li>未選択</li>');
    }
    base.append(buttonNode);

    if(_check == true || _check==null){
        if (cateIdCheck) {
            if (nodes[i].name == 'cate'){
                cateOfChk();
            }
        }
    }

}

/**
 * define behavior of "select all" checkbox for large group
 * require to wrap with div.largeGroup
 */
function largeGroupSelectAllBehavior(){

    var thisGroup = $(this).parents('.largeGroup');
    if(this.checked) {
        $(':checkbox:enabled',thisGroup).attr('checked', true);
    }else{
        $(':checkbox',thisGroup).removeAttr('checked');
    }
}

/**
 * define most small checkbox item behavior.
 * this item should be inside of dl>dd element.
 */
function checkboxBehavior(){
	var self = $(this);
	var thisGroup = self.parents('.largeGroup');
	var thisArea = self.parents('dd').prev('dt');
	var selectAll = thisGroup.find('.selectAll :checkbox:enabled');
	if(self.parents('dd').find(':checkbox:enabled').size() == self.parents('dd').find(':checked').size()) {
		$(':checkbox',thisArea).attr('checked', true);
		if(thisGroup.find('dt :checkbox:enabled').size() == thisGroup.find('dt :checked').size()){
			selectAll.attr('checked', true);
		}
	} else {
		$(':checkbox',thisArea).removeAttr('checked');
		selectAll.removeAttr('checked')
	}
}


/**
 * define behavior of "select all" checkbox for small group.
 * require dl > dt, dl > dd structure.
 */
function smallGroupSelectAllBehavior(){
	var self = $(this);
	var thisGroup = self.parents('.largeGroup');
	var selectAll = thisGroup.find('.selectAll :checkbox:enabled');
	if(self[0].checked) {
		if(thisGroup.find('dt :checkbox:enabled').size() == thisGroup.find('dt :checked').size()){
			selectAll.attr('checked', true)
		}
		self.parents('dl').find(':checkbox:enabled').attr('checked', true);
	} else {
		selectAll.removeAttr('checked')
		self.parents('dl').find(':checkbox').removeAttr('checked');
	}
}


/**
* 画面遷移用パラメータ作成
 * （各javascript画面で選択に応じてパラメータを加工・変数代入）
 */
function setParams(){

    //埋め込み情報判別
    _keepNode = $('#modalBoxMdl input[name=keep]');
    if(_keepNode.lenth > 0){
        keep = true;
    }else{
        keep = false;
    }
    _from = $('#modalBoxMdl input[name=from]');
    from = _from[0].value;

    //inputノードを取得
    _checkBox = $('#modalBoxMdl input[type=checkbox]');

    var params = new Array;

    if(keep || from != 'child'){
        for(i=0; i<_checkBox.length; i++){
            //チェック済みのcheckboxの処理
            if(_checkBox[i].checked == true){
                name = _checkBox[i].name;
                if(typeof params[name] == 'undefined'){
                    params[name] = new Array;
                }
                //格納済みの値を除外
                if(!in_array(_checkBox[i].value, params[name])){
                    params[name].push( _checkBox[i].value);
                }
            }
            //配列の値をソート
            if(i == _checkBox.length - 1){
                params[name].sort(function(a, b) {return a - b});
            }
        }
    }

    //隠しフィールドを取得
    _hidden = $('#modalBoxMdl input[type=hidden]');

    for(i=0; i<_hidden.length; i++){
        name = _hidden[i].name;
        if(typeof params[name] == 'undefined'){
            params[name] = new Array;
        }
        //格納済みの値を除外
        if(!in_array(_hidden[i].value, params[name])){
            params[name].push( _hidden[i].value);
        }
        //配列の値をソート
        if(i == _hidden.length - 1){
            params[name].sort(function(a, b) {return a - b});
        }
    }

    //パラメータ作成
    var _param = '';
    for(key in params){
        var _tempParam = '';
        for(i=0; i<params[key].length; i++){
            if(_tempParam == ''){
                _tempParam = key + '=' + params[key][i];
            }else{
                _tempParam = _tempParam + '-' + params[key][i];
            }
        }

        if(_param ==''){
            _param = '?' + _tempParam;
        }else{
            _param = _param + '&' + _tempParam;
        }
    }

    return _param;
}

/**
 * 配下要素のタグ名配列を取得
 * @return array
 */
function getChildNodesName(_object){

    var result = new Array();

    childNode = _object.childNode();
    count = childNode.length;

    for(i=0; i<count; i++ ){
        result.push(childNode.get(i).tagName);
    }
    return result;
}


/**
 * toggle "Next" buttons status.
 */
function toggleNextButtonStatus(){

    var nextAll = $('#nextArea, #nextStation, #nextCategory');
    if( $('#modalBox input:checked').size() > 0 ) {
            nextAll.removeClass('hidden');
    } else {
            nextAll.addClass('hidden');
    }

}
