//ąłśłąśłłąś

//alert = console.log;


function AppController(){
	var MO = this;
	var refLoader = null;
	this.queryData = [];
	this.utils = null;
	//kontrolery
	this.controllers = [];
	
	_userSessionKeeperInterval = null;
	
	this.init = function(){
		MO.utils = new Utils();
		MO.queryData = parseQueryString(window.location.search.substr(1));
		setAjaxErrorHandler();
		refLoader = DialogFactory.get('loader');
		initControllers();
		collapsableBoxes();
		userSessionKeeper();
		
		cleanUpInputs();
		$('#fakeBody').show();
		$('#initialLoadingInfo').remove();
		blockBoxes();
		handleJSURLMsg();
		$('.tabsWrapper').tabs();
		bindActionTriggers();

		initializeLightbox();
		initializeCalendars();

	};
	
	
	/** pokoazuje/chowa loader*/
	this.toggleLoader = function(b){
		if(b){
			refLoader.dialog('open');
		} else {
			refLoader.dialog('close');
		}
	};
	
	/** rejestracja kontrolera */
	this.registerController = function(controller, name){
		if(typeof(name) != 'undefined'){
			MO.controllers[name] = controller;
		} else {
			MO.controllers.push(controller);
		}
	};

	/** rejestracja kontrolera */
	this.triggerAction = function(controllerName, actionName, parameters){
		MO.controllers[controllerName][actionName].apply(MO.controllers[controllerName], parameters);
	};
	
	/** inicjowanie kontrolerów */
	var initControllers = function(){

		for(var f in MO.controllers){
			if(typeof(MO.controllers[f]) === 'object'){
				MO.controllers[f].init();
			}
		}
	};

	/**
     * wrzucanie treści dso konsoli
     *
     * @param {any} o
     */
	this.log = function(o){
		try {
			console.log(o);
		} catch(e) {
	    
		}
	}

	/**
     * inicjalizacja lightboxa
     */
	var initializeLightbox = function(){
		if(typeof($.LightboxClass) != 'undefined'){
			$("img.lightbox").each(function(index, img){
				var wrapper = $('<a class="lightbox"></a>');
				wrapper.attr("href", $(img).attr("src").replace(/tiny|small|medium/i, 'big')).attr("title", $(img).attr("title"));
				$(img).removeAttr("title").wrap(wrapper);
			});
			$('a.lightbox').lightbox();
		}
	}
	
	var setAjaxErrorHandler = function(){
		$("body").ajaxError(function(event, request, settings){
			MO.toggleLoader(false);
			if(request.status == 503){
				DialogFactory.get('alert', {
					text: 'Usługa czasowo niedostępna.'
				});
			} else if(request.status == 401){
				if(_userSessionKeeperInterval) {
					clearInterval(_userSessionKeeperInterval);
				}
				DialogFactory.get('alert', {
					text: 'Sesja użytkownika wygasła.<br/>Zaraz nastąpi przekierowanie na stronę logowania.',
					callbackOK : function(){
						window.location.reload();
					}
				});
			} else if(request.status == 0){
				DialogFactory.get('alert', {
					text: 'Nie można nawiązać połaczenia z serwerem.<br/> Sprawdź czy masz dostęp do Internetu.'
				});
			} else {
				DialogFactory.get('alert', {
					text: 'Wystapił problem podczas połączenia z serwerem.'
				});
			}
		});
	};
	
	
	var parseQueryString = function(s) {
		var r, a, p;
		r = {};
		a = s.split('&');
        
		for (i = 0; i < a.length; i++){
			p = a[i].split('=');
			if (p.length === 2 && p[0].length > 0) {
				r[p[0]] = decodeURIComponent(p[1]);
			}
		}
		
		r['qHash'] = [];
		
		if(window.location.hash){
			var hash = (window.location.hash + '').substr(1);
			a = hash.split('&');
			for (i = 0; i < a.length; i++){
				p = a[i].split('=');
				if (p.length === 2 && p[0].length > 0) {
					r['qHash'][p[0]] = decodeURIComponent(p[1]);
				}
			}
		}
		return r;
	};
    
    
	var collapsableBoxes = function(){
		
		$('div.boxCollapsable').each(function(){
			var box = $(this);
			var html = '<div class="boxCollapseB">-</div>';
			box.find('.boxHeader').append(html);
			box.find('.boxCollapseB').click(function(){
				box.find('.boxBody').toggle();
				if(box.find('.boxBody:visible').length > 0){
					box.find('.boxCollapseB').html('-');
				} else {
					box.find('.boxCollapseB').html('+');
				}
			});
		});
		
		$('div.boxCollapsed').find('.boxBody').hide();
		$('div.boxCollapsed').find('.boxCollapseB').html('+');
	};

	var cleanUpInputs = function(){
		$('input.cleanUpInt').blur(function(){
			this.value = MO.utils.cleanUpInt(this.value);
		});
		$('input.cleanUpFloat').blur(function(){
			this.value = MO.utils.cleanUpFloat(this.value);
		});
		$('input.cleanUpIntPositive').blur(function(){
			this.value = MO.utils.cleanUpInt(this.value, true);
		});
		$('input.cleanUpFloatPositive').blur(function(){
			this.value = MO.utils.cleanUpFloat(this.value, true);
		});
		$('input.cleanUp').val('');
		
		$('input.cleanUpInt').keypress(function(e){
			var newVal = oldVal = parseInt(this.value);
			switch(e.keyCode){
				case 38:
					newVal = oldVal + 1;
					break; //góra
				case 40:
					newVal = oldVal - 1;
					break; //dół
				case 39:
					newVal = oldVal + 10;
					break; //prawo
				case 37:
					newVal = oldVal - 10;
					break; //lewo
				default:
					return true;
			}
			
			this.value = newVal;
		});

		$('input.cleanUpIntPositive').keypress(function(e){
			var newVal = oldVal = parseInt(this.value);
			switch(e.keyCode){
				case 38:
					newVal = oldVal + 1;
					break; //góra
				case 40:
					newVal = oldVal - 1;
					break; //dół
				case 39:
					newVal = oldVal + 10;
					break; //prawo
				case 37:
					newVal = oldVal - 10;
					break; //lewo
				default:
					return true;
			}
			
			this.value = newVal > 0 ? newVal : oldVal;
		});
		
		$('input.cleanUpInt, input.cleanUpIntPositive').attr('autocomplete', 'off');
	};
	
	this.triggerInputCleanUps = function(){
		$('input.cleanUpInt').each(function(){
			this.value = MO.utils.cleanUpInt(this.value);
		});
		$('input.cleanUpFloat').each(function(){
			this.value = MO.utils.cleanUpFloat(this.value);
		});
		$('input.cleanUpIntPositive').each(function(){
			this.value = MO.utils.cleanUpInt(this.value, true);
		});
		$('input.cleanUpFloatPositive').each(function(){
			this.value = MO.utils.cleanUpFloat(this.value, true);
		});
	};
	
	
	this.blockBox = function(boxElement, b, options){
		if(typeof(options) == 'undefined'){
			options = {};
		}
		var wrapper = $(boxElement);
		
		if(b){
			wrapper.addClass('boxBlocked');
			wrapper.find('.entry').block({
				message : typeof(options.message) != 'undefined' ? options.message : null ,
				overlayCSS:  {
					backgroundColor: '#D9D9D9',
					opacity:         0.3
				}
			});
			wrapper.find('.entry .blockOverlay').css({
				cursor: 'auto',
				zIndex : 3
			});
		} else {
			wrapper.removeClass('boxBlocked');
			wrapper.find('.entry').unblock();
		}
	};
	
	var blockBoxes = function(){
		$('.boxBlocked').each(function(){
			MO.blockBox(this, true)
		});
	};
	
	
	/**
	*	bindowanie triggerów akcji
	*/	
	var bindActionTriggers = function(){
		$('body').click(function(e){
			var el = $(e.target);
			if(!el.hasClass('_actionTrigger')){
				return;
			}

			var controllerName = el.attr('data-controller');
			var actionName = el.attr('data-action');
			var tmp = el.attr('data-parameters');
			var parameters = [];
			
			if(typeof(tmp) !== 'undefined'){
				try {
					var ob = eval("(" + tmp + ")");
					parameters = ob;
				} catch (e){
					parameters.push(tmp);
				}
			}
				
			if(controllerName && actionName){
				MO.triggerAction(controllerName, actionName, parameters);
			}
		});
	};
	
	
	
	/**
	*	utrzymywanie sesji usera
	*/
	var userSessionKeeper = function(){
		if(typeof(FrontPage) == 'undefined'){
			return;
		}

		

		_userSessionKeeperInterval = setInterval(function(){
			$.get('index.php?c=Ping');
		}, 3*60*1000);
	};

	/**
	*	wyswietlanie komuniaktu z URL
	*/
	var handleJSURLMsg = function(){
		if(typeof(MO.queryData.qHash.msg) != 'undefined' && MO.queryData.qHash.msg == 1){
			window.location.hash = window.location.hash.replace('msg=1', "msg=0");
			var text = MO.queryData.qHash.msg_text;
			var type = MO.queryData.qHash.msg_type;
			DialogFactory.get('alert', {
				text : text,
				icon : type
			});
		}
	};


	var initializeCalendars = function(){
		var mn=['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec','Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'];
		var todaydate=new Date();
		var curmonth=todaydate.getMonth()+1;
		var curyear=todaydate.getFullYear();

		$("#pageAddonsKalendarz .entry").html(MO.utils.buildCal(curmonth ,curyear, "main", "month", "daysofweek", "days"));
		scanfortoday = (curyear==todaydate.getFullYear() && curmonth==todaydate.getMonth()+1)? todaydate.getDate() : 0;
		$("#pageAddonsZegar .title").text(mn[curmonth-1] + " " + scanfortoday + ", " + curyear );

	};
	
		
}

var AC = new AppController();

$(function(){
	AC.init();
});
