// MWWeatherNow.js
// сценарий для отображения данных на странице текущей погоды
// 
// 2010-03-12 Владимир Князь
//
// 2010-03-17 Владимир Князь
// исправлена ошибка установки названия страницы
//
// 2010-03-20 Владимир Князь
// исправлена ошибка неверного времени максимальной/минимальной температуры
// и вывода информации о снежном покрове в IE
//

var citiesRequest = 0;
var synopRequest = 0;
var MWCities = new Object;
MWCities.cities = new Array;
MWCities.stations = new Array;
var MWCityNameField = 0;
var MWCityNamesPopup = 0;
var MWSnowDepthRow = 0;
var MWSnowStateRow = 0;
var MWCityNamesPopupSlide = 0;
var MWIsCityNamesPopupOpen = false;
var MWSelectedCity = new Element('a');
MWSelectedCity.cityName = "Москва";
MWSelectedCity.stationNameRU = "Москва (ВВЦ)";
MWSelectedCity.stationNameRU_P = "в Москве";
MWSelectedCity.distance = new Number(9.1);
MWSelectedCity.wmoid = 27612;

var MWWindDirections = new Array("С", "ССВ", "СВ", "СВВ", "В", "ЮВВ", "ЮВ", "ЮЮВ", "Ю", "ЮЮЗ", "ЮЗ", "ЮЗЗ", "З", "СЗЗ", "СЗ", "ССЗ", "С");

// сообщение о нажатии любой клавиши, кроме клавиш вверх, вниз и ввод
Element.Events.char =
{
	base: 'keyup',
	condition: function(e)
	{
		return !(e.key == 'up' || e.key == 'down' || e.key == 'enter' || e.code == 33 || e.code == 34);
	}
};

// сообщение о нажатии клавиши ввод
Element.Events.enter =
{
	base: 'keyup',
	condition: function(e)
	{
		return (e.key == 'enter');
	}
};

// сообщение о нажатии клавиши вверх
Element.Events.up =
{
	base: 'keyup',
	condition: function(e)
	{
		return (e.key == 'up');
	}
};

// сообщение о нажатии клавиши вниз
Element.Events.down =
{
	base: 'keyup',
	condition: function(e)
	{
		return (e.key == 'down');
	}
};

// отображает индикаторы ожидания
function MWShowSpinners()
{
	$('MWSynopTime').set('text', '');
	$('MWStationName').set('text', '');
	$('MWDistance').set('text', '');
	$('MWCityName').set('text', '');
	$('MWMinTemperatureDate').set('text', '- ч -.-');
	$('MWMaxTemperatureDate').set('text', '- ч -.-');
	$$('.mwspinner-field').each(function(item, index)
	{
		if(item.getStyle('visibility') != 'hidden')
		{
			item.set('text', '');
			item.setStyles(
			{
				'width':'24px',
				'heigth':'24px'
			}
			);
			item.spin();
		}
	}
	);
}

// скрывает индикаторы ожидания
function MWHideSpinners()
{
	$$('.mwspinner-field').each(function(item, index)
	{
		item.setStyles(
		{
			'width':'auto',
			'heigth':'auto'
		}
		);
		item.unspin();
	}
	);
}

// отображает выпадающий список
function MWShowCitiesPopup()
{	
	//var height = MWCities.cities.length + MWCities.stations.length;
	
	var cities = $$('#MWCityNamesPopup li');
	var cityFieldCoordinates = $('MWCityNameField').getCoordinates();
	var height = 0;
	
	if(cities.length == 0)
	{
		MWHideCitiesPopup();
		return;
	}	
	cities.each(function(city, index)
	{
		height += city.getSize().y;
	});
	if(height > 240)
	{
		height = 240;
	}
	
	MWCityNamesPopup.setPosition({x:cityFieldCoordinates.left, y:cityFieldCoordinates.bottom});
	MWCityNamesPopup.setStyle('visibility', 'visible');
	
	MWCityNamesPopupSlide.removeEvents();
	MWCityNamesPopupSlide.cancel();
	MWCityNamesPopupSlide.start(height);

	MWIsCityNamesPopupOpen = true;
}

// скрывает выпадающий список
function MWHideCitiesPopup()
{
	MWCityNamesPopupSlide.addEvent('complete', function()
	{
		MWCityNamesPopup.setStyle('visibility', 'hidden');
	}
	);
	MWCityNamesPopupSlide.cancel();
	MWCityNamesPopupSlide.start(0);
	
	MWIsCityNamesPopupOpen = false;
}

