
// общедоступное пространство имен
var sharedNS = {}, open_flash_chart_data;

Array.prototype.max = function() {
    return Math.max.apply(null, this);
};

Array.prototype.min = function() {
    return Math.min.apply(null, this);
};

if (location.pathname == '/' && location.href.indexOf('message') != '-1') {
	alert(decodeURIComponent(location.href.match(/message=(.*)/)[1].replace(/\+/g, '%20', 'g') ) );
}

$(function() {
	
	$('.pseudo-table ul li:nth-child(even)').addClass('even');
	
	if ($('div.nav a.nolink').length == 0) {
		$('div.nav a').each(function() {
			var link = $(this), href = link.attr('href');
			
			if (location.pathname == href || location.pathname.replace(/^\//, '') == href) {
				link.addClass('nolink').parent().addClass('active');
			}
		});
	}
	
	// шапка
	if (typeof swfobject != 'undefined') {
		var flashvars = {
				mins: $('#header').attr('data-m').replace(/^0/, ''),
				h1: $('#header').attr('data-h1'),
				h2: $('#header').attr('data-h2'),
				h3: $('#header').attr('data-h3'),
				h4: $('#header').attr('data-h4'),
				h5: $('#header').attr('data-h5')
		};
		
		if (location.pathname != '/') {
			flashvars.logo_link = '/';
		}
		
		swfobject.embedSWF("themes/spbex/media/header.1212.swf", "header", "100%", "100", "9.0.0", 'expressInstall.swf', flashvars, {
			bgcolor: '#D8EEFA'
		});
	}
	
	// раскрытие веток основного меню
	/*
	$('#content-secondary .nav').delegate('li:has(ul)>a', 'click', function() {
		var list = $(this).parent().find('>ul');
		
		$('#content-secondary .nav li ul').not(list.toggle() ).not(list.parents('ul') ).hide();
		
		return false;
	});
	*/
	
	/* График
	------------------------------------------------------------------------------------------------------------------- */
	var graph = {
		init: function() {
			var ns = this;
						
			// получаем из HTML настройки
			$.each($('#graph-placeholder').text().split('|'), function(k, v) {
				var entry = v.split(',');
				
				if (!ns.settings[entry[0] ]) {
					ns.settings[entry[0] ] = [];
				}
				
				ns.settings[entry[0] ].push(entry[1]);
			});
			
			$('#graph-placeholder').text('').show();
			
			// добавляем форму для выбора отображаемых данных
			var options = '';
			
			$.each(this.settings, function(k, v) {
				options += '<option>' + k + '</option>';
			});
			
			this.dom.form = $('<form><select class="isin">' + options + '</select><span class="loading">Загружается..</span><p class="period" /></form>');
			
			this.dom.dataLoading = this.dom.form.find('span.loading');
			
			// селектор бумаги
			this.dom.isinSelector = this.dom.form.find('select').change(function() {
				ns.onIsinChange();
			});
			
			// селектор периода
			this.dom.pSelector = this.dom.form.find('p.period').delegate('a', 'click', function() {
				$(this).addClass('current').siblings().removeClass('current');
				ns.onPChange();
				
				return false;
			});
			
			this.dom.container.find('h2').after(this.dom.form);
			
			// дергаем обработчик, чтобы вывести первичные данные
			this.dom.isinSelector.change();
		},
		dom: {
			container: $('#graph')
		},
		settings: {},
		localPeriodName: {
			last: 'день',
			day: 'день',
			week: 'неделя',
			month: 'месяц',
			halfyear: 'полгода',
			year: 'год'
		},
		genericData: {
			title: { 
				"text": "",
				"style": "{font-size: 20px; font-family: Times New Roman; font-weight: bold; color: #A2ACBA; text-align: center;}"
			},
			y_legend: {
				text: '',
				style: '{ color:#6A92B4; font-size:12px; }'
			},
			x_legend: {
				text: '',
				style: '{ color:#6A92B4; font-size:12px; }'
			},
			x_axis: {
				stroke: 2,
				tick_height: 10,
				colour: "#ADB9C4",
				'grid-colour': "#e5eef7",
				labels: {
					labels: []
				}
			},
			y_axis: {
				stroke: 2,
				tick_height: 3,
				colour: "#ADB9C4",
				'grid-colour': "#e5eef7"
			},
			bg_colour: '#FFFFFF',
			elements: [
				{
					type: "line",
					alpha: 0.5,
					colour: "#6793B8",
					"font-size": 10,
					"dot-style": { "type": "dot", "dot-size": 3, "colour": "#3D5C56"},
					width: 1,
					values: []
				}
			],
			"num_decimals": 2,
			"is_fixed_num_decimals_forced": true,
			"is_decimal_separator_comma": true,
			"is_thousand_separator_disabled": true
		},
		onIsinChange: function() {
			var isin = this.dom.isinSelector.find('option:selected').text(), activeP, html = '', ns = this;
			
			$.each(ns.localPeriodName, function(k, v) {
				if ($.inArray(k, ns.settings[isin]) != -1) {
					html += '<a href="#" rel="' + k + '">' + v + '</a>'
				}
			});
			
			this.dom.pSelector.html(html);
			
			activeP = this.dom.pSelector.find('a[rel = "halfyear"]');
			
			if (!activeP.length) {
				activeP = this.dom.pSelector.find('a:last')
			}
			
			activeP.addClass('current');
			
			this.onPChange();
		},
		onPChange: function() {
			this.loadData();
		},
		/**
		 * Убирает дубликаты из массива данных о точках для графика
		 * @param {Object} array
		 */
		getUniquePoints: function(array) {
			var result = [];
			
			for (var i = 0; i < array.length; i++) {
				
				for (var j = i + 1; j < array.length; j++) {
					
					if (array[i].dat_time === array[j].dat_time) {
						j = ++i;
					}
					
				}
				
				result.push(array[i]);
			}
			
			return result;
		},
		loadData: function() {
			var ns = this, isin = this.dom.isinSelector.find('option:selected').text(), p = this.dom.pSelector.find('a.current').attr('rel'), request = null;
			
			this.dom.dataLoading.html('Загружается..').show();
			
			request = $.ajax({
				url: './importquotesperiod.rpc',
				data: {
					action: 'export',
					isin: isin,
					p: p
				},
				cache: false,
				dataType: 'json',
				success: function(response) {					
					var currentIsin = ns.dom.isinSelector.find('option:selected').text(), currentP = ns.dom.pSelector.find('a.current').attr('rel');
					
					ns.dom.dataLoading.hide();
					
					// если пользователь уже изменил выбор, но данные по пред. выбору пришли только сейчас, ничего делать не надо
					if (isin != currentIsin || p != currentP) {
						return;
					}
					
					if (response[0]) {
						// готовим данные для вывода в график
						var yAxisElements = [], max, min, dates = [], prices = [], data = $.extend(true, {}, ns.genericData);
						
						// график за день строится особым образом
						if (p == 'last' || p == 'day') {
							var fixedResponse = $.extend([], response), steps;
							
							// сортировка
							fixedResponse.sort(function(a, b) {
								if (new Date(a.dat_time) < new Date(b.dat_time) ) {
									return -1;
								} else if (new Date(a.dat_time) > new Date(b.dat_time) ) {
									return 1;
								} else {
									return 0;
								}
							});
							
							// удаление дубликотов
							fixedResponse = ns.getUniquePoints(fixedResponse);
							
							// преобразование формата дат
							$.each(fixedResponse, function(k, v) {
								v.dat_time = v.dat_time.replace(/\-/g, '/');
								yAxisElements.push(v.cena);
							});
							
							// отсечение лишнего
							if (fixedResponse.length > 35) {
								fixedResponse = fixedResponse.slice(fixedResponse.length - 35);
							}
							
							steps = Math.ceil(fixedResponse.length / 3);
							
							for (var i = 0; i < fixedResponse.length; i++) {
								var point = fixedResponse[i];
								
								data.elements[0].values.push({
									"type": "dot",
									"dot-size": 2,
									"halo-size": 0,
									"value": parseFloat(point.cena),
									"colour": "#D02020",
									"tip": new Date(point.dat_time).toString("dd.MM HH:mm") + " : " + parseFloat(point.cena)
								});
								
								if (i % steps == 0) {
									data.x_axis.labels.labels.push(new Date(point.dat_time).toString("HH:mm"));
								} else {
									data.x_axis.labels.labels.push('');
								}
								
							}
							
							data.x_axis.steps = steps;
							
						} else {
							
							// собираем данные в массивы, так будет проще с ними в дальнейшем работать
							$.each(response, function(k, v) {
								v.dat_time = v.dat_time.substr(0, 10).replace(/(\d+)-(\d+)-(\d+)/, '$1,$3,$2');
								dates.push(Date.parse(v.dat_time) );
								yAxisElements.push(v.cena);
								prices.push(v.cena);
							});
											
							// расстояние между датами
							var span = new TimeSpan(dates[dates.length - 1] - dates[0]);
							var date = dates[0].clone();
							var hit = false, price;
							
							
							data.x_axis.steps = Math.round(span.days / 5) + 1;
							
							// для каждого дня в полученном диапазоне дат
							for (var i = 0; i < span.days + 2; i++) {
								for (var j = 0; j < dates.length; j++) {
									if (date.equals(dates[j]) ) {
										price = prices[j];
										hit = true;
									}
								}
								if (hit) {
									data.elements[0].values.push({
										"type": "dot",
										"dot-size": 2,
										"halo-size": 0,
										"value": parseFloat(price), 
										"colour": "#D02020", 
										"tip": date.toString("dd.MM") + " : " + parseFloat(price)
									});
								} else {
									data.elements[0].values.push(null);
								}
								if (i % data.x_axis.steps == 0) {
									data.x_axis.labels.labels.push(date.toString("dd.MM") );
								} else {
									data.x_axis.labels.labels.push('');
								}
								hit = false;
								date.addDays(1);
							}
							
						}
						
						max = yAxisElements.max();
						min = yAxisElements.min();
						
						// находим число, которое будет определять, через какое кол-во единиц на оси Y нужно ставить риску. 
						// график будет проставлять около 5 рисок на линию.
						// "около" - потому что делается округление.
						data.y_axis.steps = Math.ceil( (max - min) / 5 * 100) / 100;
						
						// минимальное значение - 0,01.
						if (data.y_axis.steps === 0) {
							data.y_axis.steps = 0.01;
						}
						
						// добавляем по шагу вниз и вверх, чтобы значения не прилипали к границам графика
						data.y_axis.max = max + data.y_axis.steps;
						data.y_axis.min = min - data.y_axis.steps;
						
						// передаем данные в график
						if (!ns.dom.graph) {
							open_flash_chart_data = function() {
								return JSON.stringify(data);
							};
							
							swfobject.embedSWF("/themes/spbex/media/open-flash-chart.swf", "graph-placeholder", "100%", "250", "9.0.0", "/themes/spbex/media/expressInstall.swf", {}, {
								wmode: 'opaque'
							});
							
							ns.dom.graph = ns.dom.container.find('object');
						} else {
							ns.dom.graph.show();
							
							// небольшая отсрочка нужна для подавления иногда возникающих ошибок "Object #<an HTMLObjectElement> has no method 'load'"
							setTimeout(function() {
								ns.dom.graph[0].load(JSON.stringify(data) );
								ns.dom.dataLoading.hide();
							}, 500);
						}
					
					} else {
						ns.dom.dataLoading.html('<strong>Нет данных</strong>').show();
						ns.dom.graph && ns.dom.graph.hide();
					}
					
				}
			});
			
		}
	};
	
	if (graph.dom.container.length) {
		graph.init();
	}
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	/* Котировки
	------------------------------------------------------------------------------------------------------------------- */
	var quotes = {
		init: function() {
			var ns = this;
			
			// блок для подсказок
			this.dom.description = $('<div id="description"><div class="close" /><div class="text" /></div>').appendTo('body').bgiframe();
							
			this.dom.description.find('div.close').click(function() {
				ns.dom.description.hide();
				
				return false;
			});
			
			// вывод подсказок
			this.dom.containers.delegate('a.description', 'click', function() {				
				ns.dom.description.find('.text').html(ns.descriptions[$(this).attr('rel')]).end().show();
				
				return false;
			});
			
			// загружаем перевод имен элементов в XML на доступный для понимания язык
			$.ajax({
				url: './',
				data: {
					widget: 'xmlnames'
				},
				cache: false,
				dataType: 'json',
				success: function(data) {
					ns.xmlnames = $.parseJSON(data.content);
					
					// загружаем описания бумаг для вывода подсказок
					$.ajax({
						url: './',
						data: {
							widget: 'idescr'
						},
						cache: false,
						dataType: 'json',
						success: function(data) {
							ns.descriptions = $.parseJSON(data.content);
							
							// можно выводить данные
							ns.process();
						}
					});
					
				}
			});
		},
		dom: {
			containers: $('div.quotes')
		},
		xmlnames: null,
		descriptions: null,
		process: function() {
			var ns = this;
			
			this.dom.containers.find('div.quote').each(function() {
				var quoteContainer = $(this), placeholder = quoteContainer.find('div.placeholder'), id = placeholder.text();
				
				$.ajax({
					url: './quote/' + id,
					data: {
						widget: 'QuotesOnline'
					},
					cache: false,
					dataType: 'json',
					success: function(data) {
						if (data.status == 'error') {
							placeholder.replaceWith('Сервис временно недоступен, попробуйте еще раз позже.');
							quoteContainer.show();
						} else {
							var html = $(ns.translateXMLNames(ns.embedDescriptionLinks(data.content) ) );
						
							placeholder.replaceWith(html);
							quoteContainer.find('h2').append('<span class="date">' + html.find('thead').attr('class').replace(/(\d+:\d+)/, '[$1]') + '</span>').end().show();
						}
					}
				});
				
			});
			
		},
		translateXMLNames: function(string) {
			$.each(this.xmlnames, function(k, v) {
				var re = new RegExp('<th>' + k + '</th>', 'g');
				
				string = string.replace(re, '<th>' + v + '</th>');
			});
			
			return string;
		},
		embedDescriptionLinks: function(string) {
			$.each(this.descriptions, function(k, v) {
				var re = new RegExp(k, 'g');
				
				string = string.replace(re, '<a href="#" class="description" rel="' + k + '">' + k + '</a>');
			});
			
			return string;
		},
		showDescription: function() {
			$('#descr-viewer .text').html(this[$(link).text()]);
			$('#descr-viewer').show();
		}
	};
	
	if (quotes.dom.containers.length) {
		quotes.init();
	}
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	/**
	 * Вывод онлайн-котировок
	 * 
	 * В раздел помещается произвольное кол-во документов типа "quoteslistonline" с настройками.
	 * Виджет "OnlineQuotes" преобразует настройки документов в скрипт, который выводится в код страницы.
	 * Скрипт заполняет данные о котировках. При готовности страницы проверяется наличие данных, при наличии микромодуль инициализируется.
	 * Далее запрашиваются данные у кэшируещего интерфейса "./quotesonline.rpc", полученные данные отображаются в виде таблиц.
	 * Таблицы периодически обновляются.
	 * 
	 * Таблицы не связаны друг с другом, таймер на обновление устанавливается индивидуально.
	 * Запросы на получение данных выполняются последовательно, в порядке очереди.
	 * 
	 * Единственное, что стоит настраивать без навыков работы с JS - интервал обновления.
	 */
	
	quotes.online = {
		settings: {
			/* интервал обновления, мс. */
			interval: 15000
		},
		/* параметры для получения данных */
		params: {},
		/* кэш полученных данных */
		data: {},
		/* очередь на получение */
		fetchQueue: [],
		/* доступность механизма получения данных */
		fetcherIdle: true
	};
	
	quotes.online.init = function() {
		var that = this;
		$.each(this.params, function(k, v) {
			that.enqueueFetch(k);
		});
	};
	
	/* добавление в очередь */
	quotes.online.enqueueFetch = function(id) {
		this.fetchQueue.push(id);
		// запускаем обработку очереди, если можно
		if (this.fetcherIdle) {
			this.fetchData();
		}
	}
	
	/* получение данных */
	quotes.online.fetchData = function() {
		var that = this, id = this.fetchQueue.shift(), params = this.params[id];
		
		this.fetcherIdle = false;
			
		var data = {
			'proc': $.trim(params.proc),
			'_': new Date().getTime()
		};
		
		if ($.trim(params.fields) != '*' ) {
			data.fields = $.trim(params.fields).split(',');
		}
		
		if ($.trim(params.issues) != '*' ) {
			data.issues = $.trim(params.issues).split(',');
		}
		
		$.getJSON('quotesonline.rpc', data, function(response) {
			that.dataFetched(id, response);
			// переход к след. запросу в очереди, если он есть
			if (that.fetchQueue.length) {
				that.fetchData();
			} else {
				that.fetcherIdle = true;
			}
		});
	}
	
	/* callback после получения данных */
	quotes.online.dataFetched = function(id, data) {
		if (!data || data.length == 0) {
			return;
		}
				
		var that = this;
		// помещаем данные в кэш 
		this.data[id] = data;
		// отрисовываем таблицу
		this.drawTable(id);
		// через указанное время ставим в очередь на обновление
		setTimeout(function() {
			that.enqueueFetch.call(that, id);
		}, this.settings.interval);
	}
	
	/* отрисовка таблицы */
	quotes.online.drawTable = function(id) {
		var prevTable = $('div.quote.quote-' + id), table = '<div class="quote quote-' + id + '"><table><thead><tr>', 
			params = this.params[id], noFieldsAreWithSum = false, allFieldsAreWithSum = false, fieldsWithSum = [], sums = {}, someSumsAreCalculated = false;
		
		if (params.fieldsWithSum == '') {
			noFieldsAreWithSum = true;
		} else if (params.fieldsWithSum == '*') {
			allFieldsAreWithSum = true;
		} else {
			fieldsWithSum = params.fieldsWithSum.split(',');
		}
		
		$.each(this.data[id][0], function(k, row) {
			table += '<th>' + k + '</th>';
		});
		
		table += '</tr></thead><tbody>';
		
		$.each(this.data[id], function(k, row) {
			table += '<tr>';
			$.each(row, function(k1, cell) {
				table += '<td>' + cell + '</td>';
				
				if ( (allFieldsAreWithSum || $.inArray(k1, fieldsWithSum) != -1 ) && !isNaN(cell) ) {
					var sum = parseFloat(cell);
					
					if (!isNaN(sum) ) {
						sums[k1] = sums[k1] || 0;
						sums[k1] += sum;
						someSumsAreCalculated = true;
					}
				}
			});
			table += '</tr>';
		});
		
		if (someSumsAreCalculated) {
			var columnNumber = 0, precision;
			
			table += '<tr class="sum"><td>Итого:</td>';
			
			if (params.sumPrecision.indexOf(':') == -1) {
				precision = parseInt(params.sumPrecision, 10);
			} else {
				var precisionsData = params.sumPrecision.split(','), precision = {};
				
				for (var i = 0; i < precisionsData.length; i++) {
					var precisionDataSplitted = precisionsData[i].split(':');
					
					precision[precisionDataSplitted[0] ] = precisionDataSplitted[1];
				}
			}
		
			$.each(this.data[id][0], function(k, row) {
				if (columnNumber != 0) {
					var value = '-';
					
					if (typeof sums[k] == 'number') {
						value = sums[k];
						
						if (!isNaN(precision) && typeof precision == 'number') {
							var multiplier = Math.pow(10, precision);
							
							value = Math.round(value * multiplier) / multiplier;
						} else if (typeof precision == 'object') {
							if (typeof precision[k] != 'undefined') {
								var multiplier = Math.pow(10, precision[k]);
								
								value = Math.round(value * multiplier) / multiplier;
							}
						}
						
					}
					
					table += '<td>' + value + '</td>';
				}
				
				columnNumber++;
			});
			
			table += '</tr>';
		}
		
		table += '</tbody></table></div>';
		
		if (prevTable.length) {
			prevTable.replaceWith(table);
		} else {
			$(table).appendTo('#content-primary-text');
		}
	};
	
	if (typeof sharedNS.onlineQuotesParams != 'undefined') {
		quotes.online.params = sharedNS.onlineQuotesParams;
		quotes.online.init();
	}
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	/* Фильтратор архива
	------------------------------------------------------------------------------------------------------------------- */
	jQuery.fn.sort = function() {  
		return this.pushStack( [].sort.apply( this, arguments ), []);  
	};
	
	function sortAlpha(a, b) {
		return a.text > b.text ? 1 : -1;  
	};
	
	var now = new Date();
	var date = now.getDate() < 10 ? '0' + now.getDate() : now.getDate();
	var month = now.getMonth() + 1;
	
	if (month < 10) {
		month = '0' + month;
	}
	
	$('form.archive-filtrator .date').val(now.getFullYear() + '.' + month + '.' +  date).datepicker({
		dateFormat: 'yy.mm.dd',
		changeMonth: true,
		changeYear: true
	}).keydown(function() {
		return false;
	});
	
	$('form.archive-filtrator select.target').empty();
	
	var xmlNames = {};
	
	if ($('form.archive-filtrator').length !== 0) {
		// загружаем перевод имен элементов в XML на доступный для понимания язык
		$.ajax({
			url: './',
			data: {
				widget: 'xmlnames'
			},
			cache: false,
			dataType: 'json',
			success: function(data) {
				xmlNames = $.parseJSON(data.content);
			}
		});
	}
	
	$('form.archive-filtrator').each(function() {
		var form = $(this), results = form.next('.archive-filtrator-results'),
			listURLName = form.find('input[name = "procedurelist"]').val(), issueURLName = form.find('input[name = "procedureget"]').val();
		
		// заполняем список доступных бумаг
		$.getJSON('./quotesonline.rpc?proc=' + listURLName + '&qdb=true', function(response) {
			var options = '', isins = [], sasins = {};
			
			$.each(response, function(k, v) {
				isins.push(v.short_isin || v.isin);
				sasins[v.short_isin || v.isin] = v.isin;
			});
			
			$.each(isins.sort(), function(k, v) {
				options += '<option value="' + sasins[v] + '">' + v + '</option>';
			});
			
			form.find('select.source').empty().append(options);
		});
		
		// выбор бумаг
		form.find('.issues button').click(function() {
			var source = form.find('select.source'), sourceOptions = source.find('option'), sourceSelectedOptions = source.find('option:selected'),
				target = form.find('select.target'), targetOptions = target.find('option'), targetSelectedOptions = target.find('option:selected');
			
			if ($(this).is('.totarget') && sourceSelectedOptions || $(this).is('.tosource') && targetSelectedOptions) {
				if ($(this).is('.totarget') ) {
					targetOptions.removeAttr('selected').add(sourceSelectedOptions).sort(sortAlpha).appendTo(target);
				} else {
					sourceOptions.removeAttr('selected').add(targetSelectedOptions).sort(sortAlpha).appendTo(source);
				}
			}
			
			return false;
		});
		
		form.find('input[type = "submit"]').removeAttr('disabled');
		
		form.submit(function() {
			var startDate = form.find('p.dates input:eq(0)').val(),
				endDate = form.find('p.dates input:eq(1)').val(),
				requests = form.find('select.target option').length;
				
			if (form.find('select.target option').length) {
				results.empty();
				form.find('span.status, img.loader').remove();
				$('<span class="status">Ваш запрос обрабатывается</span>').insertAfter(form.find('input.submit') );
				$('<img class="loader" src="./themes/spbex/images/icons/loader.gif" alt="" />').prependTo(form);
				
				form.find('select.target option').each(function(k, v) {
					var issueName = $(this).val(), issueAlias = $(this).text();
					
					$.getJSON('./quotesonline.rpc?proc=' + issueURLName + '%20%27' + startDate + '%27,%27' + endDate + '%27,%27' + encodeURIComponent(issueName) + '%27&qdb=true&random=' + new Date().getTime(), function(response) {
						
						if (!response[0]) {
							$('<p>По бумаге ' + issueAlias + ' на заданный период информации нет.</p>').appendTo(results);
						} else {
							var table = '<h3>' + issueAlias + '</h3><div class="quote"><table class="quotes"><thead><tr>';						
							
							$.each(response[0], function(k, row) {
								var name = typeof xmlNames[k] != 'undefined' ? xmlNames[k] : k;
								
								table += '<th>' + name + '</th>';
							});
							
							table += '</tr></thead><tbody>';
							
							$.each(response, function(k, row) {
								table += '<tr>';
								$.each(row, function(k1, cell) {
									table += '<td>' + cell + '</td>';
								});
								table += '</tr>';
							});
							
							table += '</tbody></table></div>';
							
							$(table).appendTo(results);
						}
						
						requests--;
						
						if (requests === 0) {
							form.find('span.status, img.loader').remove();
							form.find('input[type = "submit"]').removeAttr('disabled');
						}
						
					});
				});
			}
			
			if (form.find('select.target option').length) {
				form.find('input[type = "submit"]').attr('disabled', 'disabled');
			}
			
			return false;
		});
		
	}).find(':disabled').removeAttr('disabled').end().find('[readonly = "true"]').removeAttr('readonly');
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	// добавляем отступы от заголовков таблиц
	$('table.standard2 th').each(function() {
		$(this).parent().prev().addClass('pre-th').end().next().addClass('post-th');
	});
	
});
