$(function(){
	baza.mobileBrowser = !!navigator.userAgent.match(/(mobile|ppc|mini|Symbian|Palm|Windows CE|Smartphone|nokia|samsung|sonyericsson|motorola|MIDP|PlayStation|Android)/i);

	baza.menuControl();
	baza.checkBadBrowser();
	baza.generateQR();
	baza.bullsHoverClick();
	baza.developersControl();
	$(document).bind('ajax_content_loaded', baza.bullsHoverClick);

	setTimeout(function(){
		$('#filtersForm').submit(function(){
			$('input:text[value=""], input:hidden[value=""]', '#filtersForm').attr('name', '');
		});
	}, 500);
})



var baza = {
	mobileBrowser: false,

	checkBadBrowser: function() {
		if (baza.mobileBrowser || $('#topline').length) return;

		// не показываем предупреждение для партнёрок
		var host = document.location.hostname;
		if (host.indexOf('farpost') < 0 && host.indexOf('baza.loc') < 0 && host.indexOf('ibaza') < 0 && host.indexOf('drom.ru') < 0) return;

		var v = parseInt($.browser.version);
		var badBrowser = (
				($.browser.msie && v < 8)
				||
				($.browser.opera && v < 11)
				||
				($.browser.mozilla && v < 5)
				||
				// safari 3-4
				(
					$.browser.webkit
						&& navigator.userAgent.indexOf('Chrome') < 0
						&& navigator.userAgent.indexOf('Safari/') >= 0
						&& (navigator.userAgent.indexOf('Version/3') >= 0 || navigator.userAgent.indexOf('Version/4') >= 0)
				)
		);
		
		// MRA изуродовал userAgent, не будем с ним связываться
		if (($.browser.version+'').indexOf('1.9') === 0) return;

		if (!badBrowser) return;

		var name = '';
		if ($.browser.msie) name = 'Internet Explorer';
		else if ($.browser.opera) name = 'Opera';
		else if ($.browser.mozilla) name = 'Mozilla Firefox';
		else if ($.browser.webkit) name = 'Apple Safari';
		else return;

		$("body").prepend("<div id='topline'><div>Вы пользуетесь устаревшей версией браузера <b>"+name+"</b>. Рекомендуем <a href='/badbrowser/' style='text-decoration: underline'>обновить её</a>.</div></div>");
	},

	requestCache: {},

	request: function(url, params) {
		var cacheKey = false;
		var me = this;

		me.url = url;
		
		if (!params) params = {};
		me.params = params;
		
		me.originalCallbacks = {};
	
		if (me.params.loadingElement) {
			me.loadingElement = $(me.params.loadingElement);
			if (!me.loadingElement.length && $('#' + me.params.loadingElement)) {
				me.params.loadingElement = '#' + me.params.loadingElement;
				me.loadingElement = $(me.params.loadingElement);
			}
		}
	
		me.handleErrors = function(xhr, statusText, error) {
			if (!xhr) return true;

			var exceptionText = false;
	
			if (!error) {
				var isJSON = false;
			    if (!/^\s*$/.test(xhr.responseText)) {
			    	var str = xhr.responseText.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
			    	isJSON = (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
			    }
	
				if (isJSON) {
					var data = {};
					try {
						data = $.parseJSON(xhr.responseText);
					} catch (error) {
						return true;
					}
		
					if (data.message)
						baza.showFlash(data);
		
					if (data.status == '200') return true;
				}
		
				if (xhr.status != 200 || xhr.responseText.match(/(Fatal|Parse) error:/i)) {
					exceptionText = xhr.responseText;
				}
			} else {
				exceptionText = statusText + '<br/>' + error + '<br/><pre>' + (error.stack || error.stacktrace || '')+'</pre>';
			}
	
			if (!exceptionText) return true;
	
			var headers = xhr.getAllResponseHeaders ? '<pre>'+xhr.getAllResponseHeaders()+'</pre>' : '';

			// не показываем ошибку для кросс-доменного set_ajax_cookie.php
			if (!me.url || me.url.indexOf('/set_ajax_cookie.php') < 0) {
				$('#ajaxException').remove();
				$('body')
						.append(
							"<div id='ajaxException'><button class='bigbutton confirm' onclick='$(\"#ajaxException\").remove()'>Закрыть сообщение об ошибке</button><h1>"
							+ me.url
							+ "</h1>"
							+ headers
							+ "<h2>Response</h2>"
							+ exceptionText + "</div>");
			}
	
			if (window.onerror)
				window.onerror('baza.request error', me.url, headers+"\n"+exceptionText);
	
			return false;
		}
	
		me.onComplete = function(xhr) {
			if (me.loadingElement) me.loadingElement.removeClass('loading');
	
			if (me.handleErrors(xhr) && me.originalCallbacks.onComplete) {
				me.originalCallbacks.onComplete(xhr);
			}
		}
	
		me.onSuccess = function(data, statusText, xhr) {
			if (cacheKey) {
				baza.requestCache[cacheKey] = data;
			}
			
			if (me.loadingElement) me.loadingElement.removeClass('loading');
	
			if (me.handleErrors(xhr) && me.originalCallbacks.onSuccess) {
				try {
					me.originalCallbacks.onSuccess(data);
				} catch (error) {
					me.handleErrors(xhr, statusText, error);
				}
			}
		}
	
		me.onCreate = function(xhr) {
			if (me.loadingElement) {
				me.loadingElement.addClass('loading');
			}
	
			if (me.originalCallbacks.onCreate) {
				me.originalCallbacks.onCreate(xhr);
			}
		}
	
		me.substituteCallback = function(name) {
			me.originalCallbacks[name] = me.params[name];
			me.params[name] = me[name];
		}
	
		me.substituteCallback('onCreate');
		me.substituteCallback('onComplete');
		me.substituteCallback('onSuccess');
	
		if (me.params.parameters) {
			me.params.parameters.ajax = 1;
		} else {
			me.params.parameters = {ajax : 1};
		}
	
		var jQueryParams = {};
		if (me.params.parameters) jQueryParams.data = me.params.parameters;
		if (me.params.method) jQueryParams.type = me.params.method.toUpperCase();
		if (me.params.onCreate) jQueryParams.beforeSend = me.params.onCreate;
		if (me.params.onComplete) jQueryParams.complete = me.params.onComplete;
		if (me.params.onSuccess) jQueryParams.success = me.params.onSuccess;
		if (me.params.dataType) jQueryParams.dataType = me.params.dataType;
		if (me.params.asynchronous) jQueryParams.async = me.params.asynchronous;
		
		jQueryParams.error = function(xhr, statusText, error){
			me.handleErrors(xhr, statusText, error);
		}
		
		
		
		if (me.params.cacheAnswer) cacheKey = me.url+'|'+$.param(jQueryParams.data);
		
		if (baza.requestCache[cacheKey]) {
			me.onSuccess(baza.requestCache[cacheKey]);
		} else {
			$.ajax(me.url, jQueryParams);
		}
	},

	showOverlay: function(clickCallback) {
		var overlay = $('<div id="overlay">&nbsp;</div>').appendTo('body');

		var dh = parseInt($(document).height());
		var wh = parseInt($(document).height());
		var h = dh > wh ? dh : wh;

		overlay
			.height(h + 'px')
			.click(function() {
				baza.hideOverlay();
				if (clickCallback) clickCallback();
			});
	},

	hideOverlay: function() {
		$('#overlay').remove()
	},

	skypeChecker: function(control, classContent, hintText) {
		control = $(control);
		if (typeof hintText === 'undefined') hintText = 'Отключите скайп!';
		if (typeof classContent === 'undefined') classContent = 'skype-warning';

		control.keyup(function (){
			if (this.value.indexOf("begin_of_the_skype") != -1) {
				$('<div class="' + classContent + '">' + hintText + '</div>').insertAfter(control);
				control.unbind('keyup');
			}
		});
	},
	
	showFlash: function(flashData) {
		flashText = flashData.message;
		flashType = flashData.status == '200' ? 'info' : 'warning';

		flashLink = '';
		if (flashData.link) flashLink = '&nbsp;<a href="' + flashData.link + '">' + flashData.linkText + '</a>';

		baza.hideFlash();

		$('<div id="flashMessage" class="' + flashType + '">\
				<a href="#" onclick="baza.hideFlash(); return false" class="close">&nbsp;</a>\
				<div id="flashText">' + flashText + flashLink + '</div>\
		</div>')
			.appendTo('body')
			.show();

		$(document).click(baza.hideFlash);
	},

	hideFlash: function(e) {
		if (e) {
			if (e) {
				if ($(e.target).attr('id') == 'flashMessage' || $(e.target).parents('#flashMessage').length)
					return;
			}
		}

		$('#flashMessage').remove();
		$(document).unbind('click', baza.hideFlash);
	},
	
	menuControl: function() {
		var link = $('#personalLink');
		var smtControl = $("<div class='menucontrol smt' id='personalLink_smt' style='display: none'><div>-</div></div>");

		link
			.bind('mouseover focus', function() {
				$('.hidden', link).show();
				link.addClass('opened');
				smtControl.show();
			})
			.bind('mouseout blur', function() {
				$('.hidden', link).hide();
				link.removeClass('opened');
				smtControl.hide();
			});

		smtControl
			.width(link.outerWidth())
			.height(link.outerHeight())
			.insertAfter(link);
	},

	generateQR: function() {
		var smsText = $('#smsText');
		var smsNumber = $('#smsNumber');
		var phoneTabContent = $('#mobileTabContentHolder');

		if(smsText.length && smsNumber.length && phoneTabContent.length) {
			var text = smsText.html().replace(/(&nbsp;)+/g, ' ');
			var number = smsNumber.html();
			var qrText = encodeURIComponent('SMSTO:' + number+':' + text);
			var qrUrl = 'https://chart.googleapis.com/chart?cht=qr&chs=80x80&chld=L|0&chl=' + qrText;

			phoneTabContent.prepend("<div id='qrImage' style='display: none'><img /><a href='http://help.baza.farpost.ru/QrCode' target='_blank'>Что это такое?</a></div>");

			$('#qrImage img')
					.attr('src', qrUrl)
					.load(function(){
						$('#qrImage').show();
					});
		}
	},

	bullsHoverClick: function(page) {
		if (!baza.mobileBrowser)
			$('.viewdirBulletinTable tr:has(.descriptionCell):not(:has(tr)), .bulletinBlock')
				.hover(function(){
					$(this).addClass('lineHovered');
				}, function(){
					$(this).removeClass('lineHovered');
				})
				.unbind('mouseup.bullsHoverClick')
				.bind('mouseup.bullsHoverClick', function(e){
					if (e.target && e.target.tagName != 'A' && e.target.tagName != 'INPUT' && e.target.tagName != 'BUTTON' && e.target.tagName != 'TEXTAREA' && !$(e.target).parents('a').length) {
						var href = $('a[href]:first', this).attr('href');
						if (href) {
							if (e.button == 1 || (e.button == 0 && e.ctrlKey)) window.open(href);
							else if (e.button == 0) document.location.href = href;
						}
						return false;
					}
				})
	},

	cp1251ToUtf8: function(str) {
		var result = original = converted = '',
		length = str.length;
		
		while (length--) {
			original = str.charCodeAt(length);
			
			if(original === 184){
				converted = 1105;
			} else if(original === 168){
				converted = 1025;
			} else if(original > 191 && original < 256){
				converted = original + 848;
			} else {
				converted = original;
			}
			result = String.fromCharCode(converted) + result;
		}
		return result;
	},
	
	parseUrlParams: function(url, paramName) {
		var ret = [];
		var paramsStr = (url+'').split('?')[1];

		if (paramsStr && paramsStr.length) {
			var whiteSpaceReg = /\+/g;
			var paramsReg = /([^&=]+)=?([^&]*)/g;
			
			function escapeStr(s) {
				return baza.cp1251ToUtf8(unescape(s.replace(whiteSpaceReg, ' ')));
			}
	
			var param, index, value;
			while (param = paramsReg.exec(paramsStr)) {
				index = escapeStr(param[1]);
				value = escapeStr(param[2]);
				if (paramName && index == paramName) return value; 
				ret[ret.length] = {index: index, value: value}
			}
		}

		if (paramName) return;
		return ret;
	},

	developersControl: function() {
		if (!$('.moderatorEditTabs').length && !$('.bulletinUserActions').length && !$('.adminBullEditControls').length) return;
		
		$('.developersControl .developersUserView').show();
		
		var developersUserViews = $('.developersControl .developersUserView a');
		developersUserViews.click(function(e){
			var index = developersUserViews.index(this);
			developersUserViews.filter('.s').removeClass('s');
			$(this).addClass('s');
			
			if (index) {
				$('body').addClass('developersUserViewMode');
			} else {
				$('body').removeClass('developersUserViewMode');
			}
			
			if (e.originalEvent)
				baza.setCookie('developers_userview', index);
			return false;
		});
		
		if (developersUserViews.eq(1).hasClass('s'))
			developersUserViews.filter('.s').trigger('click');
	},
	
	setCookie: function(name, value) {
		$.get('/set/' + name + '/' + value + '/', {ajax : 1});
	},
	
	trackGAEventOnLoad: [],
	trackGAEvent: function (category, action, optional_label, optional_value) {
		if (window.pageTracker && window.pageTracker._trackEvent) {
			pageTracker._trackEvent(category, action, optional_label, optional_value);
		} else {
			baza.trackGAEventOnLoad[baza.trackGAEventOnLoad.length] = {category: category, action: action, optional_label: optional_label, optional_value: optional_value};
		}
	},
	
	setTrackableHandler: function (account, variable) {
		var pageTracker = _gat._createTracker(account);
		pageTracker._trackPageview();
		pageTracker._setVar(variable);
		window.pageTracker = pageTracker;

		$.each(baza.trackGAEventOnLoad, function(){
			var params = this;
			pageTracker._trackEvent(params.category, params.action, params.optional_label, params.optional_value);
		});

		$('.trackable').each(function() {
			var trackable = $(this);
			var classes = trackable.attr('class').split(/\s+/);
	
			$.each(classes, function(){
				var name = this+'';
				var matches = name.match(/^ga-(\w+)-(\w+)-(\w+)(-(\w+))?/);
				if (matches) {
					trackable.click(function(){
						var params = {category: matches[1], action: matches[2], optional_label: matches[3], optional_value: matches[4]}
						pageTracker._trackEvent(params.category, params.action, params.optional_label, params.optional_value);
					});
				};
			});
		});
	}
};



function fieldnum(el) {
	if (!window.event || window.event.keyCode == 46
			|| window.event.keyCode == 44
			|| (window.event.keyCode >= 48 && window.event.keyCode <= 57))
		return true;
	return false;
}

function omnumber(number, titles, hideNumber) {
	var absnum = Math.abs(number);
	var cases = [ 2, 0, 1, 1, 1, 2 ];

	var title = titles[(absnum % 100 > 4 && absnum % 100 < 20) ? 2 : cases[Math
			.min(absnum % 10, 5)]];

	if (hideNumber == true) {
		return title;
	} else {
		return number + "&nbsp;" + title;
	}
}

function selectCheckBoxes(formId, select) {
	form = document.getElementById(formId);
	for (k in form) {
		if (form[k] != null && form[k].type == 'checkbox') {
			form[k].checked = select;
		}
	}
}

function numberValue(value, allowNegative, fractionDigits) {
	value = value.replace(/([^\d,\.-])+/g, '');
	value = value.replace(/(-{2,})+/g, '-');
	value = value.replace(/([,\.]{2,})+/g, '.');

	if (!fractionDigits) {
		value = value.replace(/([,\.])+/g, '');
	}

	var regExp = new RegExp(/^(-?)([^,\.]*)([\.,]?)(.*)$/g);
	var result = regExp.exec(value);

	if (result != null) {

		var number = new Object();

		number.sign = result[1];
		number.value = result[2].replace(/(\D)/g, '');
		number.separator = result[3];
		number.fraction = result[4].replace(/(\D)/g, '');

		value = '';

		if (number.sign && allowNegative)
			value = '-';
		if (number.value)
			value += number.value;// value +='0';
		if (number.separator && fractionDigits)
			value += ',';
		if (number.fraction && fractionDigits) {
			value += number.fraction.substr(0, fractionDigits);
		}

	}

	return value;
}

function setAndHighlight(element, newValue) {
	var oldValue = element.html();
	var oldBColor = false;
	var oldColor = false;
	element.html(newValue);

	if (oldValue) {
		oldBColor = element.css('backgroundColor');
		oldColor = element.css('color');

		if (oldValue != newValue) {
			element.css('backgroundColor', 'yellow');
			element.css('color', 'black');

			setTimeout(function() {
				if (oldBColor) element.css('backgroundColor', oldBColor);
				if (oldColor) element.css('color', oldColor);
			}, 2000);
		}
	}
}

function processActiveLink(link, onSuccess) {
	new baza.request($(link).attr('href'), {
		method : 'post',
		dataType: 'json',
		loadingElement : link,
		onSuccess : function(data) {
			$(link).addClass('ajaxLink');
			if (data.linktext && data.link) {
				$(link)
					.attr('href', data.link)
					.html(data.linktext);
			}

			if (onSuccess) onSuccess();
		}
	});
	return false;
}

function ajaxUrl(url) {
	if (url.match(/ajax=1/)) return url;

	var symbol = "?";
	if (url.match(/\?/)) symbol = "&";

	return url + symbol + 'ajax=1';
}




var controllerPopup = function(element, options) {
	this.afterOpen = function() {
	};
	this.beforeOpen = function() {
	};
	this.afterCreate = function() {
	};

	var me = this;
	
	this.element = $(element);
	
	if (!options) options = {};
	this.options = options;

	this.getOptions = function() {
		return options;
	}

	this.processControllerPopup = function(e) {
		if (e) e.preventDefault();

		me.beforeOpen();

		var link = me.element.attr('href');

		var url = '';
		if (me.options.url) url = ajaxUrl(me.options.url);
		else url = ajaxUrl(link);

		if ($('#popupContainer').length) {
			me.closePopup();
		}

		var loadingElement = options.loadingElement ? options.loadingElement : me.element;

		new baza.request(url, {
			asynchronous : false,
			loadingElement : loadingElement,
			onSuccess : function(data) {
				var popup = me.openPopup(data);

				$('form', popup)
					.each(function() {
						var form = $(this);
						
						if (me.options.simpleSubmit && me.options.simpleSubmit == true) {
							if (!form.attr('action')) form.attr('action', link);
						} else {
							form.attr('action', url);
							form.submit(me.submitHandler);
						}
						form.attr('method', 'post');
					});
				me.afterOpen();
			}
		});
		return false;
	}

	this.openPopup = function(html) {
		me.closePopup();
		$('iframe:visible').addClass('hideIframeForPopup').hide();

		document.currentPopup = me;

		var popup = $('#popupContainer');
		var link = me.element;

		if (link.length && link.hasClass('openLink')) {
			me.closePopup();
			return false;
		}

		if (!popup.length) {
			if (!me.options.popupStyle) me.options.popupStyle = '';

			var newPopup = $('<div class="popup" id="popupContainer" style="top: 0; ' + me.options.popupStyle + '">'
				+ html
				+ '</div>'
			);
			newPopup
				.find('*[autofocus]')
				.attr('autofocusAfterShow', true)
				.removeAttr('autofocus');
			newPopup.appendTo('body');

			popup = $('#popupContainer');
			
			if (!$('a.closePopup', popup).length)
				$('<a href="#" class="closePopup">&nbsp;</a>')
					.prependTo(popup);

			if (me.options.isModal)
				baza.showOverlay(me.close);
		}
		me.afterCreate();

		var popupWidth = parseInt(popup.outerWidth());
		var bodyWidth = $(document).width();

		var left = 0;
		var top = 0;
		if (me.options.placeCenter) {
			left = (bodyWidth - popupWidth) / 2;
			top = $(window).scrollTop() + 100;
		} else {
			var offset = link.offset();

			if (offset.left + popupWidth > bodyWidth - 40) left = bodyWidth - popupWidth - 20;
			else left = offset.left;

			top = offset.top + parseInt(link.innerHeight());
		}

		popup
			.css('left', parseInt(left) + 'px')
			.css('top', parseInt(top) + 'px')
			.show();

		popup.find('*[autofocusAfterShow]:first').focus();

		$(document).bind('click.controllerPopup keyup.controllerPopup', me.closePopup);

		if (link.length)
			link.addClass('openLink');

		if (me.options.onOpen)
			me.options.onOpen();

		return popup;
	}

	this.submitHandler = function(e) {
		if (e) e.preventDefault();
		
		var form = $(this);
		var popup = $('#popupContainer');
		var url = ajaxUrl(form.attr('action'));
		
		new baza.request(url, {
			method : 'post',
			loadingElement : popup,
			parameters : form.serialize(),
			onCreate : function() {
				form
					.find('input,textarea,select,button').not('[disabled]')
						.addClass('js_disabled_form_fields')
						.attr('disabled', true);
			},
			onComplete : function(data) {
				form
					.find('.js_disabled_form_fields')
						.removeClass('js_disabled_form_fields')
						.attr('disabled', false);

				if (typeof data == 'object') {
					if (data.status == '200')
						me.closePopup();

					if (me.options.onsubmit)
						me.options.onsubmit(data);
				} else {
					var popup2 = $(me.openPopup(data));

					$('form', popup2).each(function() {
						var form = $(this);
						form.submit(me.submitHandler);
						form.attr('method', 'post');
						if (!form.attr('action')) form.attr('action', url);
					});
				}
			}
		});

		return false;
	};

	this.closePopup = function(e) {
		if (e) {
			if (e.keyCode && e.keyCode != 27) return;

			if ($(e.target).attr('id') == 'popupContainer' || $(e.target).parents('#popupContainer').length) {
				if ($(e.target).hasClass('closePopup')) {
					me.close();
					return false;
				}
				return;
			}
		}
		me.close();
	};

	this.close = function()
	{
		$('.hideIframeForPopup').removeClass('.hideIframeForPopup').show();
		$('#popupContainer').remove();

		baza.hideOverlay();

		if (document.currentPopup)
			document.currentPopup = undefined;

		$('.openLink').removeClass('openLink');

		$(document).unbind('.controllerPopup');

		if (me.options.onClose) {
			me.options.onClose();
		}
	}

	if (me.element.length)
		me.element.click(me.processControllerPopup);
}



function processDeleteLink(linkElement, elementToDelete) {
	linkElement = $(linkElement);

	new baza.request(linkElement.attr('href'), {
		method : 'get',
		parameters : {'ajax' : 1},
		dataType : 'json',
		loadingElement : linkElement[0],

		onSuccess : function(data) {
			if (data.status == '200') $(elementToDelete).hide();
		}
	});

	return false;
}

function elementOnlyNumbers(element, isAllowNegative, fractionDigitsCount) {
	element = $(element);
	element.bind('change keydown keyup keypress', function() {
		var numValue = numberValue(element.val(), isAllowNegative, fractionDigitsCount);
		if (element.val() != numValue) element.val(numValue);
	});
}

function simpleEncode(valueArray, maxValue) {

	var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

	var chartData = [ 's:' ];
	for ( var i = 0; i < valueArray.length; i++) {
		var currentValue = valueArray[i];
		if (!isNaN(currentValue) && currentValue >= 0) {
			chartData.push(simpleEncoding.charAt(Math
					.round((simpleEncoding.length - 1) * currentValue
							/ maxValue)));
		} else {
			chartData.push('_');
		}
	}
	return chartData.join('');
}



function TabControl() {

	var activators = [];
	var containers = [];
	var callbacks = [];
	var activatorClasses = [];

	/**
	 * @param {HTMLElement}
	 *            activator
	 * @param {HTMLElement}
	 *            container
	 * @param {Object}
	 *            parameters optional
	 *            <ul>
	 *            <li>{tabActivatorClass:string} css class for finding tab activators (links and forms) in ajax tab content</li>
	 *            <li>{onUpdate:function(container)} called after every container content update</li>
	 *            <li>{isSelected:bool} if true than tab will be selected</li>
	 *            <li>{isUpdatable:bool} if true than tab will be updated by ajax before show</li>
	 * @return {TabControl} self
	 */
	/** @public */
	this.bind = function(activator, container, parameters) {
		var params = parameters ? parameters : {};
		var index = activators.length;
		activator = $(activator);
		container = $(container);
		activators[index] = activator;
		containers[index] = container;
		callbacks[index] = params.onUpdate;
		activatorClasses[index] = params.tabActivatorClass;

		activator.click(function(e) {
			e.preventDefault();
			params.isUpdatable ? selectTab(index, activator) : showTab(index);
			return false;
		});

		bindInnerActivators(index);

		container.hide();
		if (params.isSelected) {
			$.trim(container.html()) ? showTab(index) : selectTab(index, activator);
		}
	}

	/** @private */
	function bindInnerActivators(index) {
		var activatorClass = activatorClasses[index];
		if(activatorClass) {
			var container = containers[index];
			$('a.' + activatorClass, container).click(function(e) {
					e.preventDefault();
					selectTab(index, $(this));
					return false;
				}
			);
			$('form.' + activatorClass, container).each(function() {
					var form = $(this);
					var submit = $('input[type=submit]', form);
					var handler = function(e) {
						e.preventDefault();
						submit && submit.attr('disabled', true);
						selectTab(index, form);
						return false;
					};
					form.submit(handler);
					submit.click(handler);
				}
			);
		}

	}

	/** @private */
	function showTab(index) {
		$.each(activators, function() {
			$(this).removeClass('selected')
		});
		activators[index].addClass('selected');

		$.each(containers, function() {
			$(this).hide().removeClass('selected')
		});
		containers[index].show().addClass('selected');
	}

	/** @private */
	function selectTab(index, activationSource) {
		var container = containers[index];

		var isForm = activationSource.is('form');
		var post = isForm && activationSource.attr('method').toLowerCase() == 'post';
		var url = null;
		var params = {};

		if(isForm) {
			url = activationSource.attr('action');
			$('input[type!=submit][type!=button]', activationSource).each(function() {
				var control = $(this);
				if(control.is('[type=checkbox]')) {
					params[control.attr('name')] = control.is(':checked') ? '1' : '';
				} else {
					params[control.attr('name')] = control.val();
				}
			});
		} else {
			url = activationSource.attr('href')
		}

		if (!url || container.attr('src') == url && !container.hasClass('selected')) {
			showTab(index);
			callbacks[index] && callbacks[index]()
		} else {
			new baza.request(ajaxUrl(url), {
				method: post ? 'post' : 'get',
				parameters: params,
				loadingElement: activators[index],
				onSuccess: function(data) {
					container.attr('src', url);
					container.html(data);
					bindInnerActivators(index);
					showTab(index);
					callbacks[index] && callbacks[index]();
				}
			});
		}

	}
}

/**
 * Format a number with grouped thousands
 * 
 * @param {numeric}
 *            number
 * @param {int}
 *            decimals
 * @param {string}
 *            decSep
 * @param {string}
 *            tripletSep
 * @return {string}
 */
function number_format(number, decimals, decSep, tripletSep) {
	if (isNaN(number))
		return number;

	decSep = decSep ? decSep : '.';
	var parts = number.toFixed(decimals).split('.');

	if (tripletSep) {
		var triplets = new Array();
		for ( var i = parts[0].length; i > 0; i -= 3) {
			var pos = i > 0 ? i - 3 : i;
			triplets.push(parts[0].substring(i, pos));
		}
		parts[0] = triplets.reverse().join(tripletSep);
	}

	if (decimals && parseInt(parts[1]) == 0) {
		parts.splice(1);
	}

	return parts.join(decSep);
}

