if ( typeof( IPG ) == 'undefined' ) IPG = {};
IPG.AreaListManager = function( config , refreshMethod ){
    this.version = "0.1";
    
    this.config = config;
    if( !this.config ) return;
    
    this.refreshMethod = refreshMethod;
    
    if( !this.areaControllerEventMethod ) this.areaControllerEventMethod = this.areaControllerEvent.bind( this );
    
    return this;
};

IPG.AreaListManager.prototype.makeAreaSelector = function( target , def_val ){
    
    var targetElement = IPG.Utility.getElement( target );
    if( !targetElement ) return;
    
    if( this.xml_data ){
        this.removeAreaControllerEvent();
        targetElement.innerHTML = this.makeAreaControllerHTML( def_val );
        this.bindAreaControllerEvent();
    }else{
        var ajaxOpt = {
            'method': 'get',
            'asynchronous': false
        };
        var xhrObj = new Ajax.Request( this.config.config_xml.api_url.getAreaList , ajaxOpt );
        if( xhrObj && xhrObj._complete ){
            this.xml_data = xhrObj.transport.responseXML.documentElement;
            targetElement.innerHTML = this.makeAreaControllerHTML( def_val );
            this.bindAreaControllerEvent();
        }else{
            Element.setStyle( $( "epg_cloak" ) , "display: block;" );
            $( "cloak_img" ).src = this.config.error_image;
        }
    }
};

IPG.AreaListManager.prototype.makeAreaControllerHTML = function( def_val ){
    if( !this.xml_data ) return;
    var img_path = this.config.config_xml.img_path.areactrl_title;
    var html = "<div id=\"epg_area_controll_title\" style=\"width: 27px; height: 27px; position: relative; float: left;\"><img src=\""+img_path+"\" style=\"margin: -12px 0px 0px -11px; position: absolute; top: 50%; left: 50%;\"></div>";
    html += "<div id=\"epg_area_controll_text\" style=\"width: 160px; height: 27px; margin-left: 5px; color: #686868; font-weight: bold; float: left;\">";
    html += "<div style=\"margin: 7px 0px 0px 0px; float: left; font-size: x-small; \">地域:</div>";
    html += "<select name=\"epg_area_controll\" id=\"epg_area_controll\" style=\"margin: 2px 0px 0px 5px; width: 120px;\">";
    var list = this.xml_data.childNodes;
    if( list ){
        // [0]番目の[BS]はプルダウンメンバから除外。
        for( var i = 1 , len = list.length; i < len; i++ ){
            var value = list[i].childNodes[0].firstChild.nodeValue;
            var name = list[i].childNodes[1].firstChild.nodeValue;
            var selected = ( def_val  == value ) ? " selected" : "";
            html += "<option value=\""+value+"\""+selected+">"+name+"</option>";
        }
    }
    html += "</select>";
    html += "</div>";
    return html;
};

IPG.AreaListManager.prototype.areaControllerEvent = function( evt ){
    evt = IPG.Utility.fixEvent( evt , this );
    evt.srcElement.blur();
    
    /** BSの管理方式変更により、不要 ************************
    // カテゴリセレクタの地上波エリアIDを更新
    var controller = $("epg_category_controller");
    if( !controller || !controller.firstChild ) return;
    var child = controller.firstChild;
    if( child.getAttribute( "name" ) == "epg_category_controll" ){
        child.setAttribute( "value" , evt.srcElement.value );
    }
    *******************************************************/
    
    // プルダウンの変更は常に反映する。
    this.config.cookie.area = evt.srcElement.value;
    
    // 現在のカテゴリがBSの場合、画面の更新は行わない。
    //if( this.config.cookie.area != this.config.config_xml.epg_info.area_bs_id ){
    if( this.config.cookie.bctype != "BSD" ){
        //this.config.cookie.area = evt.srcElement.value;
        
        // サービスリストマネージャの作成。
        // データ取得メソッドコール。
        // 以降はサービスリストマネージャ側で実装。非同期通信→プログラムリストを局数別にコール→解析HTML出力→イベント設定。
        this.refreshMethod();
    }
    
    Event.stop( evt );
    return false;
};
IPG.AreaListManager.prototype.removeAreaControllerEvent = function(){
    var element = $( "epg_area_controll" );
    if( !element ) return;
    Event.stopObserving( element , "change" , this.areaControllerEventMethod );
};
IPG.AreaListManager.prototype.bindAreaControllerEvent = function(){
    var element = $( "epg_area_controll" );
    if( !element ) return;
    Event.observe( element , "change" , this.areaControllerEventMethod );
};

IPG.AreaListManager.prototype.getAreaName = function( area_id ){
    if( area_id == undefined || this.xml_data == undefined ) return;
    var list = this.xml_data.childNodes;
    if( list ){
        for( var i = 1 , len = list.length; i < len; i++ ){
            if( list[i].childNodes[0].firstChild.nodeValue == area_id ){
                return list[i].childNodes[1].firstChild.nodeValue;
            }
        }
    }
    return "";
};