function initButtons(){
	$('.btn').each(function(){
		var b = $(this);
		var tt = b.text() || b.val();
		if ($(':submit,:button',this)) {
		b = $('<a>').insertAfter(this). addClass(this.className).attr('id',this.id);
		$(this).remove();
		}
		b.text('').css({cursor:'pointer'}). prepend('<i></i>').append($('<span>').
		text(tt).append('<i></i><span></span>'));
	});
} 

function alreadyProcessed(item){
	for (var i=0;i<users.length;i++){
		var user=users[i];
		if(user.from_user_id==item.from_user_id)return true;
	}
	return false;
}

function alreadyInQueue(item){
	for (var i=0;i<queue.length;i++){
		var user=queue[i];
		if(user.from_user_id==item.from_user_id)return true;
	}
	return false;
}

function urlencode (str) {
    var hexStr = function (dec) {
        return '%' + (dec < 16 ? '0' : '') + dec.toString(16).toUpperCase();
    };

    var ret = '',
            unreserved = /[\w.-]/; // A-Za-z0-9_.- // Tilde is not here for historical reasons; to preserve it, use rawurlencode instead
    str = (str+'').toString();

    for (var i = 0, dl = str.length; i < dl; i++) {
        var ch = str.charAt(i);
        if (unreserved.test(ch)) {
            ret += ch;
        }
        else {
            var code = str.charCodeAt(i);
            if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters); https://developer.mozilla.org/index.php?title=en/Core_JavaScript_1.5_Reference/Global_Objects/String/charCodeAt
                ret += ((code - 0xD800) * 0x400) + (str.charCodeAt(i+1) - 0xDC00) + 0x10000;
                i++; // skip the next one as we just retrieved it as a low surrogate
            }
            // We never come across a low surrogate because we skip them, unless invalid
            // Reserved assumed to be in UTF-8, as in PHP
            else if (code === 32) {
                ret += '+'; // %20 in rawurlencode
            }
            else if (code < 128) { // 1 byte
                ret += hexStr(code);
            }
            else if (code >= 128 && code < 2048) { // 2 bytes
                ret += hexStr((code >> 6) | 0xC0);
                ret += hexStr((code & 0x3F) | 0x80);
            }
            else if (code >= 2048) { // 3 bytes (code < 65536)
                ret += hexStr((code >> 12) | 0xE0);
                ret += hexStr(((code >> 6) & 0x3F) | 0x80);
                ret += hexStr((code & 0x3F) | 0x80);
            }
        }
    }
    return ret;
}


function relative_time2(time_value) {
	//alert(time_value);
	var values = time_value.split(" ");
	//alert(values[1] + " " + values[2] + ", " + values[3] + " " + values[4]);
	var parsed_date = Date.parse(values[1] + " " + values[2] + ", " + values[5] + " " + values[3]);
	//var parsed_date = Date.parse(values[1] + " " + values[2] + ", " + values[3] + " " + values[4]);
	var date = new Date(parsed_date);
	var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
	var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
	var r = '';
	
	function formatTime(date) {
		var hour = date.getHours(),
			min = date.getMinutes() + "",
			ampm = 'AM';
		
		if (hour == 0) {
			hour = 12;
		} else if (hour > 12) {
			hour -= 12;
			ampm = 'PM';
		}
		
		if (min.length == 1) {
			min = '0' + min;
		}
		
		return hour + ':' + min + ' ' + ampm;
	}
	
	function formatDate(date) {
		var ds = date.toDateString().split(/ /),
			mon = ds[1],
			day = ds[2],
			dayi = parseInt(day),
			year = date.getFullYear(),
			thisyear = (new Date()).getFullYear(),
			th = 'th';
		
		// anti-'th' - but don't do the 11th, 12th or 13th
		if ((dayi % 10) == 1 && day.substr(0, 1) != '1') {
			th = 'st';
		} else if ((dayi % 10) == 2 && day.substr(0, 1) != '1') {
			th = 'nd';
		} else if ((dayi % 10) == 3 && day.substr(0, 1) != '1') {
			th = 'rd';
		}
		if (day.substr(0, 1) == '0') {
			day = day.substr(1);
		}
		
		return mon + ' ' + day + th + (thisyear != year ? ', ' + year : '');
	}
	
	delta = delta + (relative_to.getTimezoneOffset() * 60);

	if (delta < 5) {
		r = 'less then 5 seconds ago';
	} else if (delta < 30) {
		r = 'half a minute ago';
	} else if (delta < 60) {
		r = 'less than a minute ago';
	} else if (delta < 120) {
		r = '1 minute ago';
	} else if (delta < (45*60)) {
		r = (parseInt(delta / 60)).toString() + ' minutes ago';
	} else if (delta < (2*90*60)) { // 2* because sometimes read 1 hours ago
		r = 'about an hour ago';
	} else if (delta < (24*60*60)) {
		r = 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
	} else {
		if (delta < (48*60*60)) {
			r = formatTime(date) + ' yesterday';
		} else {	
			r = formatTime(date) + ' ' + formatDate(date);
			// r = (parseInt(delta / 86400)).toString() + ' дней назад';
		}
	}

	return r;
}

