/**
 * @constructor
 */
function PastelAjaxifier(containerSelector) {
	
	/**
	 * @type String
	 */
	var _containerSelector = containerSelector;
	
	/**
	 * @type String
	 */
	var _loaderSelector = "";
	
	/**
	 * @type String
	 */
	var _menuContSelector = "";
	
	/**
	 * @type String
	 */
	var _menuActiveClass = "active";
	
	/**
	 * @type String
	 */
	var _menuItemPrefix = "menu_";
	
	/**
	 * @type Object 
	 */
	var _onCompleteTasks = [];
	
	/**
	 * Get url hash part and if any - redirect to the coresponding page
	 */
	var _setupHash = function() {
		var hash = window.location.hash;
		if (hash !== "" && hash !== "#") {
			hash = hash.replace("#/", "/");
			window.location.href = hash;
		}		
	};
	
	/**
	 * Setup link tags that must be handled by ajax
	 */
	var _setupLinks = function() {
		$("a[rel^='ajax']").live("click.pastelAjaxifier", function(event) {
			event.preventDefault();
			
			var $target = $(this); 
			var $menuCont = $(_menuContSelector);
			if ($menuCont.length > 0) {
				$("a", $menuCont).removeClass(_menuActiveClass);
				
				if ($target.parent(_menuContSelector).length > 0) {
					var targetSuffix =  _matchClassPart($target);
					var targetClass = _menuItemPrefix + targetSuffix; 
					$elems = $("a." + targetClass);
					$elems.addClass(_menuActiveClass);
				} else {
					var rel = $target.attr("rel");
					if (rel) {
						rel = rel.replace("ajax-", "");
						
						var selector = "a." + _menuItemPrefix + rel;
						$(selector, $menuCont).addClass(_menuActiveClass);
					}
				}
			}
			
			var href = $target.attr("href");
			if (href) {
				var $loader = $(_loaderSelector);
				$loader.css("display", "block");
				$.ajax({
					method: "GET",
					url: href,
					success: function(data, textStatus, XMLHttpRequest) {
						$(_containerSelector).html(data);
						window.location.hash = href;
					},
					error: function(XMLHttpRequest, textStatus, errorThrown) {
						var status = XMLHttpRequest.status;
						if (status == 403) {
							var response = $.parseJSON(XMLHttpRequest.responseText);
							if (response.code == 100) {
								window.location.href = "/" + lang;
							}
						}
					},
					complete: function(XMLHttpRequest, textStatus) {
						$loader.css("display", "none");

						var tasksLen = _onCompleteTasks.length;
						if (tasksLen > 0) {
							for ( var i = 0; i < tasksLen; i++) {
								var task = _onCompleteTasks[i];

								if($target.hasClass(task.classToCheck)){
									task.functionToCall();
								}
							}
						}
					}
				});
			}
			return false;
		});		
	};

	var _matchClassPart = function ($elem) {
		var elemClass = $elem.attr("class");
		var partName = elemClass.match(/^.*?menu_(\w+).*?$/);
		partName = partName[1];
		return partName;
	};
	
	/**
	 * Setup language change links
	 * @param {Boolean} isMultilang
	 */
	var _setupMultilang = function(isMultilang) {
		$("a[rel^='lang-']").die("click.pastelAjaxifier");
		
		if (isMultilang) {
			$("a[rel^='lang-']").live("click.pastelAjaxifier", function(event) {
				var hash = window.location.hash;
				
				if (hash !== "" && hash !== "#" && hash !== "#/") {
					event.preventDefault();
					
					var $target = $(this);
					var lang = $target.attr("rel");
					lang = lang.replace("lang-", "");
					var lastIndex = hash.length - 1;
					if(hash.match("/$") == null) {
						hash += "/";
					}
					hash = hash.replace(/^#\/[a-z]{2}\//i, "/" + lang + "/");
					window.location.href = hash;
				}
			});			
		}
	};
	
	/**
	 * Initialize the ajaxifier
	 */
	var _init = function() { 
		_setupHash();
		_setupLinks();	
	};
	_init();
	
	// PUBLIC =====================================================================================
	
	/**
	 * @param {Boolean} isMultilang
	 * @type PastelAjaxifier
	 */
	this.setIsMultilang = function(isMultilang) {
		_setupMultilang(isMultilang);
		
		return this;
	};
	
	/**
	 * @param {String} selector
	 * @type PastelAjaxifier
	 */	
	this.setContainerSelector = function(selector) {
		if (typeof selector == "string") {
			_containerSelector = selector;
		}
		
		return this;	
	};
	
	/**
	 * @param {String} selector
	 * @type PastelAjaxifier
	 */		
	this.setLoaderSelector = function(selector) {
		if (typeof selector == "string") {
			_loaderSelector = selector;
		}
		
		return this;
	};
	
	/**
	 * @param {String} selector
	 * @type PastelAjaxifier
	 */		
	this.setMenuContainerSelector = function(selector) {
		if (typeof selector == "string") {
			_menuContSelector = selector;
		}
		
		return this;
	};
	
	/**
	 * @param {String} activeClass
	 * @type PastelAjaxifier
	 */		
	this.setMenuActiveClass = function(activeClass) {
		if (typeof activeClass == "string") {
			_menuActiveClass = activeClass;
		}
		
		return this;
	};
	
	/**
	 * @param {String} prefix
	 * @type PastelAjaxifier
	 */			
	this.setMenuItemPrefix = function(prefix) {
		if (typeof prefix == "string") {
			_menuItemPrefix = prefix;
		}
		
		return this;
	};
	
	/**
	 * @param {String} classToCheck
	 * @param {Function} functionToCall
	 * @type PastelAjaxifier
	 */			
	this.addTaskOnCompleteIfTargetHasClass = function(classToCheck, functionToCall) {
		if(typeof classToCheck == "string" && typeof functionToCall == "function"){
			var task = {
				classToCheck: classToCheck,
				functionToCall: functionToCall
			};

			_onCompleteTasks.push(task);
		}

		return this;
	};
	
	
	
	// ============================================================================================
}