// выбирает заданный элемент в списе городов
function MWSelectCity(city)
{
	if(MWSelectedCity != 0)
	{
		MWSelectedCity.removeClass('mwselected');
	}
	MWSelectedCity = city;
	if(city != 0)
	{
		city.addClass('mwselected');
	}
}

// выбирает следующий элемент в списе городов
function MWSelectNextCity()
{
	if(MWSelectedCity != 0)
	{
		MWShowCitiesPopup();
		var nextCity = MWSelectedCity.getNext();
		if(nextCity != null)
		{
			MWSelectCity(nextCity);
			MWCityNamesPopup.scrollTo(0, MWSelectedCity.getPosition(MWCityNamesPopup).y);	
		}
	}
}

// выбирает предыдущий элемент в списе городов
function MWSelectPreviousCity()
{
	if(MWSelectedCity != 0)
	{
		MWShowCitiesPopup();
		var previousCity = MWSelectedCity.getPrevious();
		if(previousCity != null)
		{
			MWSelectCity(previousCity);
			MWCityNamesPopup.scrollTo(0, MWSelectedCity.getPosition(MWCityNamesPopup).y);
		}
	}
}

// отображет в таблице данные для текущего выбранного элемента
function MWClickSelectedCity()
{
	if(MWSelectedCity != 0)
	{
		// если выбранный элемент - город
		if(MWSelectedCity.cityName != '')
		{
			$('MWCityInfo').setStyle('display', 'inline-block');
			MWCityNameField.set('value', MWSelectedCity.cityName);
		}
		// если выбранный элемент - станция
		else
		{
			$('MWCityInfo').setStyle('display', 'none');
			MWCityNameField.set('value', MWSelectedCity.stationNameRU);
		}
		synopRequest.get({'wmoid':MWSelectedCity.wmoid});
		MWHideCitiesPopup();
		MWShowSpinners();
	}
}

// обновляет выпадающий список
function MWUpdateCitiesPopup(cities)
{
	$('MWSearchSpinner').setStyle('visibility', 'hidden');
	MWCities = cities;
	MWCityNamesPopup.set('text', '');
	if(typeof(cities.cities.length) != 'undefined')
	{
		cities.cities.each(function(city, index)
		{
			var newCity = new Element('li',
			{
				'html':'<span class="mwcity">' + city.cityName + '</span><span class="mwadmin">' + city.adminNameRU + '</span>'
			}
			);
			newCity.stationNameRU = city.stationNameRU;
			newCity.stationNameRU_P = city.stationNameRU_P;
			newCity.cityName = city.cityName;
			newCity.distance = city.distance;
			newCity.wmoid = city.wmoid;
			
			if(index == 0)
			{
				MWSelectCity(newCity);
			}
			newCity.addEvents(
			{
				'click': function()
				{
					MWSelectCity(newCity);
					MWClickSelectedCity();
				},
				'mouseover': function()
				{
					if(MWIsCityNamesPopupOpen)
					{
						MWSelectCity(this);
					}
				}
			}
			);
			MWCityNamesPopup.grab(newCity);
		}
		);
	}
	else
	{
		MWCities.cities.length = 0;
	}
	if(typeof(cities.stations.length) != 'undefined')
	{
		cities.stations.each(function(station, index)
		{
			var newStation = new Element('li',
			{
				'html':'<span class="mwstation">Станция ' + station.stationNameRU + '</span><span class="mwwmoid">' + station.wmoid + '</span>'
			}
			);
			newStation.stationNameRU = station.stationNameRU;
			newStation.stationNameRU_P = station.stationNameRU_P;
			newStation.cityName = '';
			newStation.distance = new Number(0);
			newStation.wmoid = station.wmoid;
			
			if(index == 0 && MWCities.cities.length == 0)
			{
				MWSelectCity(newStation);
			}
			
			newStation.addEvents(
			{
				'click': function()
				{
					MWSelectCity(newStation);
					MWClickSelectedCity();
				},
				'mouseover': function()
				{
					if(MWIsCityNamesPopupOpen)
					{
						MWSelectCity(this);
					}
				}
			}
			);
			MWCityNamesPopup.grab(newStation);
		}
		);
	}
	else
	{
		MWCities.stations.length = 0;
	}
	
	MWShowCitiesPopup();
}

