مدیاویکی:Gadget-Weather.js

از ویکی‌خبر، مرجع خبری آزاد

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
/* 
 * LIVE WEATHER BY [[User:Mjbmr]] 
 */

window.weather = {};

weather.object_size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

weather.status_list = {
	200:["رعد و برق همراه با بارش باران سبک",6,6],
	201:["رعد و برق همراه با بارش باران",6,6],
	202:["رعد و برق همراه با بارش باران سنگین",6,6],
	210:["رعد و برق سبک",5,5],
	211:["رعد و برق",5,5],
	212:["رعد و برق سنگین",5,5],
	221:["رعد و برق پراکنده",5,5],
	230:["رعد و برق همراه با ریز باران سبک",6,6],
	231:["رعد و برق همراه با ریز باران",6,6],
	232:["رعد و برق همراه با ریز باران سنگین",6,6],
	300:["ریز باران متعدد و سبک",7,7],
	301:["ریز باران",7,7],
	302:["ریز باران متعدد و سنگین",7,7],
	310:["باران نم نم متعدد و سبک",7,7],
	311:["باران نم نم",7,7],
	313:["باران پشت سر هم و ریز باران",7,7],
	314:["باران پشت سر هم سنگین و ریز باران",9,9],
	321:["زیر باران پشت سر هم",7,7],
	500:["باران سبک",7,7],
	501:["باران معتدل",7,7],
	502:["باران متعدد و سنگین",9,9],
	503:["باران بسیار شدید",9,9],
	504:["باران سیل\u200cآسا",9,9],
	511:["باران سرد",7,7],
	520:["باران پشت سر هم متعدد و سبک",8,8],
	521:["باران پشت سر هم",7,7],
	522:["باران پشت سر هم متعدد و سنگین",9,9],
	531:["باران پشت سر هم پراکنده",7,7],
	600:["برف سبک",12,12],
	601:["برف",12,12],
	602:["برف سنگین",13,13],
	611:["بوران برف",11,11],
	612:["تگرگ پشت سر هم",10,10],
	615:["برف و باران سبک",12,12],
	616:["برف و باران",11,11],
	620:["برف پشت سر هم و سبک",12,12],
	621:["برف پشت سر هم",12,12],
	622:["برف پشت سر هم و سنگین",13,13],
	701:["مه",14,15],
	711:["دود",14,15],
	721:["غبار",14,15],
	731:["گردباد",14,15],
	741:["مه غلیظ",14,15],
	751:["شن و ماسه",14,15],
	761:["گرد و خاک",14,15],
	762:["خاکستر",14,15],
	771:["بوران",13,13],
	781:["توفان",0,1],
	800:["آسمان صاف",0,1],
	801:["قسمتی ابری",2,3],
	802:["ابرهای پراکنده",2,3],
	803:["ابرهای تکه تکه",2,3],
	804:["تمام ابری",4,4],
	900:["توفان",0,1],
	901:["توفان گرمسیری",0,1],
	902:["تندباد",0,1],
	903:["یخبندان",0,1],
	904:["حرارت شدید",0,1],
	905:["وزش باد",0,1],
	906:["تگرگ",10,10],
	951:["آرام",0,1],
	952:["نسیم کم",0,1],
	953:["نسیم ملایم",0,1],
	954:["نسیم معتدل",0,1],
	955:["نسیم تازه",0,1],
	956:["نسیم سنگین",0,1],
	957:["باد زیاد",0,1],
	958:["باد شدید",0,1],
	959:["باد خیلی شدید",0,1],
	960:["توفان",0,1],
	961:["توفان خشن",0,1],
	962:["تندباد",0,1],
};

