/* ГАДЖЕТ МИРОВОГО ВРЕМЕНИ */
function __Worldtime(id)
{

	this.lang = Locale.Gadgets.Worldtime;
	this.Core = new __StdModuleCore(this, id, 'worldtime', this.lang.title, this.lang.desc);
	this.updater = null;
	this.wtData = {};	//внутренне хранилище update-данных, получаемых от сервера
	this.oData = {cities: {list: [], delObjs: []}};	//служебное хранилище
	this.utc = null;
	this.timeFormats = ['24', '12'];
	this.maxCities = 12;
	this.numCities = 0;
	this.clockShift = 0;	//смещение в секундах часов юзера относительно правильного времени для его таймзоны

	this.finput = {};
	this.fpanel = {};

	this.createPanelSettings();
	this.fpanel.content = ce('TBODY', ce('TABLE', this.Content, {className: 'wborder', width: '100%'}));	//контейнер для городов с часами
	this.oData.cities.list = {};
	this.oData.cities.date = {};
	this.oData.cities.time = {};
	this.oData.cities.delObjs = [];
	Update.request('Worldtime', 'module', 'startup', {id: this.id}, true);
}

__Worldtime.prototype.Relay = function(data, part)
{
	var self = this;
	switch(data.event.action)
	{
		case 'startup':
			var ids = [];
			if(!isEmpty(data.variables.cities))
			{
				for(var city_id in data.variables.cities)
				{
					ids.push(city_id);
				}
				Update.request('Worldtime', 'module', 'getInfo', { id: this.id }, {cities: ids, k: 0}, true);
			}
			break;

		case 'getInfo':
			if(!isEmpty(data.variables))
			{
				for(var city_id in data.variables.cities)
				{
					if(data.variables.cities[city_id].error)
						continue;
					this.wtData[city_id] = data.variables.cities[city_id];
				}
				this.serverTStamp = data.variables.ctstamp-0;
				this.cdate = new Date();
				this.userTStamp = Math.round(this.cdate.getTime()/1000);
				this.clockShift = checkUserClock(this.serverTStamp);
				this.processInfo();
			}
			break;

		default:
			break;
	}
}

__Worldtime.prototype.initTimer = function()
{
	var self = this;
	var cdate = new Date(this.serverTStamp*1000);	//теоретически, вызывается и раньше; но логична инкапсуляция, всё же
	window.setTimeout(function() //представляется логичным начать периодическое обновление в соответствии с минутной стрелкой часов клиента
		{
			self.updateCitiesTime();
			self.updater = window.setInterval(function() {self.updateCitiesTime()}, 60000);
		},
		(60-cdate.getSeconds())*1000+10
	);
}

//Панель управления гаджетом
__Worldtime.prototype.createPanelSettings = function()
{
	var self = this;

	createFormSearchCity();
	createFormSelectCity();
	createFormOptions();
	this.fpanel.currentCities = ce('DIV', this.Options);

	//Создаёт форму первоначального поиска города
	function createFormSearchCity()
	{
		self.fpanel.searchCity = ce('FORM', self.Options);
		self.finput.city = ce('INPUT', self.fpanel.searchCity, {type: 'text', defaultValue: self.lang['defaultCity']});
		ce('INPUT', self.fpanel.searchCity, {type: 'submit', value: Locale['Search'], className: 'std_button'});
		self.fpanel.searchCity.onsubmit = function()
		{
			if(self.numCities >= self.maxCities)
			{
				window.alert(self.lang.msg['ForAddNewCityDelExist'][0] + self.maxCities + self.lang.msg['ForAddNewCityDelExist'][1]);
				return false;
			}
			if(self.finput.city.value.length < 2)
			{
				window.alert(self.lang.msg['ForSearchEnterMoreLetters'][0] +'2'+ self.lang.msg['ForSearchEnterMoreLetters'][1]);
				return false;
			}
			new Ajax.Request('/proxy/wtcities/', {
				onSuccess: function(r)
				{
					self.showSelectCity(r.responseText);
				},
				method: 'POST',
				parameters: {name: self.finput.city.value}
			});
			return false;
		}
	}

	//Создаёт форму выбора города из найденных по запросу
	function createFormSelectCity()
	{
		self.fpanel.selectCity = ce('FORM', self.Options, {innerHTML: self.lang['FoundedCities'] +': '}, {display: 'none'});
		self.finput.selectCity = ce('SELECT', self.fpanel.selectCity, {id: self.id +'_selectCity'});
		ce('INPUT', self.fpanel.selectCity, {type: 'submit', value: Locale['ToAdd'], className: 'std_button'});
		self.fpanel.selectCity.onsubmit = function()
		{
			if(self.numCities >= self.maxCities)
			{
				window.alert(self.lang.msg['ForAddNewCityDelExist'][0] + self.maxCities + self.lang.msg['ForAddNewCityDelExist'][1]);
				return false;
			}
			Update.request('Worldtime', 'module', 'getInfo', { id: self.id }, {cities: [self.finput.selectCity.value], k: (self.numCities+1)}, true);
			return false;
		}
	}

	//Создаёт форму изменения и сохранения опций
	function createFormOptions()
	{
		self.fpanel.options = ce('FORM', self.Options, {innerHTML: Locale['Options'] +': '}, {display: 'none'});
		self.finput.timeFormat = ce('SELECT', null);
		for(var i=0; i<self.timeFormats.length; i++)
		{
			var t = ce('OPTION', self.finput.timeFormat, {value: self.timeFormats[i]});
			if(self.timeFormats[i]=='24') t.defaultSelected = true;
		}
		self.fpanel.options.appendChild(self.finput.timeFormat);
		self.fpanel.onclick = function()
		{
			Update.request('Worldtime', 'module', 'changeSettings', { id: self.id }, {cities: [self.finput.selectCity.value]});
			return false;
		}
	}

}

