/**
 * List Layer constructor.
 * @constructor
 */

function ListLayer(){
    
    /*  required properties  */
    this.layer_name = '';
    this.row_blocks  = [];
    this.load_params = {};
    this.class_name = '';
    
    this.on = false;
    //this.dom_obj = {};
    this.dom_obj = this.create_block();
    document.body.appendChild(this.dom_obj);
    
    this.active_row_offset = 15;
    
    this.total_rows  = 14;
    this.total_items = 0;
    this.total_pages = 0;
    this.cur_row = 0;
    this.prev_row = 0;
    this.cur_page = 1;
    this.data_items  = [];
    this.map = [];
    this.loading = false;
    this.total_vclub_items_obj = {};
    this.buttons_bar = {};
    this.left_ear = {};
    this.right_ear = {};
    this.header_path = {};
    this.path_container = {};
    this.header_path_map = [];
    this.main_container = {};
    this.shift_row_callback;
    
    this.cur_view = 'wide';
    
    this.sidebar = {};
    
    this.page_dir = 1;
    
    /*this.color_buttons = [
        {"color" : "red"},
        {"color" : "green"},
        {"color" : "yellow"},
        {"color" : "blue"}
    ];*/

    //this.color_buttons_map = {};
    //this.buttons = {};

    this.loader = {};
    
    this.base_layer = BaseLayer.prototype;
}

ListLayer.prototype = new BaseLayer();

ListLayer.prototype.show = function(do_not_load){
    _debug('ListLayer.show', do_not_load);
    
    this.base_layer.show.call(this);
    
    if (!do_not_load){
        this.load_data();
    }else{
        this.set_active_row(this.cur_row);
    }
};

ListLayer.prototype.hide = function(do_not_reset){
    _debug('ListLayer.hide');

    this.set_passive_row();
    
    if (!do_not_reset){
        this.reset();
        
        this.load_params = this.load_params_pattern.clone();
        
        this.sidebar && this.sidebar.reset && this.sidebar.reset();
        
        if (this.sidebar && this.sidebar.on){
            this.sidebar.hide();
        }
    }
    
    this.base_layer.hide.call(this);
};

ListLayer.prototype.reset = function(){
    _debug('ListLayer.reset');
    
    this.cur_row = 0;
    this.cur_page = 1;
    this.page_dir = 1;
    this.total_pages = 0;

    this.clear_list();
};

ListLayer.prototype.clear_list = function(){
    _debug('ListLayer.clear_list');
    
    for (var j=0; j<this.total_rows; j++){
        this.clear_row(this.map[j].row);
    }
    
    this.data_items = [];
    
    this.set_total_items(-1);
};

ListLayer.prototype.init = function(){

    this.load_params_pattern = this.load_params.clone();

    this.base_layer.init.call(this);
    
    this.init_page_bar();
    this.init_list();
};

ListLayer.prototype.init_page_bar = function(){
    
    this.total_vclub_items_obj = this.create_block();
    this.total_vclub_items_obj.addClass('mb_header_info');
    
    this.dom_obj.appendChild(this.total_vclub_items_obj);
};

ListLayer.prototype.init_list = function(){
    _debug('ListLayer.init_list');

    var item;
    var offset;

    this.init_page_bar();

    this.main_container = create_block_element('wide_container', this.dom_obj);

    for (var i=0; i<this.total_rows; i++){
        item = this.create_block('blue_row_bg');
        //item = document.createElement('ul');
        //item.setClass('blue_row_bg');

        this.map[i] = this.init_blocks(item);

        this.map[i]['row'] = item;
        this.main_container.appendChild(item);

        item.show();

        if (i > 0){
            offset = this.map[i-1].row.clientHeight + this.map[i-1].row.offsetTop;
            item.moveY(offset);
        }

        this.map[i]['top'] = item.offsetTop;
    }

    this.init_active_row();
};

ListLayer.prototype.set_wide_container = function(){
    _debug('set_wide_container');
    
    this.cur_view = 'wide';
    this.main_container.setClass('wide_container');
    
    this.info_box && this.info_box.hide && this.info_box.hide();
};

ListLayer.prototype.set_middle_container = function(){
    _debug('set_middle_container');
    
    this.cur_view = 'middle';
    this.main_container.setClass('middle_container');
    
    this.info_box && this.info_box.show && this.info_box.show();
};

ListLayer.prototype.set_short_container = function(){
    _debug('set_short_container');
    
    this.cur_view = 'short';
    this.main_container.setClass('short_container');
    
    this.info_box && this.info_box.show && this.info_box.show();
};

