/**
 * @author Sergey Chikuyonok (serge.che@gmail.com)
 * @link http://chikuyonok.ru
 */

jQuery.extend(jQuery.fn, {
	fixHeight: function() {
		return this.each(function(){
			var elem = $(this);
			elem.css('height', elem.height());
		});
	},
	
	releaseHeight: function() {
		return this.each(function(){
			var elem = $(this);
			elem.css('height', '');
		});
	}
});


 /**
 * Эмулирует поведение input type="search" как в Сафари
 * 
 * @param {Element} elem Поле ввода
 * @param {String} [class_empty] Класс для пустого поля ввода
 */
function makePlaceholder(elem, class_empty) {
	class_empty = (typeof class_empty === 'string') ? class_empty : 'empty';
	elem = $(elem);
	
	elem.focus(function () {
		if (this.value === elem.attr('placeholder')) 
			this.value = '';
		
		elem.removeClass(class_empty);
	});

	elem.blur(function () {
		if (!(elem.val().length && elem.val() != elem.attr('placeholder'))) {
			elem.val(elem.attr('placeholder'));
			elem.addClass(class_empty);
		}
	}).blur();
}

var initExpandables = (function(){
	/**
	 * @param {jQuery} elem
	 * @return {jQuery}
	 */
	function findExpandable(elem) {
		if (elem.parent().hasClass('expandable'))
			return elem.parent();
		else if (elem.parent().next('.expandable').length)
			return elem.parent().next();
		else
			return null;
	}
	
	function expand() {
		var elem = $(this).parent(),
			expand_elem = findExpandable(elem);
					
		if (expand_elem) {
			// меряем высоту контента
			var h = expand_elem.show().height();
			expand_elem.hide();
			
			expand_elem.slideDown(Math.max(300, h * 0.8), function(){
				expand_elem.addClass('expandable-expanded');
			});
			
			expand_elem.prev('.expander').addClass('expander-expanded');
		}
	}
	
	function collapse() {
		var elem = $(this).parent(),
			expand_elem = findExpandable(elem);
					
		if (expand_elem) {
			expand_elem.slideUp(Math.max(300, expand_elem.height() * 0.8), function(){
				expand_elem.removeClass('expandable-expanded');
			});
			
			expand_elem.prev('.expander').removeClass('expander-expanded');
		}
	}
	
	return function() {
		$('.expandable').each(function(){
			var elem = $(this);
			if (elem.data('expand-inited')) 
				return;
			
			elem.prev('.expander').andSelf()
				.find('.collapsed-text .pseudo-href').click(expand).end()
				.find('.expanded-text .pseudo-href').click(collapse);
				
			elem.data('expand-inited', true);
		});
	}
})(); 

