FrontAppController.prototype = new PastelBaseController();
FrontAppController.prototype.constructor = FrontAppController;
 
/**
 * @constructor
 * @base PastelBaseController
 */
function FrontAppController() {
	// subscribe for state changes
	_APP.getStateNotifier().subscribe(this);
	
	this.setOpts({
		viewClass: FrontAppView,
		viewSelector: "body",
		ajaxEnabled: false
	});
   
	this.homeController = new HomeController();
	this.featuresController = new FeaturesController();
	this.upgradesController = new UpgradesController();
	
	this.pricesController = new PricesController();
	this.contactFormController = new ContactFormController();
	this.faqController = new FaqController();
	this.termsController = new TermsController();
	
	this._currPage = null;
 
	/** @param {FrontAppView} view */
	this._setupView = function(view) {
		// setup menus
		this._setupMenus(view);
		// setup login form
		this._setupLoginForm(view);
		// setup register form
		this._setupClickHandler(view);
		
		this.addPostInitHandler(function() {
			// setup area search engine 
			this._setupSearchArea(view);
		}, this);	
	};

	/**
	 * @param {FrontAppView} view
	 */		
	this._setupMenus = function(view) {
		view.initMenus();
		// go to home on init if no hash
		if(!_APP.url.hasHash()) {
			this._changeMenu({page: "home"});
		}		
		
	};
	
	/**
	 * Setup login form
	 * @param {FrontAppView} view
	 */	
	this._setupLoginForm = function(view) {
		view.rememberLogin().click($.proxy(function(event) {
			event.preventDefault();
			view.toggleRememberLogin();
		}, this));
		
		view.loginForm().submit(function() {
			return view.validate("login");
		});
	};
	
	/**
	 * @param {FrontAppView} view
	 */		
	this._setupClickHandler = function(view) {
		
		var isRegRequestSended = false;		
		view.regContainer().click($.proxy(function(event) {
			var $target = $(event.target);
			if(!$target.is("a")) {
				return;
			}
			
			if(view.isVatSlider($target)) {
				event.preventDefault();
				view.toggleVatSlider();
			} else if(view.isReloadCaptchaBtn($target)) {
				event.preventDefault();
				view.changeCaptchaImg();
			} else if(view.isTermsTick($target)) {
				view.toggleTermsTick();
			} else if(view.isNextStepBtn($target)) {
				event.preventDefault();
				
				if(view.isFirstStep()) {
					// validate elements
					if (!view.validate("regStep1")) {
						return;
					}
					// check email
					var email = this.view.regEmail("get");
					var data = {
						email: email,
						type: "emailAvailable"
					};
					
					this.ajax({
						url: "/user/checkemail/",
						data: data,
						success: function(data, textStatus) {
							var isEmailAvailable = $.evalJSON(data);
							if(isEmailAvailable !== true) {
								var info = {
									title: translate('Existing_email'),
									text: translate('User_email_already_exists', email),
									buttons: ["ok"]
								};
								_APP.alertManager.show(info);							
							} else {
								// check subdomain
								var subdomain = this.view.regSubdomain("get");
								data = {
									subdomain: subdomain
								};
								
								var jsonData = $.toJSON(data);
								this.ajax({
									url: "/company/checksubdomain/",
									data: {jsonData: jsonData},
									success: function(data, textStatus) {
										// {isAvailable: ...}
										data = $.evalJSON(data);
										var isSubdomainAvailable = data.isAvailable;
										if(isSubdomainAvailable !== true) {
											var info = {
												title: translate('Company_address_taken'),
												text: translate('Company_address_already_taken', subdomain),
												buttons: ["ok"]
											};
											_APP.alertManager.show(info);											
										} else {
											// go to second step
											view.goToSecondStep(1);
										}
									} 
								}, this);								
							}
						} 
					}, this);
				} else if(view.isSecondStep()){
					if (!view.validate(["regStep1", "regStep2"]) ||
						!view.isTermsTickActive() ||
						isRegRequestSended) {
						return;
					}
					
					isRegRequestSended = true;
					view.regLoader("css", "display", "block");
					
					var jsonData = view.getJsonData();
					this.ajax({
						url: "/index/register/",
						data: {jsonData: jsonData},
						success: function(data) {
							view.changeCaptchaImg();
							view.regLoader("css", "display", "none");
							
							data = $.evalJSON(data);
							if(data.status === "wrong_security_code") {
								var info = {
									title: translate('Wrong_security_code'),
									text: translate('Entered_security_code_wrong'),
									buttons: ["ok"]
								};
								_APP.alertManager.show(info);		
							} else if(data.status === "success") {
								view.goToThirdStep(2);
							}
							isRegRequestSended = false;
						},
						error: function() {
							view.changeCaptchaImg();
							view.regLoader("css", "display", "none");
							isRegRequestSended = false;
						}						
					}, this);
				}					
			} else if(view.isPrevStepBtn($target)) {
				event.preventDefault();
				
				if(view.isSecondStep()){
					view.goToFirstStep(2);
				}				
			}
			
		}, this));
	};
	
	/**
	 * @param {FrontAppView} view
	 */			
	this._setupSearchArea = function(view) {
		
		view.regSearchArea().searchBox({
			url: "/" + _APP.lang + "/search/regarea/",
			setSearchContext: function() {
				return "area";
			},
			resultBoxClass: "window_search_results",
			insertResultBox: function($container, $resultBox) {
				$container.before($resultBox);
			},							
			resultItemClass: "result_item",
			resultActiveItemClass: "result_item_active",
			loaderClass: "search_engine_loader",
			insertLoader: function($container, $loader) {
				$container.before($loader);
			},
			closeBtnClass: "search_engine_cancel",
			insertCloseBtn: function($container, $closeBtn) {
				$container.before($closeBtn);
			},	
			valueMode: true,
			keepCloseBtnWhenNoResults: true,
			onSelectResult: function($element) {				
				view.setAreaName($element);
			}
		});		
	};
	
	var _isChanging = false;
	this._changeMenu = function(state) {
		var page = state.page;
		
		if (this._currPage == page || _isChanging) {
			return;
		}
		
		_isChanging = true;
		
		var currCtlProps = this._getCtlProps(this._currPage, this);
		var newCtlProps = this._getCtlProps(page, this);

		// function to call after hiding current page
		var showFunc = $.proxy(function() {
			var currCtlMenuItem = currCtlProps.menuItem;
			this._deactivateMenuItem(currCtlMenuItem);
 
			var newCtlInstance = newCtlProps.controller;
			if (newCtlInstance != null) {
				newCtlInstance.showView(
					// success callback
					$.proxy(function() {
						var newCtlMenuItem = newCtlProps.menuItem;
						this._activateMenuItem(newCtlMenuItem);
						this._currPage = page;
						_isChanging = false;
						// fix hash 
						_APP.url.setHashPage(page);
					}, this),
					// error callback					
					$.proxy(function() {
						this._currPage = page;
						_isChanging = false;
					}, this)
				);
			} else {
				// fix hash 
				_APP.url.setHashPage(page);
				this._currPage = page;
				_isChanging = false;
			}			
		}, this);
		
		var currCtlInstance = currCtlProps.controller;
		if (currCtlInstance != null && currCtlInstance.view != null) {
			currCtlInstance.hideView(showFunc);
		} else {
			showFunc();
		}
	};
	
	/**
	 * @param {String} controllerName
	 * @param {ApplicationController} appCtl
	 * @return the controller instance from ApplicationController and the corresponding menuItem
	 * @type Object
	 */
	this._getCtlProps = function(controllerName, appCtl) {
		var obj = {controller: null,
				   menuItem: null};
		if (controllerName == "home") {
			obj.controller = appCtl.homeController; 
			obj.menuItem = appCtl.view.mHome();
		} else if (controllerName == "features") {
			obj.controller = appCtl.featuresController; 
			obj.menuItem = appCtl.view.mFeatures();
		} else if (controllerName == "upgrades") {
			obj.controller = appCtl.upgradesController; 
			obj.menuItem = appCtl.view.mUpgrades();
		} else if (controllerName == "prices") {
			obj.controller = appCtl.pricesController;
			obj.menuItem = appCtl.view.mPrices();
		} else if (controllerName == "contact") {
			obj.controller = appCtl.contactFormController;
			obj.menuItem = appCtl.view.mContact();
		} else if (controllerName == "faq") {
			obj.controller = appCtl.faqController;
			obj.menuItem = appCtl.view.mFaq();
		} else if (controllerName == "terms") {
			obj.controller = appCtl.termsController;
		}
		return obj;
	};
 
	this._activateMenuItem = function($menuItem) {
		if ($menuItem == null) {
			return;
		}		
		var menuItemClass = $menuItem.attr("class"); 
		if (menuItemClass.indexOf('_active') == -1) {
			menuItemClass = menuItemClass + "_active";
			$menuItem.attr("class", menuItemClass);
		}
	};
	
	this._deactivateMenuItem = function($menuItem) {
		if ($menuItem == null) {
			return;
		}		
		var menuItemClass = $menuItem.attr("class"); 
		if (menuItemClass.indexOf('_active') != -1) {
			menuItemClass = menuItemClass.replace("_active", "");
			$menuItem.attr("class", menuItemClass);
		}
	};

	// handle state ===============================================================================
	this._doSetState = function(state) {
		if (this._currPage == null ||
			this._currPage != state.page) {
			this._changeMenu(state);
		}
	};
}