function MWFormatSynopNumber(numberString, decimal)
{
	number = new Number(numberString);
	if(numberString == '')
	{
		return '-';
	}
	else if(isNaN(number))
	{
		return '-';
	}
	else
	{
		return number.toFixed(decimal);
	}
}

function MWUpdateMWWNTable(synop)
{
	MWHideSpinners();
	var synopDate = new Date(synop.dateTime.station * 1000.0);
	var minTemperatureDate = new Date(synop.temperature.min.dateTime.station * 1000.0);
	var maxTemperatureDate = new Date(synop.temperature.max.dateTime.station * 1000.0);
	$('MWSynopTime').set('text', synopDate.format('%H:%M UTC+')+synop.dateTime.timezone);
	
	document.title = 'Meteoweb.ru | Погода ' + MWSelectedCity.stationNameRU_P;
	$('MWStationName').set('text', MWSelectedCity.stationNameRU);
	$('MWDistance').set('text', MWFormatSynopNumber(MWSelectedCity.distance, 1));
	$('MWCityName').set('text', MWSelectedCity.cityName);
	
	$('MWStationPressure').set('text', MWFormatSynopNumber(synop.stationPressure.mmhg, 1));
	$('MWStationPressureTendency').set('text', synop.pressureTendency.description_mmhg);
	$('MWTemperature').set('text', MWFormatSynopNumber(synop.temperature.temp_c, 1));
	if(synop.temperature.min.dateTime != '')
	{
		$('MWMinTemperatureDate').set('text', minTemperatureDate.format('%H ч %d.%m'));
	}
	$('MWMinTemperature').set('text', MWFormatSynopNumber(synop.temperature.min.temp_c, 1));
	$('MWMaxTemperature').set('text', MWFormatSynopNumber(synop.temperature.max.temp_c, 1));
	if(synop.temperature.max.dateTime != '')
	{
		$('MWMaxTemperatureDate').set('text', maxTemperatureDate.format('%H ч %d.%m'));
	}
	$('MWDewPoint').set('text', MWFormatSynopNumber(synop.temperature.dew_c, 1));
	$('MWRelativeHumidity').set('text', MWFormatSynopNumber(synop.rel_humidity, 1));
	$('MWWindDirectionName').set('text', MWWindDirections[Math.round(synop.wind.deg / 22.5)]);
	$('MWWindDirection').set('text', MWFormatSynopNumber(synop.wind.deg, 0));
	$('MWWindSpeed').set('text', MWFormatSynopNumber(synop.wind.meters_per_second, 1));
	$('MWPrecipitationMeasurementDuration').set('text', MWFormatSynopNumber(synop.precipitation.measurementDuration, 0));
	$('MWPrecipitation').set('text', MWFormatSynopNumber(synop.precipitation.mm, 0));
	$('MWPresentWeather').set('text', synop.presentWeather);
	$('MWPastWeather').set('text', synop.pastWeather);
	$('MWCloudBalls').set('text', MWFormatSynopNumber(synop.clouds.cloudBalls.percents, 1));
	$('MWCloudBase').set('text', synop.clouds.cloudBase + ' м');
	if(synop.clouds.highClouds.latinName != '')
	{
		$('MWHighClouds').set('text', synop.clouds.highClouds.latinName);
		$('MWHighClouds').set('href', synop.clouds.highClouds.href);
		$('MWHighClouds').addClass('links');
	}
	else
	{
		$('MWHighClouds').set('text', '-');
		$('MWHighClouds').erase('href');
		$('MWHighClouds').removeClass('links');
	}
	if(synop.clouds.highClouds.href == '')
	{
		$('MWHighClouds').erase('href');	
		$('MWHighClouds').removeClass('links');
	}
	if(synop.clouds.middleClouds.latinName != '')
	{
		$('MWMiddleClouds').set('text', synop.clouds.middleClouds.latinName);
		$('MWMiddleClouds').set('href', synop.clouds.middleClouds.href);
		$('MWMiddleClouds').addClass('links');
	}
	else
	{
		$('MWMiddleClouds').set('text', '-');
		$('MWMiddleClouds').erase('href');
		$('MWMiddleClouds').removeClass('links');
	}
	if(synop.clouds.middleClouds.href == '')
	{
		$('MWMiddleClouds').erase('href');	
		$('MWMiddleClouds').removeClass('links');
	}
	if(synop.clouds.lowClouds.latinName != '')
	{
		$('MWLowClouds').set('text', synop.clouds.lowClouds.latinName);
		$('MWLowClouds').set('href', synop.clouds.lowClouds.href);
		$('MWLowClouds').addClass('links');
	}
	else
	{
		$('MWLowClouds').set('text', '-');
		$('MWLowClouds').erase('href');
		$('MWLowClouds').removeClass('links');
	}
	if(synop.clouds.lowClouds.href == '')
	{
		$('MWLowClouds').erase('href');	
		$('MWLowClouds').removeClass('links');
	}
	$('MWVisibility').set('text', MWFormatSynopNumber(synop.visibility, 0));
	if(MWFormatSynopNumber(synop.snow.depth_cm, 0) != '-')
	{
		if(Browser.Engine.trident)
		{
			MWSnowDepthRow.setStyles(
			{
				'display':'block',
				'visibility':'visible',
				'height':'auto'
			}
			);
			MWSnowStateRow.setStyles(
			{
				'display':'block',
				'visibility':'visible',
				'height':'auto'
			}
			);
		}
		else
		{
			MWSnowDepthRow.setStyles(
			{
				'display':'table-row',
				'visibility':'visible',
				'height':'auto'
			}
			);
			MWSnowStateRow.setStyles(
			{
				'display':'table-row',
				'visibility':'visible',
				'height':'auto'
			}
			);
		}
		if(synop.snow.depth_cm * 1.0 < 1.0)
		{
			$('MWSnowDepth').set('text', MWFormatSynopNumber(synop.snow.depth_cm, 1));
		}
		else
		{
			$('MWSnowDepth').set('text', MWFormatSynopNumber(synop.snow.depth_cm, 0));
		}
		$('MWSnowState').set('text', synop.snow.state);
	}
	else
	{
		MWSnowDepthRow.setStyles(
		{
			'display':'none',
			'visibility':'hidden',
			'height':'0px'
		}
		);
		MWSnowStateRow.setStyles(
		{
			'display':'none',
			'visibility':'hidden',
			'height':'0px'
		}
		);
	}
}

