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

$.cms.ajax = {
	ok: true,
	link: '/',
	animate: '#main',
	dataType: 'json',

	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 {
			$.get($.cms.config.root, {}, false, $.cms.ajax.dataType);
		} 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) {
			if (!arg) {
				$.cms.popup.toggle(!arg);
			}
		} else if ($.cms.ajax.animate) {
			$($.cms.ajax.animate).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_value: false,
	process: function(data) {
		for (var i=0; i<data.length; i++) {
			if (data[i].value && $.cms.ajax.process_value) {
				data[i].value = $.cms.ajax.process_value(data[i].value);
			}
			switch (data[i].action) {
				case 'popup':
					$.cms.popup.overlay_toggle(true);
					data[i].id = 'popup-content';
					if (data[i].title) {
						$.cms.popup.title_set(data[i].title);
					}
				case 'set':
					if ($('#'+data[i].id).html() != data[i].value) {
						$('#'+data[i].id).html(data[i].value).eval_scripts();
					}
					break;
				case 'navigate':
					if (!data[i].value) {
						data[i].value = $.cms.config.root;
					}
					if ($.cms.popup.lock) {
						$.cms.popup.toggle(false);
					}
					if ((!$.cms.ajax.link_local(data[i].value)) || $.cms.ajax.go(data[i].value)) {
						window.location.href = data[i].value;
					}
					break;
				case 'alert':
					alert(data[i].value);
					break;
				case 'title':
					var is_popup = $.cms.popup.lock;
					if (!is_popup) {
						for (var j=0; j<data.length; j++) {
							if (data[j].action=='popup') {
								is_popup = true;
								break;
							}
						}
					}
					if (is_popup) {
						$.cms.popup.title_set(data[i].value);
					} else {
						$(document).attr('title', data[i].value);
					}
					break;
				default:
					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 ? url.replace(location.protocol+'//'+location.host,'') : $.cms.config.root;
		if ($.cms.popup.lock && !id) {
			return $.cms.ajax.popup(url,post,use_uri);
		}
		$.cms.ajax.effect(true);
		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(id?'navigate:ajax':':',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 = post.module || 'navigate';
			post.func = post.func || 'ajax';
			post.id = id;
		}
		if ($.cms.ajax.prepost) $.cms.ajax.prepost(post);
		$.get(url, post, $.cms.ajax.save, $.cms.ajax.dataType);
		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';
		}
		if ($.cms.ajax.prepost) $.cms.ajax.prepost(post);
		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: $.cms.ajax.dataType,
			success: $.cms.ajax.save
		});
	},
	get: function(uri,post,id) {
		return $.cms.ajax.go(uri,post,id,true);
	},
	call: function(module,post,id) {
		post = post || {};
		post.module = module;
		return $.cms.ajax.go(false,post,id);
	},
	popup: function(uri,post,use_uri) {
		$.cms.popup.overlay_toggle(true);
		return $.cms.ajax.go(uri,post,'popup-content',use_uri);
	},
	popup_form: function(element) {
		$.cms.popup.overlay_toggle(true);
		$.cms.ajax.go_form(element);
	},
	popup_call: function(module,post) {
		$.cms.popup.overlay_toggle(true);
		return $.cms.ajax.call(module,post,'popup-content');
	},
	popup_file: function(path,title,width,height) {
		return $.cms.ajax.popup_call('files',{'path':path,'title':title||'NULL','width':width||0,'height':height||0});
	},
	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.substring($.cms.config.root.length - 1);
				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('#','');
			if (url) {
				url = $.cms.config.root + url;
			} else {
				url = $.cms.config.path;
			}
			url = url.replace('//','/');
			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);
