/*
 * Общий js-код для всех страниц
 * © 2009—2100, Федор Шумов (fedor@shumov.com)
 */
 
//	Меняю заголовки
/* 
var
cufon_options = {};
cufon_options['.ui_menu a b'] = { fontFamily:'Myriad', fontWeight:'bold',	fontSize:'12px',	color:'#000000', textShadow: '0px 1px #ffffff'};
cufon_options['.ui_menu .selected a b'] = $.extend({}, cufon_options['.ui_menu a b'], {color:'#ffffff', textShadow: '0px 1px #000000'});
cufon_options['.ui_menu a.main b'] = $.extend({}, cufon_options['.ui_menu a b'], {fontWeight:'normal',	fontSize:'16px'});
cufon_options['.ui_menu .selected a.main b'] = $.extend({}, cufon_options['.ui_menu .selected a b'], {fontWeight:'normal',	fontSize:'16px'});
cufon_options['h1'] = $.extend({}, cufon_options['.ui_menu a b'], {fontSize:'29px', color:'-linear-gradient(#5a5a5a, 0.3=#5a5a5a, 0.7=#101010, #000000)'});



Cufon.replace('.ui_menu a b', 					cufon_options['.ui_menu a b']);
Cufon.replace('.ui_menu .selected a b', 		cufon_options['.ui_menu .selected a b']);
Cufon.replace('.ui_menu a.main b', 				cufon_options['.ui_menu a.main b']);
Cufon.replace('.ui_menu .selected a.main b', 	cufon_options['.ui_menu .selected a.main b']);
*/
Cufon.replace('h1#cufon', {fontFamily:'Myriad', fontWeight:'bold', fontSize:'29px', color:'-linear-gradient(#5a5a5a, 0.3=#5a5a5a, 0.7=#101010, #000000)', textShadow: '0px 1px #ffffff'});


var selected_li,
	shown_menu_li,
	ui_upper_links;
	
	
var														//	Общие переменные, в основном анимационные :)
tr_restored,											//	Функция при возврате удаленной строки
animation_jitter = {									//	Анимация рывком на выходе
	queue: true,
	duration: 100,
	easing: 'easeOutCirc'
},
animation_in_out = {									//	Анимация по экпоненте, с высоким ускорением в начале и высоким торможением в конце
	queue: false,
	duration: 300,
	easing: 'easeInOutExpo'
},
animation_in = $.extend({}, animation_in_out, {			//	Анимация по экпоненте, с высоким ускорением в начале
	easing: 'easeInExpo'
}),
animation_out = $.extend({}, animation_in_out, {		//	Анимация по экпоненте, с высоким торможением в конце
	easing: 'easeOutExpo'
}),
slowly_out = $.extend({}, animation_out, {		//	Анимация по экпоненте, с высоким торможением в конце
	duration: 900
}),
animation_queue_out = $.extend({}, animation_out, {		//	Анимация по экпоненте, с высоким торможением в конце, с поддержкой очереди
	queue: true
}),
highlight_in = $.extend({}, animation_in, {				//	Анимация вспышки, с поддержкой очереди
	queue: true,
	duration: 200
}),
highlight_out = $.extend({}, animation_out, {			//	Анимация угасания, с поддержкой очереди
	queue: true,
	duration: 1600
}),
animation_linear = $.extend({}, animation_in_out, {		//	Анимация линейная
	easing: 'linear',
	duration: 100
}),
format_ceil = {decimals: 0},					//	Параметры форматирования числа для отображения целых чисел
format_currency = {},									//	Параметры форматирования числа для отображения валют
table_zero = '&mdash;',									//	Вывод пустого значения в ячейке таблицы в виде прочерка (длиного тире)
sortInt = function(a, b){								//	Функция для сортировки массивов по числовому значению
	a = parseInt(a);
	b = parseInt(b);
	if (a < b) return -1;
	if (a > b) return 1;
	return 0;
};

	
//	Опредеяю адрес папки JS-файлов
var js_folder = '';
$(function(){
	$('script').each(function(){
		var script_src = this.src,
			pos = script_src.indexOf('jq_extend.js');
		if ( pos > -1 ) {
			js_folder = script_src.slice(0, pos);
			return false;
		}
	})
})