ListLayer.prototype.init_blocks = function(parent, is_active_row){
    
    var block_name;
    var block_map = {};
    
    for (var j=0; j<this.row_blocks.length; j++){
        
        block_name = this.row_blocks[j]+'_block';
        
        block_map[block_name] = this.create_block(block_name, is_active_row);
        
        parent.appendChild(block_map[block_name]);
    }
    
    return block_map;
};

ListLayer.prototype.init_active_row = function(){
    
    var active_row = document.createElement('div');
    active_row.addClass('active_row_bg');
    
    active_row.hide();
    
    this.active_row = this.init_blocks(active_row, true);

    this.active_row['row'] = active_row;
    
    this.main_container.appendChild(active_row);
};

ListLayer.prototype.init_sidebar = function(options){
    this.sidebar = new sidebar(this, options);
    this.sidebar.init();
};

ListLayer.prototype.load_data = function(){
    _debug('ListLayer.load_data');
    
    this.set_passive_row();
    
    //this.clear_list();
    this.set_total_items(-1);
    
    this.load_params['p'] = this.cur_page;
    
    this.loading = true;
    
    _debug('typeof(this.loader)', typeof(this.loader));
    _debug('this.loader.abort', this.loader.abort);
    
    this.loader && this.loader.abort && this.loader.abort();
    
    this.break_filling_list = true;
    
    this.loader = stb.load(

        this.load_params,
        
        function(result){
            _debug('callback run');
            _debug('result', result);
            
            this.break_filling_list = false;
            
            this.result = result;
            this.total_pages = Math.ceil(result.total_items/result.max_page_items);
            
            if (result.selected_item !=0 || result.cur_page !=0){
                this.cur_row  = result.selected_item-1;
                this.cur_page = result.cur_page;
            }else if (this.cur_page == 0){
                this.cur_page = 1
            }
            
            this.set_total_items(result.total_items);
            
            this.fill_list(result.data);
        },
        
        this
    )
};

ListLayer.prototype.set_total_items = function(count){
    _debug('ListLayer.set_total_items: ', count);
    
    var str = '';
    
    if (this.total_pages != 0 && count >= 0){
        str += word['layer_page'] + ' <span class="text20_white bold">'+this.cur_page+'</span> ' + word['layer_from'] + ' <span class="text20_white bold">'+this.total_pages+'</span>.';
    }
    
    if (count >= 0){
        str += ' ' + word['layer_found'] + ' <span class="text20_white bold">'+count+'</span> ' + word['layer_records'] + '.';
    }else{
        str += ' ' + word['layer_loading'];
    }
    
    this.total_vclub_items_obj.innerHTML = str;
};

ListLayer.prototype.fill_list = function(data){
    _debug('ListLayer.fill_list', data);
    
    this.total_items = data.length;
    this.data_items = data;
    this.last_active_row = -1;
    
    for (var i=0; i<data.length; i++){
        
        if (this.break_filling_list){
            return;
        }
        
        for (var j=0; j<this.row_blocks.length; j++){
            this.handling_block(data[i][this.row_blocks[j]], this.map[i], this.row_blocks[j]);
        }
        
        _debug('data[i]', data[i]);
        
        if (data[i].hasOwnProperty('open') && (!data[i].open || data[i].only_for_moderator == 1)){
            this.map[i]['row'].addClass('close');
            //this.map[i]['row'].setAttribute('rel', 'close');
        }else{
            this.map[i]['row'].removeClass('close');
            //this.map[i]['row'].setAttribute('rel', '');
        }
    }
    
    if (i < this.total_rows){
        for (var j=i; j<this.total_rows; j++){
            this.clear_row(this.map[j].row);
        }
    }
    
    if (this.result && this.result.hasOwnProperty("selected_item") && this.result.hasOwnProperty("cur_page") && this.result.selected_item == 0 && this.result.cur_page == 0){
        if (this.page_dir > 0){
            this.cur_row = 0;
        }else{
            this.cur_row = this.total_items-1;
        }
    }
    
    this.set_active_row(this.cur_row);
    
    this.loading = false;
};

ListLayer.prototype.handling_block = function(data, row_items, block_name){
    
    var block_obj = row_items[block_name+'_block'];
    
    if (data === 1){
        if (block_obj.isHidden()){
            block_obj.show();
        }
    }else if (data === 0 || typeof(data) == "undefined"){
        if (!block_obj.isHidden()){
            block_obj.hide();
        }
    }else{
        if (block_obj.isHidden()){
            block_obj.show();
        }
        
        block_obj.innerHTML = data;
    }
};

