/* запрет изменения цвета фонта */
var skip_clr = false;
var per_page = 10;
var gl_cur_page = 0;
var gl_tabs_id;

(function($){

	$json_cache = new Object();
	$paging = new Object();
	$paging.event = '';
	$paging.page  = 1;
	$tabs = new Object();
	$tabs.active = '';

	/* BBCode mapping */
	var tags = {
		'[b]'   : '<b>',
		'[/b]'	: '</b>',
		'[i]'	: '<i>',
		'[/i]'	: '</i>',
		'[u]'	: '<u>',
		'[/u]'	: '</u>',
		'[CENTER]'	: '',
		'[/CENTER]'	: '',
		'[JUSTIFY]'     : '',
		'[/JUSTIFY]'    : '',
		'[r]'	: '<span style="color:#c57f00;font-style:italic;font-weight:bold">',
		'[/r]'	: '</span>',
		'[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]'	: '</span>',
		'[/fg]'	: '</span>',
		'[wbr]'	: '<wbr>',
		'[/a]'	: '</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 = $('<tbody></tbody>');
			var tr = $('<tr></tr>');

			tr.append($('<td class="hole"><img src="/skin/_.gif" width="1" height="1" alt=""><br></td>'));

			for (var i in options){
				tr.append($('<td class="menu' + (first_tab == '' ? ' first' : '') + '" id="' + i + '"><div class="topmenu"><div class="text">' + options[i][0] + '</div><div class="over"></div></div></td>'));
				if (first_tab == ''){
					first_tab = i;
				}
			}
			tr.append($('<td class="right_hole" style="font-size: 10px; text-align: right; padding-right: 10px;"><img id="tab_progress" src="/images/ajax_tab_loader.gif" style="display: none"></td>'));

			$(this).replaceWith($('<table cellspacing="0" cellpadding="0" class="topmenu" />').append($('<tbody />')).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('<table cellspacing="0" cellpadding="0" class="pagemenu no_href paging_control" style="display: none"> ' +
					'<tr>' +
						'<td class="pagemenu-td1"><img src="/images/ajax_paging_loader.gif" class="progress_paging" style="display: none"></td>' +
						'<td class="pagemenu-td2">' +
							'<a href="#" class="arrow arrow_left">&#9668;</a>' +
							'<a href="#" class="page"></a>' +
							'<a href="#" class="page"></a>' +
							'<a href="#" class="page"></a>' +
							'<a href="#" class="page"></a>' +
							'<a href="#" class="page"></a>' +
							'<a href="#" class="arrow arrow_right">&#9658;</a>' +
						'</td>' +
						'<td class="pagemenu-td3">' +
							'<form class="page_form" method="post" action="">' +
								'<table cellspacing="0" cellpadding="0" align="right">' +
									'<tr>' +
										'<td><input name="page_numb" id="page_numb" class="page_numb" maxlength="4" value="0" type="text"></td>' +
										'<td>&nbsp;&nbsp; из &nbsp;<span class="page_total">0</span>&nbsp;&nbsp;</td>' +
										'<td><a href="#" class="page_submit">&#9658;&#9658;</a></td>' +
									'</tr>' +
								'</table>' +
							'</form>' +
						'</td>' +
					'</tr>' +
				'</table>');
		});
	};
	//----------------------------------------------------------------------


	/*
	* Обновить значения пейджинга
	*/
	$.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;

					$('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);
					$('html, body').animate({scrollTop: 0}, 0);
					return false;
				});

				/* вперед */
				$('.pagemenu-td2 .arrow_right').unbind().click(function(){
					paging_switch(cur + 1 < total ? cur + 1 : total);
					$('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($('<table cellspacing="0" cellpadding="0" class="button">' +
			                        '<tr>' +
			                                '<td class="button-td1"> </td>' +
			                                '<td class="button-td2"> ' + (!is_empty(icon) ? '<img src="/images/buttons/' + icon + '.gif" alt="" /> ' : '') +  title + '</td>' +
			                                '<td class="button-td3"> </td>' +
			                        '</tr>' +
			                '</table>').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 (parseInt(tag) > 0){
				return '<wbr><span style="vertical-align: middle"><img src="/images/smile/' + tag + '.gif" alt=""></span> ';
			}else{
				return '';
			}
		}

		if (tag_name.indexOf('[fg=') == 0){

			if (skip_clr){
				tag = '#515151';
			} else {
				tag = tag_name.substr(4, tag_name.length - 5);
			}
			return '<wbr><span style="color: ' + tag + '">';
		}

		if (tag_name.indexOf('[a=') == 0){
			tag = tag_name.substr(3, tag_name.length - 4);
			return '<wbr><a href="'+ tag + '" target="_blank">';
		}

		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('<WBR>') > -1) {
			bb_code = bb_code.replace('<WBR>','<span class="wbr"></span>');
		}

		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);