var gs_list = [];
$.extend({
		 
//	Привожу в более сокращенный вид функцию динамического подключения внешних JS файлов.
//	А также, чтоб не задумываться лишний раз повторять или не повторять вызов внешнего файла — ввожу псевдо-локальное кеширование :)
	gs: function() {
		if (arguments.length == 2) {
			var script_url = arguments[0],
				script_callback = arguments[1];
			if (typeof(script_url) == 'string') {
				if ($.inArray(script_url, gs_list) > -1) {
					script_callback();
				} else {
					gs_list.push(script_url);
					$.ajax({ 
					   'type': 'GET', 
					   'url': js_folder+script_url+'.js', 
					   'success': script_callback, 
					   'dataType': 'script', 
					   'cache': false 
					}); 
				}
			} else if (script_url instanceof Array) {
				$.gs(script_url.shift(), script_url.length==0 ? script_callback : function(){
					$.gs(script_url, script_callback);
				})
			}
		} else if (arguments.length > 2) {
			var script_url = [],
				script_callback = arguments[arguments.length-1];
			for (i = 0; i < arguments.length-1; i++) {
				script_url[i] = arguments[i];
			}
			$.gs(script_url, script_callback);
		}
	},

//	Проверка заданного значения переменных
	isset: function(v) {
		return (v !== undefined);
	},

//	Доработанный parseFloat
	parseFloat: function(s) {
		var str = (!$.isset(s) || s=='') ? '0' : s;
		str = str.toString().replace(/\,/, '.')
		return parseFloat(str.replace(/[^0-9\.]/ig, ''));
	},
	
//	Доработанный parseInt
	parseInt: function(s) {
		var str = (!$.isset(s) || s=='') ? '0' : s;
		str = str.toString().replace(/\,/, '.');
		return str.replace(/[^0-9\.]/ig, '')*1;
	},
	
/*
 * Форматирование чисел
 *
 * var new_num = $.format(num, {
 * 		decimals: 3,
 * 		point: '.',
 * 		separator: ',',
 * 		symbol: 'R$'
 * });
 */
	format: function(n, p) { 
		var options = $.extend({			
			decimals: 2,
			point: ',',
			separator: ' ',
			symbol: ''
		}, p),
			number = n,
			decimals = options.decimals,
			dec_point = options.point,
			thousands_sep = options.separator,
			currencySymbol = options.symbol,
		
			exponent = "",
			numberstr = number.toString(),
			eindex = numberstr.indexOf("e");
		
		if (eindex > -1) {
			exponent = numberstr.substring(eindex);
			number = parseFloat(numberstr.substring(0, eindex));
		}
		
		if (decimals != null) {
			var temp = Math.pow(10, decimals);
			number = Math.round(number * temp) / temp;
		}
		var sign = number < 0 ? "-" : "";
		var integer = (number > 0 ? Math.floor(number) : Math.abs(Math.ceil(number))).toString();
		
		var fractional = number.toString().substring(integer.length + sign.length);
		dec_point = dec_point != null ? dec_point : ".";
		fractional = decimals != null && decimals > 0 || fractional.length > 1 ? (dec_point + fractional.substring(1)) : "";
		if (decimals != null && decimals > 0) {
			for (i = fractional.length - 1, z = decimals; i < z; ++i) fractional += "0";
		}
		
		thousands_sep = (thousands_sep != dec_point || fractional.length == 0) ? thousands_sep : null;
		if (thousands_sep != null && thousands_sep != "") {
			for (i = integer.length - 3; i > 0; i -= 3) integer = integer.substring(0 , i) + thousands_sep + integer.substring(i);
		}
		
		if (options.symbol == '') {
			return sign + integer + fractional + exponent;
		} else {
			return currencySymbol + ' ' + sign + integer + fractional + exponent;
		}
	},	

//	Перевод из 125 секунд (минут) в формат с двоеточнием 2:05
	timeToColon: function(s) {
		var mn = Math.floor(s/60);
		var sc = s%60;
		return (mn<10?('0'+mn):mn) + ':' + (sc<10?('0'+sc):sc);
	},

//	Возврат суффикса для правильной подстановки склоняемого окончания
	end_of_word: function(num, suf1, suf2, suf3){
		var ost = num % 10;
		if (num < 11 || num > 20) {
			if (ost == 1) {
				return suf1;
			} else if (ost > 1 && ost < 5) {
				return suf2;
			} else {
				return suf3;
			}
		} else {
			return suf3;
		}
	}
});

