var OpenedPopups = OpenedPopups || {};

function ControllerClass(){
	this.settings = {
		'loader': '#content-context-loader',
		'default_page': '',
		'output': '#ja-content-main',
		'block': '#ja-content-main',
		'base_url': '/'
	};
}

ControllerClass.prototype = {
	click: function(obj){
		this.load_page(jQuery(obj).attr('href').substr(1));

		return false;
	},
	back: function(){
		window.history.back(1);

		return false;
	},
	load_page: function(base_url, before_ajax, success_callback){
		if (base_url[0] == '!'){
			return false;
		}
		var self = this;
		var _parent = jQuery(this.settings.output).parent();
		var _in_cache = false;
		var _cache_item = null;
		var url = base_url;

		if (window.location.pathname != this.settings.base_url){
			var redirect_to = this.settings.base_url + '#' + base_url;
			window.location.href = redirect_to;
		}


		if (jQuery('[data-url="'+jQuery.base64Encode(url)+'"]', this.settings.output).length){
			_in_cache = true;
			_cache_item = jQuery('[data-url="'+jQuery.base64Encode(url)+'"]', this.settings.output);
		}

		this.close_all_opened_popups();

		if (!_in_cache){
			jQuery(this.settings.block).block({
				message:null,
				fadeIn:0,
				fadeOut:0,
				overlayCSS:{backgroundColor:'#fff'}
			});
			jQuery(this.settings.loader).show();

			if (typeof(before_ajax) == 'function'){
				before_ajax();
			}

			jQuery.ajax({
				url: url,
				dataType: 'json',
				data: {'ajax':1},
				success: function(response){
					if (response.error){
						messenger.error(response.error);
					} else if (response.success == 0 && response.message){
						messenger.error(response.message);
					} else if (response.success == 1 || response.html || response.data){
						var _data = '';
						if (response.data){
							_data = response.data;
						} else if (response.html){
							_data = response.html;
						}

						dhtmlHistory.add(url, response);
						Mainnav.make_active('/'+response.mainmenu.active+'/');

						jQuery(self.settings.output).children('.cache.current').removeClass('current');
						jQuery(self.settings.output).append(jQuery('<div class="cache current" data-url="'+jQuery.base64Encode(url)+'"></div>').html(_data));

						jQuery(window).scrollTop(0);
						if (typeof(success_callback) == 'function'){
							success_callback(response);
						}
					}
				},
				complete: function(){
					jQuery(self.settings.block).unblock();
					jQuery(self.settings.loader).hide();
				}
			});
		} else {
			Mainnav.make_active(url);
			window.location.hash = url
			jQuery(this.settings.output).children('.cache.current').removeClass('current');
			_cache_item.addClass('current');
			if (typeof(success_callback) == 'function'){
				success_callback();
			}
		}
	},
	load_default_page: function(){
		var url = this.settings.default_page;

		var hash = decodeURIComponent(getCurrentURLHash());
		if (hash.length){
			hash = hash.substr(1);
			//console.log('hash: '+hash);
			if (hash[0] == '/' && hash.length > 2){
				url = hash;
			}
		}

		this.load_page(url, null, null);
	},
	close_all_opened_popups: function(){
		for(win in OpenedPopups){
			OpenedPopups[win].close();
        }
    },
    handle_history: function(newLocation, historyData){
		if (newLocation.length == 0) newLocation = this.settings.default_page;

		Controller.load_page(newLocation);
	}
};
var Controller = new ControllerClass();

