Ext.namespace('Mk');
/**
 * @class Mk.Exceptions
 * Klasa do wyswietlania logow wykorzystywana w catch-ach
 * wyswietla komunikaty okienkowei chmurkowe
 * 
 * @param {Object} e - element do wyswietlenia
 */
Mk.Exceptions = {
	
	msgCt : null	

	/**
	 * Logowanie obiektu
	 * @param {Object} e
	 */
	,log: function(e) {
		if(Ext.isGecko){			
			console.log(e);
		}
		else
			this.failure(e);
	}
	
	
	/**
	 * Funkcja zwracająca diva z informacją
	 * 
	 * @param {Object} title tytuł
	 * @param {Object} message treść
	 */
    ,createBox: function(title, message){
        return ['<div class="msg">',
                '<div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>',
                '<div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc"><h3>', title, '</h3>', message, '</div></div></div>',
                '<div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>',
                '</div>'].join('');
    }	
	
	
	/**
	 * Funkcja tworząca wypływający element z informacją który po chwili znika.
	 * 
	 * @param {Object} title
	 * @param {Object} format
	 */
	,show: function(title, format){
		
		if (!this.msgCt) {
			this.msgCt = Ext.DomHelper.insertFirst(document.body, {
				id: 'mk-msg-div'
			}, true);
		}
		
		this.msgCt.alignTo(document, 't-t');
		
		var s = String.format.apply(String, Array.prototype.slice.call(arguments, 1)),
			m = Ext.DomHelper.append(this.msgCt, {
				html: this.createBox(title, s)
			}, true);
		
		m.slideIn('t').pause(1).ghost("t", {
			remove: true
		});
	}
	

	/**
	 * Funkcja sprawdzająca wynik zapytania, i odpowiednio wywołująca informacje o sukcesie bądź błędzie
	 * 
	 * @param {Object} infoObject
	 */
	,success: function(infoObject){
		
		if (Ext.isDefined(infoObject.success) && infoObject.success == false) {
			this.failure(infoObject);
		}
		else {
			if (!Ext.isDefined(infoObject.logged)){
				
				//w przypadku podania displayMsg = false nie wyswietlamy informacji
				if(Ext.isDefined(infoObject.displayMsg) && infoObject.displayMsg == false){
					return true;
				}
					
				Mk.Exceptions.show('Informacja', (Ext.isDefined(infoObject.message) ? infoObject.message : 'Zapisano zmiany') );
				
				return true;
			}
			else {
				return infoObject.logged;
			}
		}
			
		return false;	
	}
	
	
	/**
	 * 
	 * @param {Object} errorObject
	 */
	,failure: function(errorObject, options){
		var msg, 
			debugMsg,
			title = 'Błąd';

		// w przypadku gdy sesja wygasa uruchamiamy okno logowania
		if (Ext.isObject(errorObject) && Ext.isDefined(errorObject.logged) && errorObject.logged == false){		
			new Mk.Login();
			return true;
		}
		// jezeli jest zdefiniowane i jest obiektem
		else if (Ext.isDefined(errorObject) && Ext.isObject(errorObject)) {
		 	// jezeli podano z serwera w jsonie {..."message"...} 
			if ( Ext.isString(errorObject.message) ){
				msg = (Ext.isEmpty(errorObject.message)) ? 'Brak informacji o błędzie' : errorObject.message;
			}
			// jezeli z jakiegos powodu to string :>
			else if(Ext.isString(errorObject)){
				msg = errorObject;
			}
			// tutaj mamy obiekt bez message
			else {
				msg = ((errorObject.status) ? Mk.util.ErrorCodes.get(errorObject.status) : 'Niespodziewana odpowiedź z serwera.')+'<br/>'; 						
				msg += errorObject.responseText || '';
			}
			
			// jezeli jest wysyłane z setwera w jsonie {..."debug":""...} to przypisujemy bedzie w podane w rozszezonym oknie
			if ( Ext.isString(errorObject.debug) ){
				debugMsg = errorObject.debug;
			}
		}
		else {			
			msg = (Ext.isString(errorObject)) ? errorObject : 'Niespodziewany błąd.';					
		}

		Mk.Exceptions.showErrorInfo(msg, title, debugMsg);
		
	}
	
	
	/**
	 * Funkcja wyświetlająca okno z infomacją o błędzie	
	 * 
	 * @param {String} msg
	 * @param {String} debugMsg
	 */
	,showErrorInfo: function(message, title, debugMsg){
		title = title || 'Błąd';
		message = message || 'Brak informacji';
		
		if((!!debugMsg || message.length>100) && Mk.Config.developer){			
			new Mk.Window({
			    title:title
			    ,layout:'fit'
			    ,items:[
			        {
			            xtype:'htmlarea'
			            ,value:"<strong>Informacja dla użytkownika: "+message+"</strong>"+"<br/></hr/></br/><strong>DEBUG:</strong><br/><br/>"+debugMsg
			        }
			    ]
			});			
		}
		else {
			Ext.Msg.show({
			   	title: title
			   	,msg: message
			   	,buttons: Ext.Msg.OK
			   	,icon: Ext.MessageBox.ERROR
			});			
		}
		
	}
    
    
    /**
     * Przechwytuje błędy javascript 
     */
	,jsErrorHandler: function(){
	
	    window.onerror = function(message, url, link) {
	        if(Mk.Config.developer === true ) {
	        	// niem fb nie ma exta nie ma console
	            if(!window.console.firebug && (!Ext || !window.console)){
	                alert('Wystąpił błąd: '+message+'; '+url+'; '+link);
	            }
	            return false; // pokazanie błędu
	        } 
	        else {
	            if(Ext && Ext.Msg && Ext.Msg.alert) {
	                Ext.Msg.alert('Nieznany błąd', 'Wystąpił nieznany błąd. <br />Sprawdź połączenie internetowe. <br />Jeżeli błąd się powtórzy sknontaktuj się z nami!');
	            } 
	            else {
	                alert('Wystąpił nieznany błąd. \nSprawdź połączenie internetowe. \nJeżeli błąd się powtórzy sknontaktuj się z nami!');
	            }                
	            return true; // schowanie błędu przed przeglądarką
	        }
	    };
	
	}
};