$.fn.extend({
//	Очистка элемента от преобразований Cufon
	cufonRemove: function(value) {
		for (var i=0, l=this.length; i<l; i++) {
			var elem=this[i];
			if (elem.nodeType === 1) {
				$(elem).html($(elem).text());
			}
		}
		return this;
	},
	overed: function(){
		var arCls = $.isset(this.attr('class')) ? this.attr('class').split(' ') : [''];
		var cls = arCls[0];
		arCls[0] = cls.indexOf('overed')==-1 ? (cls.split('_')[0] + '_overed ') : cls;
		this.attr('class', arCls.join(' '));
		return this;
	},
	outed: function(){
		var arCls = this.attr('class').split(' ');
		var cls = arCls[0];
		arCls[0] = cls.indexOf('overed')!=-1 ? cls.split('_')[0] : cls;
		this.attr('class', arCls.join(' '));
		return this;
	},
	
	
//	Выводит alert с текстом. Затем переводит фокус на требуемый внимания элемент
//	и, если это возможно, выделяет его содержимое.
	alert_on_input: function(mes) {
		alert(mes);
		this.focus();
		this.select();	
		return this;
	},
	
//	Выводит alert с текстом. Затем переводит фокус на требуемый внимания элемент
	disabled: function(bool) {
		this.attr('disabled', bool);
		bool?this.addClass('disabled'):this.removeClass('disabled');
		return this;
	},

//	Анимированная подсветка элементов, только что изменившихся. Не просто украшение, а важная часть управления интерфейсов.
//	Ускоряет ориентирование, путем безусловного акцента. С возможностью таймера.
	highlight: function(timer) {
		var this_obj = this,
			reset_background = function(){
				$(this).removeAttr('style')
			},
			highlight_timer,
			highlight_this = function() {
				$.gs('ui_effects', function(){
					this_obj
						.css({
							'backgroundColor': '#fff'
						})
						.stop()
						.dequeue()
						.animate({
							'backgroundColor': '#aaff05'
						}, $.extend({}, highlight_in))
						.animate({
							'backgroundColor': '#fff'
						}, $.extend({}, highlight_out, {complete: reset_background}))
					this_obj.children().length > 0 && this_obj.hasClass('tr')
					? this_obj.children().first()
						.css({
							'backgroundColor': '#fff'
						})
						.stop()
						.dequeue()
						.animate({
							'backgroundColor': '#c7ff66'
						}, $.extend({}, highlight_in))
						.animate({
							'backgroundColor': '#fff'
						}, $.extend({}, highlight_out, {complete: reset_background}))
					: '';
					clearInterval(highlight_timer);
				});
			}
		
		highlight_timer = setTimeout(highlight_this, $.isset(timer) ? timer : 0)
		return this;
	},
	
	tr_addClass: function(jng, cls) {
		var this_tr = this.addClass(cls);
		$.isset(jng)?$.each(jng, function(){
			$(this).addClass(cls);
		}):'';
	},
	tr_removeClass: function(jng, cls) {
		var this_tr = this.removeClass(cls);
		$.isset(jng)?$.each(jng, function(){
			$(this).removeClass(cls);
		}):'';
	},


//	Помечает строку в таблице , как удаленну. Отображая ссылку с возможностью восстановления.
	mark_as_delete: function() {
		var this_tr = this,
		
			options = $.extend({			
				text: 'Удалится',
				linkText: 'Вернуть',
				remark_holders: this,
				class_owners: this,
				highlighters: this,
				restore: false,
				restoreComplete: $.noop,
				deleteComplete: $.noop
			}, arguments[0]),
		
			remark = options.text+' при сохранении. ';
			chbox = this_tr.data('chbox').attr('disabled', !options.restore).attr('checked', false);
		
		options.changeCounter = 
		$("input", options.class_owners).attr('disabled', !options.restore);
		if(!options.restore){
			chbox.addClass('format_hidden');
			options.class_owners.addClass('disabled');
			var a = $('<a href="#" class="js">' + options.linkText + '</a>.</i>'),
				a_click = function(){
					this_tr.mark_as_delete($.extend({}, options, {restore: true}));
					options.restoreComplete.call(this_tr, options);
					return false;
				},
				remark_node = $('<i class="remark">'+remark+'</i>');
			options.remark_holders.each(function(){
				var node = remark_node.clone().append(a.clone().click(a_click));
				$(this).children().append(node);
				$(this).data('remark', node)
			});
		} else {
			chbox.removeClass('format_hidden');
			options.class_owners.removeClass('disabled');
			options.remark_holders.data('remark').remove();
			options.remark_holders.removeData('remark');
			options.highlighters.highlight();
		}
		options.class_owners.removeClass('checked');
		count_this_change();
		check_some_checked();
	},

//	Сворачивает/разворачивает элемент по вертикали. Задается высота и скорость.
	expand_collapse: function(h, d) {
		h != 0 ? pre_expand.call(this) : '';
		var obj = this;
		$.gs('ui_effects', function(){
			obj.animate({
				'height': h
			}, $.extend(h == 0 ? {complete: collapsed} : {complete: expanded}, animation_in_out, $.isset(d) ? {duration: d} : {}));
		});
		return this;
	},
	
//	Хак для события onChange радио-кнопок в некоторых браузерах
	fix_radios: function() {
		function focus() {
			if (!this.checked) return;
			if (!this.was_checked) {
				$( this ).change();
			}
		}
	
		function change(e) {
			if (this.was_checked) {
				e.stopImmediatePropagation();
				return;
			}
			$( "input[name=" + this.name + "]" ).each(function() {
				this.was_checked = this.checked;
			});
		}
	
		return this.focus( focus ).change( change );
	}	
	
	
});