var initRefreshable = (function(){
	/** @type {jQuery[]} */
	var blocks = [];
	
	function refreshBlock(num) {
		var block = blocks[num];
		var content = block.find('.refreshable-content');
		
		if (block.hasClass('refreshable-loading'))
			return;
		
		// фиксируем высоту блока
		block.addClass('refreshable-loading');
		
		// считаем максимальную высоту блока
		var max_height = 0;
		content.each(function(){
			max_height = Math.max(max_height, $(this).height());
		});
		
		// выставляем общую высоту
		content.css('height', max_height);
		
		// добавляем затенения
		content.each(function(i){
			var shade = $('<div class="shade"></div>').css({opacity: 0, visibility: 'hidden'}).appendTo(this);
			$t(shade).tween({
				opacity: 1, 
				time: 0.3,
				delay: 0.1 * i,
				onStart: function() {
					// prevent flickering in IE
					shade.css({'visibility': 'visible'});
				},
				namespace: 'rf' + num
			});
		});
	}
	
	/**
	 * Загружает данные для обновляемого блока
	 * @param {Number} block_num Индекс блока в массиве <code>blocks</code>
	 */
	function loadData(block_num) {
		/** @type {jQuery} */
		var block = blocks[block_num];
		if (block) {
			var content = block.find('.refreshable-content'),
				content_num = 0,
				content_values = [];
				
			content.addClass('refreshable-content-hidden');
			
			/**
			 * Загружаем данные
			 */
			function _load() {
				var url = content.eq(content_num).attr('refresh-url');
				if (url) {
					$.get(url, function(data){
						content_values.push(data);
						content_num++;
						if (content_num < content.length)
							_load();
						else
							_loadComplete();
					}, 'html');
				}
			}
			
			/**
			 * Закончили загружать все данные
			 */
			function _loadComplete() {
				var max_height = 0;
				// обновляем данные внутри каждого контентного блока
				content.each(function(i, n){
					n = $(n);
					var shade = n.find('.shade').remove();
					n.html(content_values[i]).append(shade);
					
					var old_height = n.height();
					n.css('height', 'auto');
					max_height = Math.max(max_height, n.height());
					n.height(old_height);
				});
				
				var anim_opt = {
					time: 0.5,
					transition: 'easeinoutquad'
				};
				
				// меняем размеры контейнера
				$t(content, anim_opt).tween({
					height: max_height,
					onComplete: function(){
						content.css('height', '');
						content.removeClass('refreshable-content-hidden');
//						block.css('height', '');
						// убираем затенения
						block.find('.shade').each(function(i, n){
							$t(n).tween({
								opacity: 0,
								time: 0.3,
								delay: 0.1 * i + 0.5,
								transition: 'linear',
								onComplete: function() {
									$(n).remove();
									// снимаем блокировку
									block
										.data('refresh-loading', false)
										.removeClass('refreshable-loading');
										
									// вызываем коллбэк на рефреше
									var callbacks = content.data('refresh-callback');
									if (callbacks) {
										$.each(callbacks, function(i, n){
											n.call(block[0]);
										});
									}
								}
							});
						});
					}
				});
				
				// чистим память
				_load = _loadComplete = null;
			}
			
			_load();
		}
	}
	
	return function() {
		$('.refreshable').each(function(i){
			var elem = $(this);
			if (elem.data('refreshable-inited'))
				return;
				
			elem.bind('refresh', function(){
				refreshBlock(block_num);
			});

			blocks.push(elem);
			var block_num = blocks.length - 1;
				
			elem.find('.icon.refresh').click(function(){
				refreshBlock(block_num);
			});
			
			elem.data('refreshable-inited', true);
			jTweener.addNSAction({onComplete: function(){
				loadData(block_num);
			}}, 'rf' + block_num);
		});
	}
})();

var initResizable = (function(){
	var is_dragging = false,
		start_y = 0,
		start_height = 0,
		min_height = 100,
		max_height = 0,
		drag_elem;
	
	function startDrag(/* Event */ evt) {
		drag_elem = $(evt.target).parent();
		start_height = drag_elem.height();
		
		// замеряем максимальную высоту
		drag_elem.css('height', 'auto');
		max_height = drag_elem.height();
		
		drag_elem.css('height', start_height);
		
		start_y = evt.pageY;
		is_dragging = true;
	}
	
	function stopDrag() {
		is_dragging = false;
	}
	
	function doDrag(/* Event */ evt) {
		if (!is_dragging)
			return;
			
		var cur_height = Math.min(max_height, Math.max(min_height, start_height + evt.pageY - start_y));
		drag_elem.css('height', cur_height);
		evt.preventDefault();
		return false;
	}
	
	$(document).mousemove(doDrag).mouseup(stopDrag);
	
	return function(context) {
		$('.opinion > blockquote', context || document).not('.opinion-inited').each(function(){
			$(this).addClass('opinion-inited').append('<div class="opinion-shade png iesizing-scale"></div>');
			$('<div class="drag-cn"></div>').mousedown(function(/* Event */ evt) {
				startDrag(evt);
				evt.preventDefault();
				return false;
			}).appendTo(this);
		});
	}
})();

$(function(){
	// В Сафари placeholder и так работает
	if (!$.browser.safari)
		$('input[placeholder]').each(function() {
			makePlaceholder(this);
		});
		
	initExpandables();
	initRefreshable();
	initResizable();
	
	jQuery.extend(jQuery.fn, {
		registerRefreshCallback: function(fn) {
			this.each(function(i, n){
				var ar = $(this).data('refresh-callback') || [];
				ar.push(fn);
				$(this).data('refresh-callback', ar);
			});
		}
	});
	
	$('.opinion-section .refreshable-content').registerRefreshCallback(function(){
		initResizable(this);
	})
});