function relative_time(time_value) {
	//alert(time_value);
	var values = time_value.split(" ");
	//alert(values[1] + " " + values[2] + ", " + values[3] + " " + values[4]);
	//var parsed_date = Date.parse(values[1] + " " + values[2] + ", " + values[5] + " " + values[3]);
	var parsed_date = Date.parse(values[1] + " " + values[2] + ", " + values[3] + " " + values[4]);
	var date = new Date(parsed_date);
	var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
	var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
	var r = '';
	
	function formatTime(date) {
		var hour = date.getHours(),
			min = date.getMinutes() + "",
			ampm = 'AM';
		
		if (hour == 0) {
			hour = 12;
		} else if (hour > 12) {
			hour -= 12;
			ampm = 'PM';
		}
		
		if (min.length == 1) {
			min = '0' + min;
		}
		
		return hour + ':' + min + ' ' + ampm;
	}
	
	function formatDate(date) {
		var ds = date.toDateString().split(/ /),
			mon = ds[1],
			day = ds[2],
			dayi = parseInt(day),
			year = date.getFullYear(),
			thisyear = (new Date()).getFullYear(),
			th = 'th';
		
		// anti-'th' - but don't do the 11th, 12th or 13th
		if ((dayi % 10) == 1 && day.substr(0, 1) != '1') {
			th = 'st';
		} else if ((dayi % 10) == 2 && day.substr(0, 1) != '1') {
			th = 'nd';
		} else if ((dayi % 10) == 3 && day.substr(0, 1) != '1') {
			th = 'rd';
		}
		if (day.substr(0, 1) == '0') {
			day = day.substr(1);
		}
		
		return mon + ' ' + day + th + (thisyear != year ? ', ' + year : '');
	}
	
	delta = delta + (relative_to.getTimezoneOffset() * 60);

	if (delta < 5) {
		r = 'less then 5 seconds ago';
	} else if (delta < 30) {
		r = 'half a minute ago';
	} else if (delta < 60) {
		r = 'less than a minute ago';
	} else if (delta < 120) {
		r = '1 minute ago';
	} else if (delta < (45*60)) {
		r = (parseInt(delta / 60)).toString() + ' minutes ago';
	} else if (delta < (2*90*60)) { // 2* because sometimes read 1 hours ago
		r = 'about an hour ago';
	} else if (delta < (24*60*60)) {
		r = 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
	} else {
		if (delta < (48*60*60)) {
			r = formatTime(date) + ' yesterday';
		} else {	
			r = formatTime(date) + ' ' + formatDate(date);
			// r = (parseInt(delta / 86400)).toString() + ' дней назад';
		}
	}

	return r;
}