/********************************************************
 *
 *  Data Pager
 *
 ********************************************************/

(function($){

jNextraGMaps2.DataPager = function(map, data, opts){
    this._map = map;
    this._data = data;
    this._dataCount = opts.maxCount < data.length ? opts.maxCount : data.length;
    this._opts = jNextra.Util.merge({
        resultClassName: 'jnxt-gmaps-datapager-result',
        pagerClassName: 'jnxt-gmaps-datapager-paginate',
        listClassName: 'jnxt-gmaps-datapager-list',
        pageCount: 5,
        listCount: 10,
        currentPage: 1,
        dspPrev: true,
        dspNext: true,
        prevClassName: 'prev',
        pageClassName: 'page',
        nextClassName: 'next',
        prevImage: '/nextra/static/img/jNextra/gmaps/datapager/prev.gif',
        nextImage: '/nextra/static/img/jNextra/gmaps/datapager/next.gif',
        prevAlt: '前のページへ',
        nextAlt: '次のページへ',
        zoomLevel: 17,
        updateCallback: []
    }, opts);
    this._opts.lastPage = Math.ceil(this._dataCount / this._opts.listCount);
    this._resultContainer = $("<div></div>").addClass(this._opts.resultClassName);
    this._listContainer = $("<div></div>").addClass(this._opts.listClassName);
    this._pagerContainer = $("<div></div>").addClass(this._opts.pagerClassName);
    this._opts.startItem = (this._opts.currentPage - 1) * this._opts.listCount + 1;
    this._opts.endItem = this._dataCount >= this._opts.listCount ? this._opts.listCount : this._dataCount;
};

jNextraGMaps2.DataPager.prototype = {
    getResult: function(){
        return this._resultContainer.get(0);
    },

    getPager: function(){
        var self = this;
        if(self._opts.dspPrev && self._opts.prevImage){
            var prevImage = 
                $("<img />")
                .attr("src", self._opts.prevImage)
                .attr("alt", self._opts.prevAlt)
                .click(function(){
                    self.updatePager(self._opts.currentPage - 1);
                });
            self._prevButton = 
                $("<div></div>")
                .addClass(self._opts.prevClassName)
                .append(prevImage)
                .appendTo(self._pagerContainer);
        }

        self._pageContainer = 
                $("<div></div>")
                .addClass(self._opts.pageClassName)
                .appendTo(self._pagerContainer);

        if(self._opts.dspNext && self._opts.nextImage){
            var nextImage = 
                $("<img />")
                .attr("src", self._opts.nextImage)
                .attr("alt", self._opts.nextAlt)
                .click(function(){
                    self.updatePager(self._opts.currentPage + 1);
                });
            self._nextButton = 
                $("<div></div>")
                .addClass(self._opts.nextClassName)
                .append(nextImage)
                .appendTo(self._pagerContainer);
        }

        self.setPager(this._opts.currentPage);
        return self._pagerContainer.get(0);
    },

    setPager: function(currentPage){
        var self = this;
        self._opts.currentPage = parseInt(currentPage);
        if(self._opts.currentPage == 1){
            if(self._opts.dspPrev){  self._prevButton.css("visibility","hidden");  }
        } else {
            if(self._opts.dspPrev){  self._prevButton.css("visibility","visible"); }
        }
        if(self._opts.currentPage == self._opts.lastPage){
            if(self._opts.dspNext){  self._nextButton.css("visibility","hidden");  }
        } else {
            if(self._opts.dspNext){  self._nextButton.css("visibility","visible"); }
        }
        var pageCountHalf = Math.floor(self._opts.pageCount / 2);
        if(self._opts.lastPage <= self._opts.pageCount){
            var startButton = 1;
            var endButton = self._opts.lastPage;
        }else if(self._opts.currentPage <= pageCountHalf){
            var startButton = 1;
            var endButton = self._opts.pageCount;
        }else if(self._opts.currentPage >= self._opts.lastPage - pageCountHalf){
            var startButton = self._opts.lastPage - self._opts.pageCount + 1;
            var endButton = self._opts.lastPage;
        } else {
            var startButton = self._opts.currentPage - Math.ceil(self._opts.pageCount / 2) + 1;
            var endButton = startButton + self._opts.pageCount - 1;
        }
        
        $(self._pageContainer).html('');
        for ( var i = startButton; i<=endButton; i++ ){
            var pageItem = $('<span>'+i+'</span>').attr("pageId", i);
            if ( self._opts.currentPage == i ){
                pageItem.addClass('active');
            } else {
                pageItem.click(function(){
                    self.updatePager($(this).attr("pageId"))
                });
            }
            pageItem.appendTo(self._pageContainer);
        }
        self._opts.startItem = ( this._opts.currentPage - 1 ) * this._opts.listCount + 1;
        self._opts.endItem = 
            self._opts.currentPage == self._opts.lastPage 
            ? self._dataCount 
            : self._opts.currentPage * self._opts.listCount;
    },
    
    updatePager: function(currentPage){
        var self = this;
        this.setPager(currentPage);
        for(i=0; i<self._opts.updateCallback.length; i++){
            self._opts.updateCallback[i].apply(self);
        }
    }
};

/*********************
 * 住所から探す
 *********************/
//ページャー取得
jNextraGMaps2.DataPager.prototype.getPagerGeoAddrByFreewordDialog = function(){
    return this.getPager();
};
//検索結果取得
jNextraGMaps2.DataPager.prototype.getResultGeoAddrByFreewordDialog = function(){
    var self = this;
    if(this._opts.searchParams.frewd){
        if(this._opts.mes){    
            $('<p><strong>' + this._opts.searchParams.frewd + '</strong>で検索した結果は'
              + '<var>' + this._data.length + '</var>件以上ありました</p>')
                .addClass('message')
                .appendTo(self._resultContainer);
        }else{
            $('<p><strong>' + this._opts.searchParams.frewd + '</strong>で検索した結果は'
              + '<var>' + this._data.length + '</var>件ありました</p>')
                .addClass('message')
                .appendTo(self._resultContainer);
        }
    }
    $('<p>' + this._opts.startItem + '～' + this._opts.endItem + '件表示</p>')
        .addClass('count')
        .appendTo(self._resultContainer);
    self._opts.updateCallback.push(this.updateResultGeoAddrByFreewordDialog);
    return this.getResult();
};
//検索結果(件数)更新ロジック設定
jNextraGMaps2.DataPager.prototype.updateResultGeoAddrByFreewordDialog = function(){
    $('.count', this._resultContainer).html(this._opts.startItem + '～' + this._opts.endItem + '件表示');
};

//リスト取得
jNextraGMaps2.DataPager.prototype.getListGeoAddrByFreewordDialog = function(){
    var self = this;
    this._opts.updateCallback.push(self.updateListGeoAddrByFreewordDialog);
    self.updateListGeoAddrByFreewordDialog();
    return this._listContainer.get(0);
};
//リスト更新用ロジック設定
jNextraGMaps2.DataPager.prototype.updateListGeoAddrByFreewordDialog = function(){
    var self = this;
    var container_table = $('<table></table>');
    for ( var i = self._opts.startItem - 1; i < self._opts.endItem; i++ ) {
        var className = i % 2 == 1 ? 'odd' : 'even';
        var item_tr = $('<tr></tr>');
        var item_td = $('<td></td>').addClass(className).html((i + 1) + '.&nbsp;&nbsp;');
        var item = 
            $('<a href="#">' + self._data[i].NAME + '</a>').attr("no", i)
            .click(function(){
                var j = $(this).attr("no");

                if(typeof self._data[j].ADDR1 == "undefined"){
                    if(typeof self._data[j].ADDR1 == "undefined"){
                        self._data[j].ADDR1 = self._data[j].AD1;
                    }
                }else{
                    if(self._data[j].ADDR1.length == 5){
                        var area = parseInt(self._data[j].ADDR1.slice(0,2));
                        var shiku = self._data[j].ADDR1.slice(-3);
                        params = {
                            code: 'addr1',
                            'key[0]' : area,
                            'key[1]' : shiku,
                            result : '*'
                        };
                    jNextra.Facade.Code.Master(params,self.setDistCode,this);
                    }else{
                        self.setCode(self._data[j].ADDR1);
                    }
                }
                if(self._opts.dialog){ self._opts.dialog.close(); }
            }).appendTo(item_td);
        item_td.appendTo(item_tr);
        item_tr.appendTo(container_table);
    }
    self._listContainer.html('').append(container_table);
};

jNextraGMaps2.DataPager.prototype.setDistCode = function(res){
    $.get("/Map/addr/",{addr11:res.AD1.substr(0,2),ad1:res.AD1},function(addrdata){
        location.href = addrdata;
    });
};

jNextraGMaps2.DataPager.prototype.setCode = function(res){
    $.get("/Map/addr/",{addr11:res.substr(0,2),ad1:res},function(addrdata){
        location.href = addrdata;
    });
};

/*********************
 * 駅名から探す
 *********************/
//ページャー取得
jNextraGMaps2.DataPager.prototype.getPagerGeoEkiInfoByFreewordDialog = function(){
    return this.getPager();
};
//検索結果取得
jNextraGMaps2.DataPager.prototype.getResultGeoEkiInfoByFreewordDialog = function(){
    var self = this;
    if(this._opts.searchParams.s){
        $('<p><strong>' + this._opts.searchParams.s + '</strong>で検索した結果は'
          + '<var>' + this._data.length + '</var>件ありました</p>')
            .addClass('message')
            .appendTo(self._resultContainer);
    }
    $('<p>' + this._opts.startItem + '～' + this._opts.endItem + '件表示</p>')
        .addClass('count')
        .appendTo(self._resultContainer);
    this._opts.updateCallback.push(self.updateResultGeoEkiInfoByFreewordDialog);
    return this.getResult();
};
//検索結果(件数)更新ロジック設定
jNextraGMaps2.DataPager.prototype.updateResultGeoEkiInfoByFreewordDialog = function(){
    $('.count', this._resultContainer).html(this._opts.startItem + '～' + this._opts.endItem + '件表示');
};

//リスト取得
jNextraGMaps2.DataPager.prototype.getListGeoEkiInfoByFreewordDialog = function(){
    var self = this;
    self._opts.updateCallback.push(self.updateListGeoEkiInfoByFreewordDialog);
    self.updateListGeoEkiInfoByFreewordDialog();
    return self._listContainer.get(0);
};
//リスト更新用ロジック設定
jNextraGMaps2.DataPager.prototype.updateListGeoEkiInfoByFreewordDialog = function(){
    var self = this;
    var container_table = $('<table></table>');
    var header = $('<tr></tr>');
    var header_eki = $('<th>駅名</th>').appendTo(header);
    var header_pref = $('<th>都道府県</th>').appendTo(header);
    header.appendTo(container_table);
    for ( var i = self._opts.startItem - 1; i < self._opts.endItem; i++ ) {
        var eki_name = self._data[i].EKI_NAME;
        var pref_name  = self._data[i].AD11_NAME;
        var className = i % 2 == 1 ? 'odd' : 'even';
        var item_tr = $('<tr></tr>');
        var item_td_eki = $('<td></td>').addClass(className).html((i + 1) + '.&nbsp;&nbsp;');
        var item = 
            $('<a href="#">' + eki_name + '</a>').attr("no", i)
            .click(function(){
                var j = $(this).attr("no");
                var ad11 = self._data[j].AD11;
                var ekiCode = self._data[j].ID;
                $.get('/Map/getstation/',{area:ad11,ekicode:ekiCode},function(stdata){
                    location.href= stdata;
                });
                if(self._opts.dialog){ self._opts.dialog.close(); }
            }).appendTo(item_td_eki);
        item_td_eki.appendTo(item_tr);
        var item_td_pref  = $('<td>' + pref_name  + '</td>').addClass(className).appendTo(item_tr);
        item_tr.appendTo(container_table);
    }
    self._listContainer.html('').append(container_table);
};

jNextraGMaps2.DataPager.prototype.setekiCode = function(res){
    $.get('/Map/getstation/',{area:ad11,ekicode:ekiCode},function(stdata){
        location.href= stdata;
    });
};


})(jQuery);