weather.status_image_list = {
	0:'//upload.wikimedia.org/wikipedia/commons/thumb/e/e2/Weather-clear.svg/{0}px-Weather-clear.svg.png',
	1:'//upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Weather-clear-night.svg/{0}px-Weather-clear-night.svg.png',
	2:'//upload.wikimedia.org/wikipedia/commons/thumb/9/91/Weather-more-clouds.svg/{0}px-Weather-more-clouds.svg.png',
	3:'//upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Weather-few-clouds-night.svg/{0}px-Weather-few-clouds-night.svg.png',
	4:'//upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Weather-overcast.svg/{0}px-Weather-overcast.svg.png',
	5:'//upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Weather-storm.svg/{0}px-Weather-storm.svg.png',
	6:'//upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Weather-rain-thunderstorm.svg/{0}px-Weather-rain-thunderstorm.svg.png',
	7:'//upload.wikimedia.org/wikipedia/commons/thumb/4/45/Weather-overcast-rare-showers.svg/{0}px-Weather-overcast-rare-showers.svg.png',
	8:'//upload.wikimedia.org/wikipedia/commons/thumb/c/c6/Weather-showers-scattered.svg/{0}px-Weather-showers-scattered.svg.png',
	9:'//upload.wikimedia.org/wikipedia/commons/thumb/1/1e/Weather-showers.svg/{0}px-Weather-showers.svg.png',
	10:'//upload.wikimedia.org/wikipedia/commons/thumb/0/07/Weather-hail-scattered.svg/{0}px-Weather-hail-scattered.svg.png',
	11:'//upload.wikimedia.org/wikipedia/commons/thumb/9/93/Weather-sleet.svg/{0}px-Weather-sleet.svg.png',
	12:'//upload.wikimedia.org/wikipedia/commons/thumb/8/84/Weather-snow.svg/{0}px-Weather-snow.svg.png',
	13:'//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Weather-snowy.svg/{0}px-Weather-snowy.svg.png',
	14:'//upload.wikimedia.org/wikipedia/commons/thumb/1/16/Weather-day-more-fog.svg/{0}px-Weather-day-more-fog.svg.png',
	15:'//upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Weather-more-fog-night.svg/{0}px-Weather-more-fog-night.svg.png',
};

weather.numbers = ["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"];

weather.loading_image_url = "//upload.wikimedia.org/wikipedia/commons/b/b6/Loading_2_transparent.gif";

weather.is_loading = false;
weather.first_run = true;
weather.timeout = 30000;

weather.sprintf = function(string) {
	for (var i = 1; i < arguments.length; i++) {
		var regexp = new RegExp('\\{'+(i-1)+'\\}', 'g');
		string = string.replace(regexp, arguments[i]);
	}
	return string;
};

weather.localize_numbers = function(text) {
	text = text.toString();
	for (var i = 0; i < weather.numbers.length; i++) {
		var regexp = new RegExp(i.toString(), 'g');
		text = text.replace(regexp, weather.numbers[i]);
	}
	text = text.replace(/\./gi, "٫");
	return text;
};

weather.run = function(){
	weather.req = {"ids":{},"names":{}};
	$('.weather').each(function(i, obj) {
		obj = $(obj);
		var id = obj.attr('data-id');
		var name = obj.attr('data-name');
		var day = obj.attr('data-day');
		var req = obj.attr('data-req');
		if(req=='holder')
		{
			obj.hide();
		}
		if(typeof day != "undefined")
		{
			day = parseInt(day);
			if(day.toString() == "NaN")
			{
				day = 0;
			}
		} else {
			day = 0;
		}
		if(typeof id!= "undefined")
		{
			if(typeof weather.req.ids[id]=="undefined")
			{
				weather.req.ids[id] = {"count":0};
			}
			if(day > weather.req.ids[id]["count"])
			{
				weather.req.ids[id]["count"] = day;
			}
		} else if(typeof name!= "undefined")
		{
			if(typeof weather.req.names[name]=="undefined")
			{
				weather.req.names[name] = {"count":0};
			}
			if(day > weather.req.names[name]["count"])
			{
				weather.req.names[name]["count"] = day;
			}
		}
	});
	if(weather.object_size(weather.req.ids)>0||weather.object_size(weather.req.names)>0)
	{
		$.ajax({
			type: "POST",
			url: '//tools.wmflabs.org/weather/api/v1',
			data: JSON.stringify(weather.req),
			timeout: weather.timeout,
			beforeSend: function (xhr) {
				$('.weather').each(function(i, obj) {
					obj = $(obj);
					var req = obj.attr('data-req');
					if(req=='load_icon')
					{
						obj.empty();
						var img = $('<img/>');
						img.attr('src',weather.loading_image_url);
						obj.append(img);
					}
				});
				weather.is_loading = true;
			},
			error: function(jqXHR, txt){
				weather.is_loading = false;
				weather.timeout += 30000;
				weather.run();
			},
			success: function (data) {
				weather.is_loading = false;
				weather.data = data;
				$('.weather').each(function(i, obj) {
					obj = $(obj);
					var id = obj.attr('data-id');
					var name = obj.attr('data-name');
					if(typeof id!= "undefined")
					{
						if(typeof weather.data.ids[id]!= "undefined")
						{
							weather.pass(obj,weather.data.ids[id]);
						}
					} else if(typeof name!= "undefined")
					{
						if(typeof weather.data.names[name]!= "undefined")
						{
							weather.pass(obj,weather.data.names[name]);
						}
					} else {
						weather.pass(obj,{});
					}
				});
				$('.weather').each(function(i, obj) {
					obj = $(obj);
					var req = obj.attr('data-req');
					if(req=='load_icon')
					{
						obj.empty();
					}
				});
			},
		});
	}
};