$(function(){
	var ui_menu = $('#user_menu .ui_menu');
	
	var ui_menu_children = ui_menu.children();
	var ui_menu_children_selected = ui_menu_children.filter('.selected');
	var ui_menu_timeout;

	ui_menu_children.each(function(i){
  	var li = $(this);
		if ($('ul',li).length>0) {
			li.mouseenter(function(){
				clearTimeout(ui_menu_timeout);
				ui_menu_children.removeClass('shown_menu');
				ui_menu_children.removeClass('selected');
				li.addClass('shown_menu').addClass('selected');
			})
			li.mouseleave(function(){
				clearTimeout(ui_menu_timeout);
				ui_menu_timeout = setTimeout(function(){
					li.removeClass('shown_menu').removeClass('selected');
					ui_menu_children_selected.addClass('selected');
				}, 500);
			});
		}
	})

	

	
	var inpts = $('input[type=text]');
	inpts.live('focus', function(){
	//	$(this).parent().setFocusClass();
	}).live('mouseenter', function(){
		$(this).parent().addClass('inp_overed');
	}).live('blur', function(){
		$(this).parent().removeClass('inp_focused');
	}).live('mouseleave', function(){
		$(this).parent().removeClass('inp_overed');
	});
		   
	var btns = $('button');
	btns
		.live('mouseenter', function(){
			$(this).overed();
		})
		.live('mouseleave', function(){
			$(this).outed();
		});
	
	$.browser.msie ? btns.attr('hideFocus', 'hideFocus') : '';
	
	$("input[type=radio]").fix_radios();
	$("label").dblclick(function(e){
		e.preventDefault();
		$(this).mousedown();
	}).mousedown(function(){
		return false;
	});
	
})

String.prototype.supplant = function(o){
	return this.replace(/{([^{}]*)}/g,
		function(a, b){
			var r = o[b];
			return typeof f === 'string' || typeof r === 'number' ? r : a;
		}
	);
}

