/* запрет изменения цвета фонта */ var skip_clr = false; var per_page = 10; var gl_cur_page = 0; var gl_tabs_id; var scrollTop = true; (function($){ $json_cache = new Object(); $paging = new Object(); $paging.event = ''; $paging.page = 1; $tabs = new Object(); $tabs.active = ''; /* BBCode mapping */ var tags = { '[b]' : '', '[/b]' : '', '[i]' : '', '[/i]' : '', '[u]' : '', '[/u]' : '', '[CENTER]' : '', '[/CENTER]' : '', '[JUSTIFY]' : '', '[/JUSTIFY]' : '', '[r]' : '', '[/r]' : '', '[fn1]' : '', '[fn2]' : '', '[fn3]' : '', '[fn4]' : '', '[fn5]' : '', '[fn6]' : '', '[/fn]' : '', '[fs1]' : '', '[fs2]' : '', '[fs3]' : '', '[fs4]' : '', '[fs5]' : '', '[fs6]' : '', '[fs=1]': '', '[fs=2]': '', '[fs=3]': '', '[fs=4]': '', '[fs=5]': '', '[fs=6]': '', '[/fs]' : '', '[/bg]' : '', '[/fg]' : '', '[wbr]' : '', '[/a]' : '' }; /* * Параметры для загрузки страницы (активная закладка и страница) */ var args = document.location.hash.substr(1, document.location.hash.length); if (args != ''){ args = args.split(':'); $tabs.active = args[0]; if (args.length > 1){ $paging.page = args[1]; } } //----------------------------------------------------------------------- /* * Проверка на пустые данные */ function is_empty(val){ if (val == '' || val == null){ return true; } return (typeof val == 'undefined'); } //----------------------------------------------------------------------- /* * Загрузка данных для страницы и кеширование */ $.fn.remote_data = function(request_url, data, callback_fnc, use_cache){ /* дополнить callback */ function ext_callback_fnc(data, is_cached){ if (is_cached){ /* перегрузить страницу, так как необходимо авторизоваться */ if (!is_empty(data.session_expired)){ document.location.reload(); return; } if (!is_empty(use_cache) || use_cache != false){ $json_cache[request_url] = data; } } /* выключить лоадер */ $('#tab_progress').hide(); $('.progress_paging').hide(); /* перестроить пейджинг */ data.current = parseInt(data.current); $.fn.paging_update(data.current != 0 ? data.current : 1, Math.ceil(parseInt(data.total)/per_page)); gl_cur_page = data.current; /* выполнить callback */ callback_fnc(data.rows); } /* если данные есть в кеш - вернуть их сразу */ if (!is_empty($json_cache[request_url])){ ext_callback_fnc($json_cache[request_url], true); return; } /* данных нет в кеш - запросить с сервера */ $.getJSON(request_url, data, ext_callback_fnc); }; //----------------------------------------------------------------------- /* * Закладки * параметры: * base_url - префикс адреса для запросов, пример (base_url + '/' + active_tab + '/' + page) * options - список закладок, и callback(data) для них * active - активный таб по умолчанию, массив, {имя активной закладки: данные для этой закладки} */ $.fn.tabs = function(base_url, options, active){ var tab_options = options; var tabs_base_url = base_url; var first_tab = ''; /* отобразить закладки */ this.each(function(){ var tbody = $(''); var tr = $(''); tr.append($('
')); for (var i in options){ tr.append($('
' + options[i][0] + '
')); if (first_tab == ''){ first_tab = i; } } tr.append($('')); $(this).replaceWith($('').append($('')).append(tr)); /* событие при нажатии на закладку */ $('.menu').click(function(){ id = $(this).attr('id'); /* из-за того, что класс меню используется в других местах */ if (is_empty(tab_options[id])){ return; } $('.menu_').each(function(){ $(this).removeClass('menu_'); $(this).addClass('menu'); if ($(this).attr('id') == first_tab){ $(this).addClass('first'); } }); $(this).toggleClass('menu_'); $(this).removeClass('first'); /* текущая закладка */ $tabs.active = id; gl_tabs_id = id; $paging.event = tab_options[id][1]; /* для перехода на номер страницы с URL */ var page_nr = 1; if ($paging.page > 0){ page_nr = $paging.page; $paging.page = 0; } /* урл */ document.location.href = '#' + $tabs.active + ':' + page_nr; /* включить лоадер */ $('#tab_progress').show(); $.fn.remote_data(tabs_base_url + '/' + id + '/' + page_nr, '', tab_options[id][1]); return false; }); }); /* начальная иннициализация закладок */ /* есть ли такая закладка среди всех */ if ($tabs.active != '' && !is_empty(options[$tabs.active])){ for (var default_tab in active); $json_cache[tabs_base_url + '/' + default_tab + '/1'] = active[default_tab]; $("#" + $tabs.active).click(); }else if (!is_empty(active)){ for (var default_tab in active); /* добавить данные в кеш */ $json_cache[tabs_base_url + '/' + default_tab + '/1'] = active[default_tab]; /* переключить закладку */ $("#" + default_tab).click(); } }; //---------------------------------------------------------------------- /* * Постраничный вывод */ $.fn.paging = function(base_url, event){ $paging.base_url = base_url; if (!is_empty(event)){ $paging.event = event; } $(this).each(function(){ $(this).replaceWith('
' + '' + '' + '' + '' + '' + ''); }); }; //---------------------------------------------------------------------- /* * Обновить значения пейджинга */ $.fn.paging_update = function(cur, total){ $('.paging_control').each(function(){ if (total < 2){ $(this).hide(); }else{ var pg = new Array(); /* логика пейджинга */ p0 = cur; p_1 = cur - 1 >= 1 ? cur - 1 : -1; p1 = cur + 1 <= total ? cur + 1: -1; p_2 = p_1 - 1 >= 1 ? p_1 - 1 : -1; p2 = p1 != -1 && p1 + 1 <= total ? p1 + 1 : -1; p_3 = p2 == -1 && p_2 - 1 >= 1 ? p_2 - 1 : -1; p3 = p2 != -1 && p_2 == -1 && p2 + 1 <= total ? p2 + 1 : -1; p_4 = p1 == -1 && p_3 - 1 >= 1 ? p_3 - 1 : -1; p4 = p3 != -1 && p_1 == -1 && p3 + 1 <= total ? p3 + 1 : -1; /* переключение страниц */ function paging_switch(clk_nr){ /* включить лоадер */ $('.progress_paging').show(); /* запросить страницу */ $.fn.remote_data($paging.base_url + '/' + $tabs.active + "/" + clk_nr, '', $paging.event); document.location.href = '#' + $tabs.active + ':' + clk_nr; if (scrollTop){ $('html, body').animate({scrollTop: 0}, 0); } /* убать выделение на ссылке */ $('.page').blur(); return false; } /* массив для страниц */ pg.push(p_4, p_3, p_2, p_1, p0, p1, p2, p3, p4); /* назад */ $('.pagemenu-td2 .arrow_left').unbind().click(function(){ paging_switch(cur - 1 > 0 ? cur - 1 : 1); if (scrollTop){ $('html, body').animate({scrollTop: 0}, 0); } return false; }); /* вперед */ $('.pagemenu-td2 .arrow_right').unbind().click(function(){ paging_switch(cur + 1 < total ? cur + 1 : total); if (scrollTop){ $('html, body').animate({scrollTop: 0}, 0); } return false; }); /* форма для ввода страницы */ $('.page_form').unbind().submit(function(){ to_page = parseInt($(this).find('input:first').val()); paging_switch(to_page > 1 && to_page < total + 1 ? to_page : 1); return false; }); /* кнопка для ввода страницы */ $('.page_submit').unbind().click(function(){ $(this).submit(); return false; }); /* всего страниц */ $('.page_numb').val(cur); $('.page_total').html(total); var nr = 0; var pages = $(this).find('.page').each(function(){ for (;nr < pg.length; nr++){ if (pg[nr] != -1){ /* событие при переключении страниц */ $(this).unbind().click(function(){ paging_switch(parseInt($(this).html())); return false; }); /* пометить активную страницу */ $(this).html(pg[nr++]).css('font-weight', nr == 5 ? 'bold': 'normal').show(); return; } } $(this).hide(); }); $(this).show(); } }); }; //---------------------------------------------------------------------- /* * Кнопка с иконкой и событием */ $.fn.button = function(title, action, icon){ $(this).each(function(){ $(this).replaceWith($('' + '' + '' + '' + '' + '' + '
' + (!is_empty(icon) ? ' ' : '') + title + '
').click(action)); }); }; //---------------------------------------------------------------------- /* * Конвертация BBCode в HTML у class * пример: $('.msg_body').bb2html(); */ $.fn.bb2html = function(options){ $(this).each(function(){ $(this).html(bb2html($(this).html())); }); }; //---------------------------------------------------------------------- /* * Замена тега на html */ function replace_tag(tag_name){ if (tag_name.indexOf('[e') == 0){ tag = tag_name.substr(2, tag_name.length - 3); if (parseFloat(tag) > 0){ return ' '; }else{ return ''; } } if (tag_name.indexOf('[fg=') == 0){ if (skip_clr){ tag = '#515151'; } else { tag = tag_name.substr(4, tag_name.length - 5); } return ''; } if (tag_name.indexOf('[a=') == 0){ tag = tag_name.substr(3, tag_name.length - 4); return ''; } tag = tags[tag_name]; return tag != undefined ? tag : tag_name; } //---------------------------------------------------------------------- /* * Парсер bbcode в html */ function bb2html(bb_code){ /*временный реплайс для старых постов. Потом можно снести */ //bb_code = convert_smiles(bb_code); var out = ''; var tag = ''; var in_tag = false; if (typeof bb_code == 'undefined' || bb_code == null){ return ''; } while (bb_code.indexOf('') > -1) { bb_code = bb_code.replace('',''); } for (i = 0; i < bb_code.length; i++){ switch(bb_code.charAt(i)){ case '[': out += tag; tag = ''; tag += '['; in_tag = true; break; case ']': in_tag = false; tag += ']'; out += replace_tag(tag); tag = ''; break; default: if (!in_tag){ out += bb_code.charAt(i); }else{ tag += bb_code.charAt(i); } } } if (in_tag){ out += tag; } return out; } //---------------------------------------------------------------------- /* * Конвертация BBCode в HTML у class * пример: bbcode = $bb2html(html_var); */ $bb2html = function(bbcode){ return bb2html(bbcode); }; })(jQuery);