function MWGetCities()
{
	if(MWCityNameField.get('value') != '')
	{
		citiesRequest.cancel();
		citiesRequest.get({'city':MWCityNameField.get('value')});
		$('MWSearchSpinner').setStyle('visibility', 'visible');
	}
	else
	{
		MWSelectedCity = 0;
		MWCities.cities.length = 0;
		MWCities.stations.length = 0;
		MWHideCitiesPopup();
	}
}

// только для обозревателя Safari
function MWHandleCancelButton()
{
	if(MWCityNameField.get('value') == '')
	{
		MWSelectedCity = 0;
		MWCities.cities.length = 0;
		MWCities.stations.length = 0;
		MWHideCitiesPopup();
	}
}

// инициализация после окончания загрузки страницы
window.addEvent('domready', function()
{
	MWShowSpinners();
	
	MWCityNameField = $('MWCityNameField');
	MWCityNamesPopup = $('MWCityNamesPopup');
	
	MWSnowDepthRow = $('MWSnowDepthRow');
	MWSnowStateRow = $('MWSnowStateRow');
	
	MWCityNamesPopupSlide = new Fx.Tween('MWCityNamesPopup',
	{
		property:'height'
	}
	);
	
	citiesRequest = new Request.JSON(
	{
		url:"/includes/MWCitiesData.php",
		onComplete: function(cities)
		{
			MWUpdateCitiesPopup(cities);
		}
	}
	);
	
	synopRequest = new Request.JSON(
	{
		url:"/includes/MWSynopData.php",
		onSuccess: function(synop)
		{
			MWUpdateMWWNTable(synop);
		}
	}
	);		
	synopRequest.get({'wmoid':27612});

	
	MWCityNameField.addEvent('focus', MWShowCitiesPopup);
	if(Browser.Engine.webkit)
	{
		MWCityNameField.set('onsearch', 'MWHandleCancelButton();');
	}
	MWCityNameField.addEvents(
	{
		'char': MWGetCities,
		'enter': MWClickSelectedCity,
		'down': MWSelectNextCity,
		'up': MWSelectPreviousCity
	}
	);
	
	document.addEvent('click', function(e)
	{
		if(e.target != MWCityNamesPopup && !MWCityNamesPopup.hasChild(e.target) && e.target != MWCityNameField)
		{
			MWHideCitiesPopup();
		}
	}
	);
}
);
