function doShowMessage(text, type) {
	var msg = $('<div></div>').addClass(type);
	msg.html(text);
	msg.click(function(e) { $(this).fadeOut('fast', function() { $(this).remove(); }); });
	$('#alerts').prepend(msg);
	msg.css({ 'margin-top' : '-' + msg.outerHeight() + 'px' });
	msg.animate({ 'margin-top' : '5px' }, function() {
		var obj = $(this);
		setTimeout(function() { obj.fadeOut('fast', function() { $(this).remove(); }); }, 3000);
	});
	return false;
}

function doShowModal() {
	if (!$('#modal').is(":visible")) { $('#modal').fadeIn('fast'); } 
}

function doHideModal() {
	if ($('#modal').is(":visible")) { $('#modal').fadeOut('fast'); } 
}

function doAjaxApply(data) {
	if (!data) { return false; }
	
	if (data.error) { doShowMessage(data.error, 'error'); }
	if (data.info) { doShowMessage(data.info, 'info'); }

	if (data.targets) {
		$.each(data.targets, function(target, data) {
			var d = $('<div></div>').append(data); doReplaceCaptcha(d); $(target).html(d.html()); 
		});
	}
	if (data.replace) {
		$.each(data.replace, function(target, data) {
			var d = $('<div></div>').append(data); doReplaceCaptcha(d); $(target).replaceWith(d.html());
		});
	}
	if (data.append) {
		$.each(data.append, function(target, data) {
			var d = $('<div></div>').append(data); doReplaceCaptcha(d); $(target).append(d.html());
		});
	}
	if (data.modal != null) {
		if (data.modal) { doShowModal(); } else { doHideModal(); }
	}
	
	if (data.title) { document.title = data.title; }
	if (data.location) { doAjaxExec(data.location); }
	if (data.command) { eval(data.command); }
}

function doAjaxForm(form) {
	$.ajax({
		'url': form.action,
		'type': form.method,
		'dataType': 'json',
		'data': $(form).serialize(),
		'success': doAjaxApply
	});	
	return false;
}

function doAjaxUrl(url, change) {
	if (change) { window.location.hash = '!' + url; }
	$.ajax({
		'url': url,
		'dataType': 'json',
		'success': doAjaxApply
	});	
	return true;	
}

function needAjax(href) {
	var pattern = /^\/$/; 
	if (pattern.test(href)) { return false; } // root, make it with reload
	
	var pattern = /^\/account\/|^\/bookmarks\/|^\/contacts\/$|^\/feedback\/$/; 
	if (pattern.test(href)) { return true; }
	var pattern = /^\/monitoring\/(search|my|skip)\//; 
	if (pattern.test(href)) { return true; }
	var pattern = /^\/contests\/my\//; 
	if (pattern.test(href)) { return true; }
	return true;
}

function doAjaxExec(href, change) {
	if (href == '/account/logout/') {
		if (!confirm('Я осознаю ответственность и последствия принятого мною решения и подтверждаю, что оно принято мною в здравом уме и трезвой памяти без какого либо принуждения со стороны третьих лиц.')) { return false; }
	}
	if (/\/delete\//.test(href)) {
		if (!confirm('Я подтверждаю удаление данной записи')) { return false; }
	}
	return doAjaxUrl(href, change);
}

function doAjaxClick(e, item) {
	var href = $(item).attr('href');
	if (!needAjax(href)) { return true; }
	cancelEvent(e);
	doAjaxExec(href, true);
	return false;
}

function doAjaxRedirect() {
	var hash = window.location.hash;
	if (hash.substring(0, 2) == '#!') { 
//		window.location.hash = '';
		doAjaxExec(hash.substring(2));
	}
}

function doUpdateCaptcha(item) {
	return $(item).attr('src', '/captcha?' + Math.random());
}

function doReplaceCaptcha(html) {
	$.each(html.find('img.captcha'), function(index, captcha) { doUpdateCaptcha(captcha); });
	return html;
}

function cancelEvent(evt) { evt.stopPropagation(); evt.preventDefault(); }

$("a").live('click', function(e) { return doAjaxClick(e, this); });
$("form").live('submit', function(e) { return doAjaxForm(this); });

$("img.captcha").live('click', function(e) { doUpdateCaptcha(this); });
$("#modal").live('click', function(e) { $(this).fadeOut('fast'); });
$("#modal > *").live('click', function(e) { e.stopPropagation(); });

$(document).keydown(function(e) { if (e.keyCode == 27) { doHideModal(); } });

$(document).ready(function() {
	doAjaxExec('/account/status/');
	doAjaxRedirect();
});

