﻿/**
 *   Выставление оценки (звёздочек).
 *
 */
;(function($){

//вызовом этого метода вешаются обработчики
//синтаксис вызова
//$( jQuery-selector ).rating( object_id );
$.fn.rating = function( object_id, rating_list, site_domain, is_company )
{
	//this - jQuery-объект
	var _this = this;
	var i, sum, cnt;
	
	var self_rating = 0;
	var star_width = $(this).find('.stars').width() / 5;
	
	var detailed_list, chart_data;
	
	var gchart_SETTINGS = {
		width:  142,
		height: 107,
		format: 'png',
		usePost: false,
		margins: [0,0],
		title: '',
		titleColor: 'black',
		backgroundColor: '#ffffff',
		legend: 'right',
		type: 'line'
	};
	
	sum = 0;
	cnt = 0;
	for( i in rating_list )
	{
		sum += Number(i) * Number(rating_list[i]);
		cnt += Number(rating_list[i]);
	}
	
	this.find('.stars')
		.mousemove(
			function(e)
			{
				var mark = Math.ceil( ( e.pageX - $( this ).offset().left - 0 ) / star_width );
				$(this).children( 'div' ).width( ( mark * 20 ) + '%' );
			}
		)
		.mouseleave(
			function(e)
			{
				showSelfRating();
			}
		)
		.click(
			function(e)
			{
				if( is_company )
				{
					popup3();
					return;
				}

				var _this = this;
				var mark = Math.ceil( ( e.pageX - $( this ).offset().left - 0 ) / star_width );
			
				doQuery(
					'/ctl/rating/add/' + object_id + '/',
					{ value: mark },
					function( data )
					{
						if( null === data.old_value )
						{
							//новая оценка
							sum += mark;
							cnt += 1;
							
							popup1( data.object_type );
						}
						else
						{
							//смена оценки
							sum += mark - data.old_value;
							
							popup2( data.old_value, mark, data.object_type );
						}
						
						self_rating = mark;
						showSelfRating();
						showCurrentRating();
					},
					{
						async: true,
						message_show_func: function(){;}
					}
				);
			}
		);
		
	function showCurrentRating()
	{
		var rating = ( 0 == cnt ) ? 0 : ( Math.round( sum / cnt * 100, 2 ) / 100 );
		$(_this).find('.stars-huge').attr( 'title', rating ).find('.stars-w').width( Math.round( rating * 20 ) + '%' );
	};
	
	function showSelfRating()
	{
		$(_this).find('.stars .stars-w').width( Math.round( self_rating * 20 ) + '%' );
	};
	
	function popup1( object_type )
	{
		$('body').append(
			'<div class="global-popup">'
		  + '	<div class="global-popup-overlay">&nbsp;</div>'
		  + '	<div class="global-popup-window">'
		  + '		<div class="global-popup-window-wrap">'
		  + '			<div class="global-popup-window-content">'
		  + '				<p class="title">Спасибо за оценку!</p>'
		  + ( ( 14 == object_type ) ? '<p>Вы так же можете оставить текстовый отзыв</p>' : '' )
		  + '				<div>'
		  + ( ( 14 == object_type ) ? ( '<p class="review"><a href="http://' + site_domain + '/objects/' + object_id + '/reviews/add/" class="btn-blue"><span>Добавить отзыв</span></a></p>' ) : '<p>&nbsp;</p>' )
//		  + '					<a href="/">Правила подсчета оценок</a>'
		  + '				</div>'
		  + '				<em class="close-btn" onclick="$(this).parents(\'.global-popup\').remove();">Закрыть</em>'
		  + '			</div>'
		  + '			<em class="cn cn-tl">&nbsp;</em><em class="cn cn-tr">&nbsp;</em>'
		  + '		</div>'
		  + '		<em class="cn cn-bl">&nbsp;</em><em class="cn cn-br">&nbsp;</em>'
		  + '	</div>'
		  + '</div>'
		);
	};


	function popup2( old_value, new_value, object_type )
	{
		$('body').append(
			'<div class="global-popup">'
		  + '	<div class="global-popup-overlay">&nbsp;</div>'
		  + '	<div class="global-popup-window">'
		  + '		<div class="global-popup-window-wrap">'
		  + '			<div class="global-popup-window-content">'
		  + '				<p class="title">Спасибо за оценку!</p>'
		  + ( ( 14 == object_type ) ? '<p>Вы так же можете оставить текстовый отзыв</p>' : '' )
		  + '				<div class="review-rating">'
		  + '					<div class="review-rating-new">'
		  + '						<div class="stars stars-huge stars-' + new_value + '"><div class="stars-w">Рейтинг: ' + new_value + '</div></div>'
		  + '						<span>Новая оценка</span>'
		  + '					</div>'
		  + '					<div class="review-rating-old">'
		  + '						<div class="stars stars-' + old_value + '"><div class="stars-w">Рейтинг: ' + old_value + '</div></div>'
		  + '						<span>Старая оценка</span>'
		  + '					</div>'
		  + '				</div>'
		  + '				<div>'
		  + ( ( 14 == object_type ) ? ( '<p class="review"><a href="http://' + site_domain + '/objects/' + object_id + '/reviews/add/" class="btn-blue"><span>Добавить отзыв</span></a></p>' ) : '<p>&nbsp;</p>' )
//		  + '					<a href="/">Правила подсчета оценок</a>'
		  + '				</div>'
		  + '				<em class="close-btn" onclick="$(this).parents(\'.global-popup\').remove();">Закрыть</em>'
		  + '			</div>'
		  + '			<em class="cn cn-tl">&nbsp;</em><em class="cn cn-tr">&nbsp;</em>'
		  + '		</div>'
		  + '		<em class="cn cn-bl">&nbsp;</em><em class="cn cn-br">&nbsp;</em>'
		  + '	</div>'
		  + '</div>'
		);
	};
	

	function popup3( object_type )
	{
		$('body').append(
			'<div class="global-popup">'
		  + '	<div class="global-popup-overlay">&nbsp;</div>'
		  + '	<div class="global-popup-window">'
		  + '		<div class="global-popup-window-wrap">'
		  + '			<div class="global-popup-window-content">'
		  + '				<p class="title">Извините, но</p>'
		  + '				<p>поставить оценку компании можно, только написав отзыв.</p>'
		  + '				<div>'
		  + '					<p class="review"><a href="http://' + site_domain + '/objects/' + object_id + '/reviews/add/" class="btn-blue"><span>Добавить отзыв</span></a></p>'
//		  + '					<a href="/">Правила подсчета оценок</a>'
		  + '				</div>'
		  + '				<em class="close-btn" onclick="$(this).parents(\'.global-popup\').remove();">Закрыть</em>'
		  + '			</div>'
		  + '			<em class="cn cn-tl">&nbsp;</em><em class="cn cn-tr">&nbsp;</em>'
		  + '		</div>'
		  + '		<em class="cn cn-bl">&nbsp;</em><em class="cn cn-br">&nbsp;</em>'
		  + '	</div>'
		  + '</div>'
		);
	};


	/* ДЕТАЛИЗАЦИЯ ОЦЕНКИ */
	
	$(this).find('.company-user-rating').click(
		function()
		{
			$( '#detailed-rating' + object_id ).toggleClass( 'hidden' );
			
			if( undefined == detailed_list )
				loadDetailedList();
		}
	);
	
	
	function loadDetailedList()
	{
		doQuery(
			'/ctl/rating/detailed_by_user/' + object_id + '/',
			{},
			catchDetailedList,
			{ async: true, timeout: 30000 }
		);
	};
	
	
	function catchDetailedList( data, mark )
	{
		detailed_list = data.list;
		chart_data    = data.chart_data;
		showDetailedList();
	};
	
	
	function showDetailedList()
	{
		var i, ul, li, mark_info, html;
		
		ul = $( '#detailed-rating' + object_id ).find( '.rating-votes-wrap' );
		
		ul.find('li').remove();
		
		for( i = 0; i < detailed_list.length; i++ )
		{
			mark_info = detailed_list[i];
			
			switch( mark_info.user_type )
			{
				case 'human':
					html = '<a href="'+ mark_info.user_uri + '" target="_blank">' + htmlspecialchars( mark_info.user_nick ) + '</a>';
				break;
				
				case 'company':
					html = '<a href="'+ mark_info.user_uri + '" target="_blank">' + htmlspecialchars( mark_info.user_nick ) + '</a>';
				break;
				
				case 'admin':
				case 'root':
					html = htmlspecialchars( mark_info.user_nick );
				break;
			}

			ul.append(
			    '<li class="clearfix">'
              + '	<div class="col1">'
			  + ( ( null != mark_info.user_logo ) ? ( '<img src="/image/' + mark_info.user_logo + '.20x20.jpg" alt="" />' ) : ( '<img src="/i/stub/'+ ( ( 1 == mark_info.sex ) ? 'male' : 'female' ) + '.gif" width="20" height="20" alt="" />' ) )
              + '		<p>' + html + '</p>'
              + '    </div>'
              + '    <div class="col2">'
              + '        <div class="stars stars-' + mark_info.mark + '"><div class="stars-w">Рейтинг: ' + mark_info.mark + '</div></div>'
              + '    </div>'
              + '</li>'
			);
		}
		
		
		gchart_show();
	};
	

	function gchart_show()
	{
		var x_axis = chart_data.x_axis;
		var y_axis = chart_data.y_axis;
		var i;
		
		for( i in y_axis )
		{
			y_axis[i] = y_axis[i].replace( ',', '.' );
		}

		var gchart_options = {
			maxValue: 5,
			minValue: 1,
			series:
				[
					$.gchart.series( '', y_axis, 'red' )
				],
			axes:
				[
					$.gchart.axis( 'bottom', x_axis, 'gray' ).ticks( 'gray', -90 ).drawing( 'ticks' ),
					$.gchart.axis( 'left', 1, 5, 'gray' ).ticks( 'gray', -140 ).drawing( 'ticks' )
				]
		};
	
		$( '#detailed-rating' + object_id + ' .chart' ).gchart( $.extend( {}, gchart_SETTINGS, gchart_options ) );
	};

};
})(jQuery);