weather.pass = function(obj,data){
	var req = obj.attr('data-req');
	var day = obj.attr('data-day');
	if(typeof day != "undefined")
	{
		day = parseInt(day);
		if(day.toString() == "NaN")
		{
			day = 0;
		}
	} else {
		day = 0;
	}
	if(req=='temp')
	{
		if(day==0)
		{
			var temp = (data.current.main.temp - 273.15).toFixed();
			if(temp=="-0")
			{
				temp = "0";
			}
			temp = weather.localize_numbers(temp);
			obj.text(temp);
		}
	} else if(req == 'max_temp') {
		if(typeof data.forecast.list[day] != "undefined")
		{
			var max_temp = (data.forecast.list[day].temp.max - 273.15).toFixed();
			if(max_temp=="-0")
			{
				max_temp = "0";
			}
			max_temp = weather.localize_numbers(max_temp);
			obj.text(max_temp);
		}
	} else if(req == 'min_temp') {
		if(typeof data.forecast.list[day] != "undefined")
		{
			var min_temp = (data.forecast.list[day].temp.min - 273.15).toFixed();
			if(min_temp=="-0")
			{
				min_temp = "0";
			}
			min_temp = weather.localize_numbers(min_temp);
			obj.text(min_temp);
		}
	} else if(req == 'condition') {
		var condition_id = 0;
		if(day==0)
		{
			condition_id = data.current.weather[0].id;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				condition_id = data.forecast.list[day].weather[0].id;
			}
		}
		if(typeof weather.status_list[condition_id] != "undefined")
		{
			var condition = weather.status_list[condition_id][0];
			obj.text(condition);
		}
	} else if(req == 'image') {
		var size = obj.attr('data-size');
		if(typeof size != "undefined")
		{
			size = parseInt(size);
			if(size.toString() == "NaN")
			{
				size = 35;
			}
		} else {
			size = 35;
		}
		size = size.toString();
		var condition_id = 0;
		var is_day = true;
		if(day==0)
		{
			condition_id = data.current.weather[0].id;
			is_day = data.current.weather[0].is_day;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				condition_id = data.forecast.list[day].weather[0].id;
				is_day = data.forecast.list[day].weather[0].is_day;
			}
		}
		if(typeof weather.status_list[condition_id] != "undefined")
		{
			if(is_day)
			{
				var image_id = weather.status_list[condition_id][1];
			} else {
				var image_id = weather.status_list[condition_id][2];
			}
			var image_url = weather.sprintf(weather.status_image_list[image_id],size);
			var img = $("<img/>");
			img.attr('src',image_url);
			obj.empty();
			obj.append(img);
		}
	} else if(req == 'wind_speed') {
		var wind_speed = 0;
		if(day==0)
		{
			wind_speed = data.current.wind.speed;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				wind_speed = data.forecast.list[day].speed;
			}
		}
		wind_speed = wind_speed * 3.6;
		wind_speed = wind_speed.toFixed()
		wind_speed = weather.localize_numbers(wind_speed);
		obj.text(wind_speed);
	} else if(req == 'pressure') {
		var pressure = 0;
		if(day==0)
		{
			pressure = data.current.main.pressure;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				pressure = data.forecast.list[day].pressure;
			}
		}
		pressure = weather.localize_numbers(pressure);
		obj.text(pressure);
	} else if(req == 'humidity') {
		var humidity = 0;
		if(day==0)
		{
			humidity = data.current.main.humidity;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				humidity = data.forecast.list[day].humidity;
			}
		}
		humidity = humidity.toFixed()
		humidity = weather.localize_numbers(humidity);
		obj.text(humidity);
	} else if(req == 'sunrise') {
		var sunrise = 0;
		if(day==0)
		{
			sunrise = data.current.sys.sunrise;
		}
		if(sunrise!=0)
		{
			var date = new Date(sunrise*1000);
			var hours = date.getHours();
			var hours2 = hours;
			hours2 %= 12;
			if(hours2==0)
			{
				hours2 = 12;
			}
			var minutes = date.getMinutes();
			var seconds = date.getSeconds();
			var new_date = (hours2) + ":" + ("0" + minutes).slice(-2);
			if(hours>11)
			{
				new_date += " ب.ظ.";
			} else {
				new_date += " ق.ظ.";
			}
			obj.text(Date.wikinews.localize_numbers(new_date));
		}
	} else if(req == 'sunset') {
		var sunset = 0;
		if(day==0)
		{
			sunset = data.current.sys.sunset;
		}
		if(sunset!=0)
		{
			var date = new Date(sunset*1000);
			var hours = date.getHours();
			var hours2 = hours;
			hours2 %= 12;
			if(hours2==0)
			{
				hours2 = 12;
			}
			var minutes = date.getMinutes();
			var seconds = date.getSeconds();
			var new_date = (hours2) + ":" + ("0" + minutes).slice(-2);
			if(hours>11)
			{
				new_date += " ب.ظ.";
			} else {
				new_date += " ق.ظ.";
			}
			obj.text(Date.wikinews.localize_numbers(new_date));
		}
	} else if(req == 'date') {
		var date = 0;
		if(day==0)
		{
			dt = data.current.dt;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				dt = data.forecast.list[day].dt;
			}
		}
		var date = new Date(dt*1000);
		var months = date.getMonth() + 1;
		var days = date.getDate();
		var years = date.getFullYear();
		var hours = date.getHours();
		var hours2 = hours;
		hours2 %= 12;
		if(hours2==0)
		{
			hours2 = 12;
		}
		var minutes = date.getMinutes();
		var seconds = date.getSeconds();
		var new_date = Date.wikinews.gregorian_to_solar([years,months,days]);
		var new_date = Date.wikinews.days_names[date.getDay()] + " " + new_date[2] + " " + Date.wikinews.solar_months_names[new_date[1]] + " " + new_date[0] + " ساعت " + (hours2) + ":" + ("0" + minutes).slice(-2) + ":" + ("0" + seconds).slice(-2);
		if(hours>11)
		{
			new_date += " ب.ظ.";
		} else {
			new_date += " ق.ظ.";
		}
		obj.text(Date.wikinews.localize_numbers(new_date));
	} else if(req == 'week_day') {
		var date = 0;
		if(day==0)
		{
			dt = data.current.dt;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				dt = data.forecast.list[day].dt;
			}
		}
		var date = new Date(dt*1000);
		var months = date.getMonth() + 1;
		var days = date.getDate();
		var years = date.getFullYear();
		var hours = date.getHours();
		var hours2 = hours;
		hours2 %= 12;
		if(hours2==0)
		{
			hours2 = 12;
		}
		var minutes = date.getMinutes();
		var seconds = date.getSeconds();
		var new_date = Date.wikinews.gregorian_to_solar([years,months,days]);
		var new_date = Date.wikinews.days_names[date.getDay()];
		obj.text(new_date);
	} else if(req == 'solar_day_month') {
		var date = 0;
		if(day==0)
		{
			dt = data.current.dt;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				dt = data.forecast.list[day].dt;
			}
		}
		var date = new Date(dt*1000);
		var months = date.getMonth() + 1;
		var days = date.getDate();
		var years = date.getFullYear();
		var new_date = Date.wikinews.gregorian_to_solar([years,months,days]);
		var new_date = new_date[2] + " " + Date.wikinews.solar_months_names[new_date[1]];
		obj.text(Date.wikinews.localize_numbers(new_date));
	} else if(req == 'gregorian_day_month') {
		var date = 0;
		if(day==0)
		{
			dt = data.current.dt;
		} else {
			if(typeof data.forecast.list[day] != "undefined")
			{
				dt = data.forecast.list[day].dt;
			}
		}
		var date = new Date(dt*1000);
		var months = date.getMonth() + 1;
		var days = date.getDate();;
		var new_date = days + " " + Date.wikinews.gregorian_months_names[months];
		obj.text(Date.wikinews.localize_numbers(new_date));
	} else if(req == 'weather_area') {
		if(weather.first_run)
		{
			obj.show();
			weather.first_run = false;
		}
	}
};

$(document).ready(function() {
	setInterval(weather.run,600000);
	weather.run();
});