/**
 * Sky2 - отображение звезды на карте звездного неба
 */
window.Sky = 
{
	// Констатны
	VERSION			: "2.0",				// Версия
	WINDOW_MAP		: "windowMap",			// Идентификатор окна: карта
	WINDOW_SHADOW	: "windowShadow",		// Идентификатор окна: затенение
	WINDOW_WAIT		: "windowWait",			// Окно с сообщением о поиске
	WINDOW_SPEED	: 150,					// Скорость аницации mSec показа и убирания окон
	MAP_WIDTH		: 350,					// Ширина звездной карты
	MAP_HEIGHT		: 350,					// Высота звездной карты

	// Свойства
	starMap			:	null,				// Объект карты Google
	
	// Методы
	showWindow		: showWindow,			// Показывает окно на экране
	hideWindow		: hideWindow,			// Убирает окно с экрана
	showStarObject	: showStarObject,		// Отображает объект звезду на карте
	showStar		: showStar				// Получает данные о звезде (ID) и показывает ее на экране
}

// ----------------------------------------------------------------------------------------------- 

/**
 * Отладочный лог для jQuery
 */
var debug = true;
jQuery.fn.log = function(msg) 
{
	if (debug)
	{
		try
		{
			// Если запущен FireBug - выводим сообщение в него
			console.log("%s: %o", msg, this);
		}
		catch (ex)
		{
			// Иначе - алерт
			alert(msg);
		}
	}
	return this;
};

/**
 * Центрирование абсолютно позиционированного элемента
 */
jQuery.fn.alignCenter = function() {
   //get margin left
   var left = Math.max(40, parseInt($(window).width()/2 - $(this).width()/2)) + 'px';
   //get margin top
   var top = Math.max(40, parseInt($(window).height()/2 - $(this).height()/2)) + 'px';
   //return updated element
   return $(this).css({'left':left, 'top':top});
 };

// ----------------------------------------------------------------------------------------------- 
 
/**
 *	Показывает окно на экране
 */
function showWindow(windowID)
{
	// Находим и проверяем объект окна
	var windowObject = $('#' + windowID);
	
	// Если окно еще не создано, создаем!
	if (windowObject.length == 0)
	{
		// Если это затенение...
		if (windowID == this.WINDOW_SHADOW)
		{
			// Создание окна затенения
			$('body').append('<div id="' + windowID + '" style="position:absolute;z-index:1;top:0px;left:0px;width:100%;height:100%;background-color:black;opacity:0.7;display:none"></div>');
			// Получаем созданный объект
			windowObject = $('#' + windowID);
			// Если это IE, то применяем фильтр прозрачности
			if ($.browser.msie) windowObject.css('filter', 'alpha(opacity=70)');			
		}
		else
		{
			// Создаем окно
			$('body').append
			(
				'<div id="' + windowID + '" style="color:#202020; position:absolute;z-index:100;top:100px;left:100px;display:none">' +
					'<b class="r3"></b><b class="r1"></b><b class="r1"></b>' +
					'<div class="innerContent"></div>' +
					'<b class="r1"></b><b class="r1"></b><b class="r3"></b>' +
				'</div>'
			);
			// Получаем созданный объект
			windowObject = $('#' + windowID);
			// Настраиваем CSS углов
			$('#' + windowID + ' .r1').css({'display':'block', 'height':'1px', 'margin':'0 1px'});
			$('#' + windowID + ' .r2').css({'display':'block', 'height':'1px', 'margin':'0 2px'});				
			$('#' + windowID + ' .r3').css({'display':'block', 'height':'1px', 'margin':'0 3px'});	
			$('#' + windowID + ' .innerContent').css({'background-color':'#fff', 'padding':'1em'});
			$('#' + windowID + ' b').css('background-color', '#fff');
			// Если это IE, дописываем
			if ($.browser.msie) 
			{
				$('#' + windowID + ' .r1').css({'overflow':'hidden', 'font-size':'1px'});
				$('#' + windowID + ' .r2').css({'overflow':'hidden', 'font-size':'1px'});
				$('#' + windowID + ' .r3').css({'overflow':'hidden', 'font-size':'1px'});
			}			
		}
		
		// Находим контектный блок
		var windowContent = $('#' + windowID + ' .innerContent');
		if (windowContent.length != 0)
		{
			// Наполняем окно контентом и устанавливаем специфичные свойства
			switch (windowID)
			{
				// Окно карты
				case this.WINDOW_MAP:
					// Добавляем Google map
					windowContent.append
					(
						'<button class="closeButton" title="Закрыть окно" style="position:absolute;top:3px;right:3px;border:2px;font-size:10px;width:20px;height:20px;background-color:#fee">X</button>' +
						'<center><a href="#" id="messageLink" class="dark">Отправить Звездное послание</a></center>' +
                        '<h3 id="starTitle" style="font-size:14pt">Окно карты</h3>' +
						'<div id="divMap" style="width:' + this.MAP_WIDTH + 'px;height:' + this.MAP_HEIGHT + 'px"></div>' +
						'<table border="0" style="color: #303030; font-size:10pt; margin-top:1em">' +
							'<tr>' +
								'<td>Прямое восхождение:</td>' +
								'<td><span id="starLongitude"></span></td>' +
							'</tr><tr>' +
								'<td>Склонение:</td>' +
								'<td><span id="starLatitude"></span></td>' +
							/*
							'</tr><tr>' +
								'<td>Светимость:</td>' +
								'<td><span id="starLuminosity"></span></td>' +
							*/	
							'</tr><tr>' +
								'<td>Величина:</td>' +
								'<td><span id="starMagnitude"></span></td>' +
							'</tr>' +
						'</table>'	
					);
					
					// Кнопка закрытия окна
					$('#' + windowID + ' .closeButton').click(new Function("Sky.hideWindow('" + windowID + "')"));
					
					// Инициализируем карту
					if (GBrowserIsCompatible()) 
					{
						this.starMap = new GMap2
						(
							document.getElementById("divMap"), 
							{
								size: new GSize(this.MAP_WIDTH, this.MAP_HEIGHT)
							}
						); 
						this.starMap.setMapType(G_SKY_VISIBLE_MAP);
						this.starMap.setCenter(new GLatLng(10,10), 10);
						this.starMap.enableScrollWheelZoom();						
					}
					
					// Центрируем окно
					windowObject.alignCenter();	
					break;
					
				// Окно ожидания
				case this.WINDOW_WAIT:
					// Добавляем контент
					windowContent.append
					(
						'<img src="/service/theme/progress_loading.gif" alt="" />' +
						'<span style="margin-left:1em">Поиск звезды...</span>'
					);
					
					// Центрируем окно
					windowObject.alignCenter();	
					break;
			}
		}
	}
	
	// Показываем окно: если это не затенение
	if (windowID != this.WINDOW_SHADOW) 
	{
		// Сначало затенение
		this.showWindow(this.WINDOW_SHADOW);
		
		// Окно ожидания показываем без задержки
		if (windowID != this.WINDOW_WAIT)
			windowObject.show(this.WINDOW_SPEED);
		else
			windowObject.show();
	}
	else
	{
		// Отображение затенения
		windowObject.show();
	}
	return windowObject;
}

