/**
 * 
 * W tym pliku znajdują sie nadpisania obiektów Exta głównie związane jest dto z BUGFIXAMI wersji, 
 * plik najcześciej aktualizowany po zmianie wersji Extjs
 * @TODO - najlepiej jakby tego pliku nie bylo ponieważ override są złe  - należy postara sie przenieś overrida na Ext.form.Action.Submit
 * 
 */


/**
 * Umozliwia poprawne dzialanie opcji ref dla buttonów umieszczonych w menu.
 * 
 * Uwaga działa tylko w przypadku gdy :
 *  - menu jest zbudowane przy uzyciu xtype
 *     ,menu: {
 *        	xtype: 'menu',
 *        	items:[{bt1},{btn2}]
 *     }
 *            	
 *  Nie działa w przpadku budowania menu na zasadzie tablicy :
 *   ,menu: [{btn1},{btn2}]
 *   
 *  @link http://www.sencha.com/forum/showthread.php?99895-MenuItem-autoRef&highlight=menu+items+ref
 */
Ext.Button.prototype.initComponent = Ext.Button.prototype.initComponent.createInterceptor(function(){
    if (this.menu){
        this.menu.ownerCt = this;
    }
});


// Na potrzeby obiektu Mk.Form
// nadpisanie funkcji submit z forma, dodanie obslugi zwracanej strony w przypadku wylogowania lub
// innego bledu powodujacego zwrocenie nie jsona  
Ext.override(Ext.form.Action.Submit, {
  
	handleResponse : function(response){
	    if(this.form.errorReader){
	        var rs = this.form.errorReader.read(response),
	        	errors = [];
	        	
	        if(rs.records){
	            for(var i = 0, len = rs.records.length; i < len; i++) {
	                var r = rs.records[i];
	                errors[i] = r.data;
	            }
	        }
	        if(errors.length < 1){
	            errors = null;
	        }
	        return {
	            success : rs.success,
	            errors : errors
	        };
	    }
	    try {
	      return Ext.decode(response.responseText);
	    } catch(e){			
	      return {'success': false};
	    }
	}
});


Ext.override(Ext.Component, {
    /*    override by Animal (http://extjs.com/forum/showthread.php?t=26484)
        that allows us to find the dollar fields parent form. Very nice.
    */
    findParentBy: function(fn) {
        for (var p = this.ownerCt; (p != null) && !fn(p); p = p.ownerCt);
        return p;
    },

    findParentByType: function(xtype) {
        return typeof xtype == 'function' ?
            this.findParentBy(function(p){
                return p.constructor === xtype;
            }) :
            this.findParentBy(function(p){
                return p.constructor.xtype === xtype;
            });
    }
});


/**
 * Dodanie obługi zmiany biezacej strony z odpowiedzi serwera
 *
 **/
Ext.override(Ext.PagingToolbar, {
	
	/**
	 * Nadpisanie metody prywatnej w celu dodania mozliwosci ustalania strony na której sie znajdujemy z informacji pochodzacej z serwera
	 * 
	 * dodano tylko 1 linijkę:
	 * 	o = this.remotePaging(o);
	 * 
	 * @param {Ext.data.Store} store
	 * @param {Ext.data.Record} r - rejirdy stora
	 * @param {Object} o  opcje stora
	 */
	onLoad : function(store, r, o){
		
		o = this.remotePaging(o);
		
        if(!this.rendered){
            this.dsLoaded = [store, r, o];
            return;
        }
        var p = this.getParams();        
        this.cursor = (o.params && o.params[p.start]) ? o.params[p.start] : 0;
        var d = this.getPageData(), ap = d.activePage, ps = d.pages;

        this.afterTextItem.setText(String.format(this.afterPageText, d.pages));
        this.inputItem.setValue(ap);
        this.first.setDisabled(ap == 1);
        this.prev.setDisabled(ap == 1);
        this.next.setDisabled(ap == ps);
        this.last.setDisabled(ap == ps);
        this.refresh.enable();
        this.updateInfo();
        this.fireEvent('change', this, d);
    }
    
    
    /**
     * 
     * @param {Object} o - opcje stora
     * @return {Object} o - opcje stora
     */
    ,remotePaging : function(o){
        var p = this.getParams();
   		if(this.store.reader.jsonData && this.store.reader.jsonData[p.start]){
			o.params = o.params || {};
			o.params[p.start] = this.store.reader.jsonData[p.start];
			//this.store.storeOptions()
			Ext.apply(this.store.lastOptions,o.params);
		}
		return o;
    }

});


/**
 * Dodaje do obiektu String metode powiekszajaca pierwsza litere
 * @return {String}
 */
String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}


/**
 * Dodanie sprawdzania klucza w tablicy
 *  
 * @param {String} v - szukany klucz
 * @return {Boolean}
 */
Array.prototype.inArray = function(v){
  for(var i in this){if(this[i] == v){return true;}}return false;
}





/**
 * Obsługa console.log w przypadku gdy nie ma go.
 * Zapobiega niedziałaniu aplikacji w przypadku gdy ktos zostanwi console.log w kodzie a aplikacja jest uruchamiana np na firefoxie bez firebuga.
 */
if (!window.console) {
    window.console = {
        log: function (a) {
        	alert(a);
        },
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}