ListLayer.prototype.clear_row = function(row_obj){
    
    for (var i=0; i<row_obj.childNodes.length; i++){
        if (!row_obj.childNodes[i].isHidden()){

            if (row_obj.childNodes[i].innerHTML){
                row_obj.childNodes[i].innerHTML = '&nbsp;';
                row_obj.childNodes[i].hide();
            }else{
                row_obj.childNodes[i].hide();
            }
        }
    }
};

ListLayer.prototype.set_active_row = function(num){
    
    _debug('set_active_row', num);

    try{

        if (!this.data_items[num]){
            if (this.data_items[num-1]){
                num = num-1;
            }else{
                num = 0;
            }
            this.cur_row = num;
        }

        if (num == 0){
            if (!this.data_items[num]){
                if (!this.active_row['row'].isHidden()){
                    this.active_row['row'].hide();
                }
            }else{
                if (this.active_row['row'].isHidden()){
                    this.active_row['row'].show();
                }
            }
        }
        var offset = this.map[num]['top'] - this.active_row_offset;
        this.active_row['row'].moveY(offset);

        if (this.active_row['row'].isHidden()){
            this.active_row['row'].show();
        }

        _debug('this.data_items[num]', this.data_items[num]);

        if (this.data_items[num]){
            if (this.data_items[num].hasOwnProperty('open') && (!this.data_items[num].open || this.data_items[num].only_for_moderator == 1)){
                this.active_row['row'].addClass('close');
                //this.active_row['row'].setAttribute('rel', 'close');
            }else{
                this.active_row['row'].removeClass('close');
                //this.active_row['row'].setAttribute('rel', '');
            }
        }

        if(!this.fav_manage_mode){
            
            if (this.data_items.length != 0){

                if (this.last_active_row != num) {
                    for (var j = 0; j < this.row_blocks.length; j++) {
                        this.handling_block(this.data_items[num][this.row_blocks[j]], this.active_row, this.row_blocks[j]);
                    }
                }
                if (this.shift_row_callback && (this.cur_view == 'middle' || this.cur_view == 'short')){
                    this.shift_row_callback.call(this, this.data_items[num]);
                }
            }else{
                this.active_row['row'].hide();
            }
        }

        this.last_active_row = num;
        _debug('this.last_active_row', this.last_active_row);

        _debug('ListLayer.set_active_row end')
    }catch(e){
        _debug(e);
    }
};

ListLayer.prototype.set_passive_row = function(){
    this.active_row['row'].hide();
};

ListLayer.prototype.shift_row = function(dir){
    _debug('this.loading', this.loading);

    window.clearTimeout(this.row_callback_timer);

    if (this.loading){
        return;
    }
    
    this.prev_row = this.cur_row;
    
    if (dir > 0){
        if (this.cur_row < this.total_items - 1){
            this.cur_row++;
            this.set_active_row(this.cur_row);
        }else{
            this.set_passive_row();
            this.shift_page(1);
        }
    }else{
        if (this.cur_row > 0){
            this.cur_row--;
            this.set_active_row(this.cur_row);
        }else{
            this.set_passive_row();
            this.shift_page(-1);
        }
    }
};

ListLayer.prototype.shift_page = function(dir){

    this.page_dir = dir;
    
    if (dir > 0){
        if (this.cur_page < this.total_pages){
            this.cur_page++;   
        }else{
            this.cur_page = 1;
        }
    }else{
        if (this.cur_page > 1){
            this.cur_page--;
        }else{
            this.cur_page = this.total_pages;
        }
    }
    
    this.load_data();
};

ListLayer.prototype.sidebar_switcher = function(){

    if (this.sidebar && this.sidebar.on){
        this.sidebar.hide();
    }else{
        this.sidebar.show();
    }
};

ListLayer.prototype.bind = function(){
    
    this.shift_row.bind(key.UP, this, -1);
    this.shift_row.bind(key.DOWN, this, 1);
    
    this.shift_page.bind(key.PAGE_PREV, this, -1);
    this.shift_page.bind(key.PAGE_NEXT, this, 1);
    
    (function(){
        this.hide();
        main_menu.show();
    }).bind(key.MENU, this).bind(key.EXIT, this).bind(key.LEFT, this);
};

loader.next();