/**
 *	Убирает окно с экрана
 */
function hideWindow(windowID)
{
	$('#' + windowID).hide();
	$('#' + this.WINDOW_WAIT).hide();
	$('#' + this.WINDOW_SHADOW).hide();
}


/**
 * Отображает объект звезду на карте
 */
function showStarObject(star)
{
	// Отобразим карту
	this.showWindow(this.WINDOW_MAP);
	
	// Данные о звезде
	var longitude = normalizeCoord(star.longitude + 180);
	var latitude = normalizeCoord(star.latitude);
	var luminosity = (Math.round(star.luminosity * 10)) / 10;
	var magnitude = Math.round(star.magnitude);
	
	// Покажем данные о звезде
	$('#starTitle').text(star.name);
	$('#starLongitude').text(longitude);
	$('#starLatitude').text(latitude);
	//$('#starLuminosity').text(luminosity);
	$('#starMagnitude').text(magnitude);
    $('#messageLink').attr('href', '/service/message?id=' + star.id);
	
	// Покажем саму звезду
	var starPoint = new GLatLng(star.latitude, -star.longitude);
	this.starMap.panTo(starPoint);
	
	// Вычисляем коэффициент приближения
	var zoom = 10;
	if (star.magnitude > 11) zoom = 11;
	if (star.magnitude > 13) zoom = 12;
	if (star.magnitude > 15) zoom = 13;
	this.starMap.setCenter(starPoint, zoom);
	
	// Название звезды и сообщение пользователя
	var message = "<strong>" + star.title + "</strong><br><em style='display:block;width:250px;'>" + star.message + "</em>";
	this.starMap.openInfoWindowHtml(this.starMap.getCenter(), message);
}

/**
 * Окгугляет координаты до правильной точности
 */
function normalizeCoord(value)
{
	var koef = 1E5;
	return Math.round(value * koef) / koef;
}

/**
 * Получает данные о звезде и показывает ее на экране
 */
function showStar(starID)
{
	// Покажем окно ожидания
	Sky.showWindow(Sky.WINDOW_WAIT);
	
	// Запрос данных о звезде
	$.getJSON('/service/json.php?id=' + starID, function(starCollection) 
	{
		// Убедрем окно с надписью об ожидании
		Sky.hideWindow(Sky.WINDOW_WAIT);
		
		// Если звезды получены
		if (starCollection.items.length > 0)
		{
			var star = starCollection.items[0];
			Sky.showStarObject(star);
			// Регистрация события на Google Analytics
			if (pageTracker)
				pageTracker._trackEvent
					(
						'Звездная карта', 
						'Просмотр звезды', 
						star.id + ": " + star.title + "(" + star.name + ")"
					);
		}
		else
		{
			// Регистрация события на Google Analytics
			if (pageTracker)
				pageTracker._trackEvent
					(
						'Звездная карта', 
						'Звезда не найдена', 
						starID
					);
			alert('Звезда не найдена!');
		}
	});
}
 