/**
*	@author http://chalker.ru/ ChALkeR
*	@copyright (c) ChALkeR
*	@version 2009-10-11
**/

$.cms.ajax = {
	ok: true,
	link: '/',

	cache: false,

	init: function() {
		$.cms.ajax.check();
		$.cms.ajax.link = $.cms.config.path;
		$.cms.ajax.links_init();
		$.cms.ajax.extra_process();
	},
	check: function() {
		$.cms.ajax.ok = true;
		try {
			$.post($.cms.config.root);
		} catch (e) {
			$.cms.ajax.ok = false;
		}
		return $.cms.ajax.ok;
	},
	extra_process: function() {},
	effect: function(arg) {
		if (!arg) {
			$.cms.ajax.extra_process();
		}
		if ($.cms.popup.lock) {
			$.cms.popup.toggle(!arg);
		} else {
			$('#main').stop().fadeTo($.cms.effects,arg?0:1);
		}
		return false;
	},
	link_local: function(url) {
		return (url[0] == '/');
	},
	save: function(data) {
		if ($.cms.ajax.cache) {
			$.cms.ajax.cache.save(data);
		}
		return $.cms.ajax.process(data);
	},
	process: function(data) {
		for (var i=0; i<data.length; i++){
			if (data[i].action == 'set') {
				$('#'+data[i].id).html(data[i].value).eval_scripts();
			} else if (data[i].action == 'navigate') {
				if (!data[i].value) {
					data[i].value = $.cms.config.root;
				}
				if ((!$.cms.ajax.link_local(data[i].value)) || $.cms.ajax.go(data[i].value)) {
					window.location.href = data[i].value;
				}
			} else if (data[i].action == 'alert') {
				alert(data[i].value);
			} else {
				alert('Unexpected response: ' + data[i].action);
			}
		}
		return $.cms.ajax.effect(false);
	},
	go: function(url,post,id,use_uri) {
		if (!$.cms.ajax.ok) {
			return true;
		}
		url = url.replace(location.protocol+'//'+location.host,'') || $.cms.root;
		if ($.cms.popup.lock && !id) {
			return $.cms.ajax.popup(url,post,use_uri?true:false);
		}
		$.cms.ajax.effect(true);
		var module = id?'navigate':'';
		var func = id?'ajax':'';
		if (!id) {
			if (!$.cms.config.enabled['ajax']) {
				return true;
			}
			$.cms.ajax.link_save(url);
		}
		if (!post) {
			if ($.cms.ajax.cache) {
				if ($.cms.ajax.cache.toggle(module + ':' + func,url)) {
					return false;
				}
			}
			post = {};
		}
		if (use_uri) {
			post.uri = url;
			url = $.cms.config.root;
		} else if(url.indexOf($.cms.config.root)<0) {
			url = $.cms.config.root;
		}
		post.run_ajax = 1;
		if (id) {
			post.module = module;
			post.func = func;
			post.id = id;
		}
		$.post(url, post, $.cms.ajax.save, 'json');
		return false;
	},
	go_form: function(element,post) {
		if (!$.cms.ajax.ok) {
			return true;
		}
		if (!post) {
			post = {};
		}
		post.run_ajax = 1;
		if ($.cms.popup.lock) {
			post.module = 'navigate';
			post.func = 'ajax';
			post.id = 'popup-content';
		}
		var vform = $(element).parents('form');
		var buff = '';
		for (var i in post) {
			buff += '<input type="hidden" name="' + i + '" value="' + post[i] + '"/>';
		}
		vform.append(buff).get(0).clk = element;
		$.cms.ajax.effect(true);
		vform.ajaxForm({
			dataType: 'json',
			success: $.cms.ajax.save
		});
	},
	get: function(uri,post,id) {
		return $.cms.ajax.go(uri,post,id,true);
	},
	popup: function(uri,post,use_uri) {
		if (use_uri!==false) {
			use_uri = true;
		}
		$.cms.popup.overlay_toggle(true);
		$.cms.ajax.go(uri,post,'popup-content',use_uri);
		return false;
	},
	popup_form: function(element) {
		$.cms.popup.overlay_toggle(true);
		$.cms.ajax.go_form(element);
	},
	link_save: function(url) {
		if ($.cms.config.enabled['ajax_links']) {
			url = url.replace(location.protocol+'//'+location.host,'');
			if ($.cms.ajax.link!=url) {
				$.cms.ajax.link = url;
				window.location.hash = url;
				if ($.browser.msie && (parseInt($.browser.version) < 8)) {
					var iframe = $('#ajax_links_frame')[0].contentWindow.document;
					iframe.open();
					iframe.close();
					iframe.location.hash = url;
				}
			}
		}
	},
	link_load: function() {
		if ($.cms.config.enabled['ajax_links']) {
			var url = window.location.hash.replace('#','') || $.cms.config.path;
			if ($.browser.msie && (parseInt($.browser.version) < 8)) {
				url = $('#ajax_links_frame')[0].contentWindow.document.location.hash.replace('#','') || $.cms.config.path;
			}
			if ($.cms.ajax.link!=url) {
				$.cms.ajax.link = url;
				$.cms.ajax.go(url);
			}
		}
		return $.cms.ajax;
	},
	links_init: function() {
		if ($.cms.config.enabled['ajax_links']) {
			if ($.browser.msie && (parseInt($.browser.version) < 8)) {
				$('body').append('<iframe id="ajax_links_frame" style="display:none;"></iframe>');
				var iframe = $("#ajax_links_frame")[0].contentWindow.document;
				iframe.open();
				iframe.close();
			}
			$.cms.ajax.link_load();
			setInterval($.cms.ajax.link_load, 100);
		}
		return $.cms.ajax;
	}
};

$($.cms.ajax.init);