__Worldtime.prototype.showSelectCity = function(citiesJson)
{
	//Выводит select-список найденных городов
	this.fpanel.selectCity.style.display = 'block';
	this.finput.selectCity.innerHTML = '';	//чистим на случай, если ещё остался список от прежнего поиска
	try
	{
		var cities = eval('('+ citiesJson +')');
	}
	catch(failed)
	{
		return false;
	}
	var flag = false;
	var t = '';
	if(!isEmpty(cities))
	{
		for(var city_id in cities)
		{
			flag = true;
			t = cities[city_id].city +', '+ cities[city_id].country;
			if(t.length > 30) t = t.substr(0, 27) + '...';
			ce('OPTION', this.finput.selectCity, {value: city_id, innerHTML: t});
		}
	}
	if(flag)
	{
		this.fpanel.selectCity.style.display = 'block';
	}
	else
	{
		window.alert(this.lang.msg['CityNotFound']);
	}
}

__Worldtime.prototype.processInfo = function()
{
	var self = this;
	this.clear();
	this.cdate = new Date();
	var color = '';
	var regx = new RegExp();
	regx.compile('\-');
	for(var city_id in this.wtData)
	{
		this.numCities++;
		if(this.numCities % 2 == 0)
			color = '#FFFFFF';
		else
			color = '#DEE9FF';
		this.oData.cities.list[city_id] = ce('TR', this.fpanel.content, {id: this.id +'_cities_'+ city_id});
		ce('TD', this.oData.cities.list[city_id], {innerHTML: '<strong>'+ this.wtData[city_id].name.replace(regx, '-<span style="font-size: 0"> </span>') +'</strong>', city_id: city_id, onmouseover: showTip, onmouseout: hideTip}, {padding: '5px', backgroundColor: color});
		this.oData.cities.date[city_id] = ce('TD', this.oData.cities.list[city_id], null, {padding: '5px', backgroundColor: color});
		this.oData.cities.time[city_id] = ce('TD', this.oData.cities.list[city_id], null, {padding: '5px', backgroundColor: color});
		this.processCityTime(city_id);

		this.oData.cities.delObjs[city_id] = ce('LI', this.fpanel.currentCities);
		ce('IMG', this.oData.cities.delObjs[city_id], {src: '/img/icons/x2.gif', cityId: city_id, title: Locale['ToDelete'], onclick: initDelCity});
		ce('SPAN', this.oData.cities.delObjs[city_id], {innerHTML: ' <strong>'+ this.wtData[city_id].name +'</strong>, '+ this.wtData[city_id].country});
		if(this.numCities >= this.maxCities) break;
	}
	this.initTimer();

	//удаляет город
	function initDelCity()
	{
		Update.request('Worldtime', 'module', 'delCities', {id: self.id}, {cities: [this.cityId]}, true);
		delete self.wtData[this.cityId];
		de(self.oData.cities.list[this.cityId]);
		delete self.oData.cities.list[this.cityId];

		de(self.oData.cities.delObjs[this.cityId]);
		delete self.oData.cities.delObjs[this.cityId];
		self.numCities--;
	}

	function showTip(e)
	{
		e = e || window.event;
		Tooltip.Show(self.wtData[this.city_id].country, Event.element(e), 150);
	}

	function hideTip()
	{
		Tooltip.Hide();
	}
}

//Очищает (как бы инициализирует) гаджет перед обновлением информации
__Worldtime.prototype.clear = function()
{
	var t = this.fpanel.content.parentNode;
	de(this.fpanel.content);
	this.fpanel.content = ce('TBODY', t)
	this.fpanel.currentCities.innerHTML = '';
	this.oData.cities.list = [];
	this.oData.cities.delObjs = [];
	this.numCities = 0;
}

//Вычисляет текущее время для города
__Worldtime.prototype.processCityTime = function(city_id)
{
//	if(Math.abs(this.clockShift) > 118)
//	{
//	this.serverTStamp - this.cdate.getTimezoneOffset() - this.cdate.getTimezoneOffset() - this.wtData[city_id].timeoffset;
//this.serverTStamp
//	if(this.wtData[city_id].timeoffset < 0) t = 0;
//console.info(this.serverTStamp);
	var tstamp = (this.serverTStamp + (this.wtData[city_id].timeoffset + this.cdate.getTimezoneOffset())*60)*1000;	//корректируем штамп на погрешность, вычисленную с помощью сервера
//	}
//	else
//	{
//		var tstamp = this.cdate.getTime() + (this.wtData[city_id].timeoffset*1 + this.cdate.getTimezoneOffset())*60000;
//	}
	var time = new Date(tstamp);
	this.oData.cities.date[city_id].innerHTML = addZero(time.getDate()) +'.'+ addZero(time.getMonth()+1) +'.'+time.getFullYear() +', '+ Locale.WeekDaysCtd[gVars.WeekDays[time.getDay()]];
	this.oData.cities.time[city_id].innerHTML = addZero(time.getHours()) +'<span style="text-decoration: blink;">:</span>'+ addZero(time.getMinutes());
}

__Worldtime.prototype.updateCitiesTime = function()
{
	this.cdate = new Date();
	var t = Math.round(this.cdate.getTime()/1000);
	this.serverTStamp += (t - this.userTStamp);
	this.userTStamp = t;
	for(var city_id in this.wtData)
	{
		this.processCityTime(city_id);
	}
}
