$.fn.timer = function (params) {
	var obj = $(this);
	var now = new Date();
	var interval;
	var defaults = {
			utc : (-now.getTimezoneOffset())/60,
			language : 'ru',
			format_in : '%d.%M.%y %h:%m:%s',
			format_out : '%d %h %m %s',
			end_message : "00:00:00",
			change : true,
			update_time : 1000
	};
	var settings = $.extend({}, defaults, params);
	var lang = {
			days : ['день','дня','дней'],
			hours : ['час','часа','часов'],
			minuts : ['минута','минуты','минут'],
			seconds : ['секунда','секунды','секунд']
	};
	if (settings.language=='en') {
		lang = {
			days : ['day','days','days'],
			hours : ['hour','hours','hours'],
			minuts : ['minut','minuts','minuts'],
			seconds : ['second','seconds','seconds']
		};
	}
	var time_output = settings.end_message;
	var inner = obj.text().replace(/[^0-9]/g," ").split(' ');
	var inner_format = settings['format_in'].replace(/[^%dMyhms]/g," ").split(' ');
	var inner_array = [];
	for (var i = 0; i < inner_format.length; i++) {
		inner_array[inner_format[i]] = inner[i];
	}
	if (!inner_array['%y']) {
		if(now>new Date(now.getFullYear(),inner_array['%M']-1,inner_array['%d'],inner_array['%h'],inner_array['%m'],inner_array['%s'])){
			inner_array['%y'] = now.getFullYear() + 1;
		}
	}
	var date_to = new Date(inner_array['%y'], (inner_array['%M']-1>=0?inner_array['%M']-1:now.getMonth()), inner_array['%d']||now.getDate()+1, inner_array['%h']||0, inner_array['%m']||0, inner_array['%s']||0);
	function modifier_spellcount(num, one, two, many) {
		var num_null = num<10?'0':'';
		if (num=='n'){
			return '';
		}else{
			if(settings.language=='ru'){
				if (num%10==1 && num%100!=11){
					return num_null + num + ' <span>' + one + '</span>';
				}
				else if(num%10>=2 && num%10<=4 && (num%100<10 || num%100>=20)){
					return num_null + num + ' <span>' + two + '</span>';
				}
				else{
					return num_null + num + ' <span>' + many + '</span>';
				}
			}else if (settings.language=='en') {
				if (num==0||num==1) return num_null + num + ' <span>' + one + '</span>';
				else return num_null + num + ' <span>' + two + '</span>';
			}else {
				return num_null + num;
			}
		}
	}
	
	function set_time() {
		now = new Date();
		var time_intervar = date_to - now - ((-now.getTimezoneOffset()*60000) - (settings.utc*3600*1000));
		var days = Math.floor(time_intervar/3600/1000/24);
		var hours = Math.floor(time_intervar/3600/1000) - Math.floor(time_intervar/3600/1000/24)*24;
		var minuts = Math.floor(time_intervar/60/1000) - Math.floor(time_intervar/3600/1000)*60;
		var seconds = Math.floor(time_intervar/1000) - Math.floor(time_intervar/60/1000)*60;
		
		if (time_intervar>0) {
			if (settings['format_out'].indexOf('%m')==-1) {
				seconds = Math.floor(time_intervar/1000);
				minuts = 'n';
				hours = 'n';
				days = 'n';
			}else if (settings.format_out.indexOf('%h')==-1) {
				minuts = Math.floor(time_intervar/60/1000);
				hours = 'n';
				days = 'n';
			}else if (settings.format_out.indexOf('%d')==-1) {
				hours = Math.floor(time_intervar/3600/1000);
				days = 'n';
			};
			time_output = settings['format_out'].replace('%d',modifier_spellcount(days,lang['days'][0],lang['days'][1],lang['days'][2])).replace('%h',modifier_spellcount(hours,lang['hours'][0],lang['hours'][1],lang['hours'][2])).replace('%m',modifier_spellcount(minuts,lang['minuts'][0],lang['minuts'][1],lang['minuts'][2])).replace('%s',modifier_spellcount(seconds,lang['seconds'][0],lang['seconds'][1],lang['seconds'][2]));
			obj.html(time_output);
		}else{
			obj.html(settings.end_message)
		}
	}
	set_time();
	if (settings.change) interval = window.setInterval(set_time,settings.update_time);
};

