function secondsToTimer(seconds, retArr)
{
	var days = Math.floor(seconds / 60 / 60 / 24);
	seconds -= days * 60 * 60 * 24;

	if (days == 0)
		days = '';
	else if (days > 10 && days < 20)
		days += ' дней ';
	else if (days % 10 == 1)
		days += ' день ';
	else if (days % 10 >= 2 && days % 10 <= 4)
		days += ' дня ';
	else if (days % 10 >= 5 && days % 10 <= 9 || days % 10 == 0)
		days += ' дней ';
	
	var hours = Math.floor(seconds / 60 / 60);
	seconds -= hours * 60 * 60;
	var minutes = Math.floor(seconds / 60);
	seconds -= minutes * 60;
	seconds = Math.floor(seconds);

	var timer = (hours < 10 ? '0' + hours : hours.toString()) + ':' +
		(minutes < 10 ? '0' + minutes : minutes.toString()) + ':' +
		(seconds < 10 ? '0' + seconds : seconds.toString());

	if (retArr)
		return [timer, days];
	else
		return days + timer;
	
}

function makeURL(arr)
{
	var addr = base_url;
	$.each(arr, function(ind, val)
	{
		addr += val + '/';
	});
	return addr;
}

function assocImplode(obj, inner, outer, pre, post)
{
	if (inner === undefined)
		inner = "=";
	if (outer === undefined)
		outer = "|";

	var arr = new Array;
	$.each(obj, function(key, val)
	{
		arr.push(key + inner + val);
	});
	return (arr.length > 0 && pre !== undefined ? pre : '') + arr.join(outer)
		+ (arr.length > 0 && post !== undefined ? post : '');
}

function htmlAttrs(obj)
{
	return assocImplode(obj, '="', '" ', '', '"');
}

/* Determine whether an object is an array. */
function isArray(a) {
	return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
		(a.constructor && a.constructor.toString().match(/\Array\(\)/))));
};

function jsonEncode(obj)
{
	var str = '{';
	var arr = new Array;

	$.each(obj, function(key, value)
	{
		if (isNaN(parseFloat(key)) || parseFloat(key).toString() != key)
			key = "'" + key + "'";
		
		var type = typeof value;
		arr.push(key.toString() + ":" + (type != 'number' && type != 'string' ? jsonEncode(value) : "'" + value + "'"));
	});
	
	str += arr.join(',');

	str += '}';
	return str;
}

function pushToObj(obj, value)
{
	for (var i = 0; i < 100; ++i)
	{
		if (obj[i] === undefined)
		{
			obj[i] = value;
			return;
		}
	}
}

function objLength(obj)
{
	var count = 0;
	for(var i in obj)
		++count;
	return count;
}

/**
 * Форматированный вывод даты
 */
function formatDate(date, format, settings)
{
	if (!date)
		return '';
	var dayNamesShort = (settings ? settings.dayNamesShort : null) || ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
	var dayNames = (settings ? settings.dayNames : null) || ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
	var monthNamesShort = (settings ? settings.monthNamesShort : null) || ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
	var monthNames = (settings ? settings.monthNames : null) || ['January','February','March','April','May','June',
			'July','August','September','October','November','December'];
	// Check whether a format character is doubled
	var lookAhead = function(match) {
		var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
		if (matches)
			iFormat++;
		return matches;
	};
	// Format a number, with leading zero if necessary
	var formatNumber = function(match, value, len) {
		var num = '' + value;
		if (lookAhead(match))
			while (num.length < len)
				num = '0' + num;
		return num;
	};
	// Format a name, short or long as requested
	var formatName = function(match, value, shortNames, longNames) {
		return (lookAhead(match) ? longNames[value] : shortNames[value]);
	};
	var output = '';
	var literal = false;
	if (date)
		for (var iFormat = 0; iFormat < format.length; iFormat++) {
			if (literal)
				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
					literal = false;
				else
					output += format.charAt(iFormat);
			else
				switch (format.charAt(iFormat)) {
					case 'd':
						output += formatNumber('d', date.getDate(), 2);
						break;
					case 'D':
						output += formatName('D', date.getDay(), dayNamesShort, dayNames);
						break;
					case 'o':
						var doy = date.getDate();
						for (var m = date.getMonth() - 1; m >= 0; m--)
							doy += this._getDaysInMonth(date.getFullYear(), m);
						output += formatNumber('o', doy, 3);
						break;
					case 'm':
						output += formatNumber('m', date.getMonth() + 1, 2);
						break;
					case 'M':
						output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
						break;
					case 'y':
						output += (lookAhead('y') ? date.getFullYear() :
							(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
						break;
					case "H":
						output += date.getHours();break;
					case "i":
						output += date.getMinutes();break;
					case "s":
						output += date.getSeconds();break;
					case '@':
						output += date.getTime();
						break;
					case "'":
						if (lookAhead("'"))
							output += "'";
						else
							literal = true;
						break;
					default:
						output += format.charAt(iFormat);
				}
		}
	return output;
}

/**
 *  Форматированный вывод даты согласно пресету
 *  @param date Date
 *  @param format string пресет ('..::')
 *  @return string
 */
function specialDate(date, format)
{
	if (!date)
		date = new Date();
	if (!format)
		format = '..::';

	switch(format)
	{
		case '..::':
			return formatDate(date, "d.m.yy H:i:s");
	}
}

/**
 * Преобразует любую переменную в массив
 * @return Array
 */
function toArray(value)
{
	if (value instanceof Array)
		return value;

	if (value instanceof Object)
	{
		var arr = [];
		for(var i in value)
			arr.push(value[i]);
		return arr;
	}

	return [value];
}

/**
 * Валидит поле
 */
function jqValidateField(field)
{
	field = $(field);
	var validate = field.parents('form').eq(0).validate();
	if (validate)
		return validate.checkAll([field.attr('name')]);
}

function stripTags(html)
{
	var tmp = document.createElement("DIV");
	tmp.innerHTML = html;
	return tmp.textContent || tmp.innerText;
}

function br2nl(text)
{
	return text.replace(/\r|\n/g, "").replace(/<br\/?>/g, "\n");
}

