Ext.ns('Application');

// Naprawa checkboxow (zeby wysylaly 0 gdy sa nieustawione)
Ext.lib.Ajax.serializeForm = function(F){
  if(typeof F=="string"){
    F=(document.getElementById(F)||document.forms[F])
  }
  var G,E,H,J,K="",M=false;
  for(var L=0;L<F.elements.length;L++){
    G=F.elements[L];
    J=F.elements[L].disabled;
    E=F.elements[L].name;
    H=F.elements[L].value;
    if(!J&&E){
      switch(G.type){
        case"select-one":
        case"select-multiple":
          for(var I=0;I<G.options.length;I++){
            if(G.options[i].selected){
              if(Ext.isIE){
                K+=encodeURIComponent(E)+"="+encodeURIComponent(G.options[i].attributes["value"].specified?G.options[i].value:G.options[i].text)+"&"
              }else{
                K+=encodeURIComponent(E)+"="+encodeURIComponent(G.options[i].hasAttribute("value")?G.options[i].value:G.options[i].text)+"&"
              }
            }
          }
          break;
        case"radio":
        case"checkbox":
          if(G.checked){
            K+=encodeURIComponent(E)+"="+encodeURIComponent(1)+"&"
          } else {
            K+=encodeURIComponent(E)+"="+encodeURIComponent(0)+"&"
          }
          break;
        case"file":
        case undefined:
        case"reset":
        case"button":
          break;
        case"submit":
          if(M==false){
            K+=encodeURIComponent(E)+"="+encodeURIComponent(H)+"&";M=true
          }
          break;
        default:
          K+=encodeURIComponent(E)+"="+encodeURIComponent(H)+"&";
          break
      }
    }
  }
  K=K.substr(0,K.length-1);
  return K
}

// custom Vtype for vtype:'IPAddress'
Ext.apply(Ext.form.VTypes, {
    IPAddress:  function(v) {
        return /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(v);
    },
    IPAddressText: Application.lang.msg_error_ip_text,
    IPAddressMask: /[\d\.]/i
});

// Dodatkowa walidacja linkow (strona zewnetrzna lub podstrona)
Ext.apply(Ext.form.VTypes, {
    pairEmpty : function(val, field) {
        if (field.secondFieldName) {
            var sec = Ext.getCmp(field.secondFieldName);
            return (!Ext.isEmpty(val) || !Ext.isEmpty(sec.getValue()));
        }
        return true;
    },
    pairEmptyText: Application.lang.msg_menu_links_text
});

// Dodawanie tipow do pol formularzy
Ext.override(Ext.form.Field, {
    afterRender : Ext.form.Field.prototype.afterRender.createSequence(function() {
			var qt = this.qtip;
            if (qt) {
                Ext.QuickTips.register({
                target:  this,
                title: '',
                text: qt,
                enabled: true,
                showDelay: 0
            });
        }
    })
});

// Dodawanie do pola formularza nowych metod ukrywania i pokazywania pola
Ext.override(Ext.form.Field, {
    showField : function(){
		this.show();
		this.container.up('div.x-form-item').setDisplayed( true );
    },
    hideField : function(){
    	this.hide();
    	this.container.up('div.x-form-item').setDisplayed( false );
    }
});

// Klasa okna formularza
Application.formWindow = Ext.extend(Ext.Window, {

    closable: true,
    hideAfterAction: true,
    border: false,
    buttons: [
        {
            tooltip: Application.lang.form_window_save_tip,
            text: Application.lang.form_window_save_text
        }, {
            tooltip: Application.lang.form_window_apply_tip,
            text: Application.lang.form_window_apply_text
        },{
            tooltip: Application.lang.form_window_cancel_tip,
            text: Application.lang.form_window_cancel_text
        }
    ],
    
    initComponent:function() {
        
        Ext.apply(this, {
            y: 150,
            resizable: false,
            autoHeight: true,
            shadow: false,
            constrainHeader: true,
            plain: true,
            layout: 'fit',
            closeAction: 'hide'
        });

        Application.formWindow.superclass.initComponent.apply(this, arguments);

        if(!Ext.isEmpty(this.buttons[2]))
        {
            this.cancelButton = this.buttons[2];
            this.cancelButton.on({
                scope: this,
                click: this.hideWindow,
                stopEvent: true
            });
        }
        if(!Ext.isEmpty(this.buttons[0]))
        {
            this.saveButton = this.buttons[0];
            this.saveButton.on({
                scope: this,
                click: function() {
                    this.hideAfterAction = true;
                    this.isValidForm();
                },
                stopEvent: true
            });
        }
        if(!Ext.isEmpty(this.buttons[1]))
        {
            this.applyButton = this.buttons[1];
            this.applyButton.on({
                scope: this,
                click: function() {
                    this.hideAfterAction = false;
                    this.isValidForm();
                },
                stopEvent: true
            });
        }
    },

    hideWindow: function() {
        this.hide();
    },

    /**
     * Walidacja forumlarza
     */
    isValidForm: function() {
        var formItems = this.items.items[0].fields;
        
        for(i = 0; i < formItems.length; ++i) {
            if(formItems[i].isValid() === false) {
                Ext.MessageBox.show({
                    title: Application.lang.form_window_wrong_field_msg_title,
                    msg: Application.lang.form_window_valid_error_client,
                    buttons: Ext.MessageBox.OK,
                    icon: Ext.MessageBox.WARNING
                });
                return;
            }
        }
        
        if(this.items.items[0].task == "insert") {
            this.doInsert();
        } else if(this.items.items[0].task == "update") {
            this.doUpdate();
        }
    },

    /**
     * Czyszczenie formularza
     */
    resetForm: function() {
        var formItems = this.items.items[0].fields;
        if(formItems !== undefined) {
            for(i = 0; i < formItems.length; ++i) {
                if(!Ext.isEmpty(formItems[i].el)) {
                    if(!Ext.isEmpty(formItems[i].reset())) {
                        formItems[i].reset();
                    } else {
                        formItems[i].setValue('');
                    }
                }
                formItems[i].setDisabled(false);
            }
        }
    },

    /**
     * Czyszczenie i wylaczenie mozliwosci edycji formularza
     */
    makeReadOnly: function() {
        var formItems = this.items.items[0].fields;
        if(formItems !== undefined) {
            for(i = 0; i < formItems.length; ++i) {
                if(!Ext.isEmpty(formItems[i].el)) {
                    if(!Ext.isEmpty(formItems[i].reset())) {
                        formItems[i].reset();
                    } else {
                        formItems[i].setValue('');
                    }
                }
                formItems[i].setDisabled(true);
            }
        }
    },

    loadCombo: function(combo, value) {
        Ext.MessageBox.wait(Application.lang.msg_loading_text, Application.lang.msg_waiting_title);
        combo.store.on('load', function() {
            combo.setValue(value);
            Ext.MessageBox.hide();
        }, this, {single: true});
        combo.lastQuery = null;
        combo.doQuery(value, true);
    },

    loadSimpleCombo: function(combo, value) {
        Ext.MessageBox.wait(Application.lang.msg_loading_text, Application.lang.msg_waiting_title);
        combo.store.on('load', function() {
            combo.setValue(value);
            Ext.MessageBox.hide();
        }, this, {single: true});
        combo.store.load();
    },

    /***************************************************************************
     *                  WYSWIETLANIE FORMULARZA DODAWANIA
     **************************************************************************/

    /**
     * Wyswietlenie formularza dodawania danych
     */
    displayAddForm: function() {
        if(this.isVisible()){
            this.hide();
        }
        
        this.setTitle(Application.lang.form_window_insert_title);
        this.beforeDisplayAddForm();
        this.items.items[0].task = "insert";
        this.items.items[0].idField = null;
        this.show();
        this.resetForm();
        if(!Ext.isEmpty(this.buttons[0]))
            this.buttons[0].setVisible(true);
        if(!Ext.isEmpty(this.buttons[1]))
            this.buttons[1].setVisible(false);
        this.afterDisplayAddForm();
    },

    beforeDisplayAddForm: function() {
        // Do przeciazenia
    },

    afterDisplayAddForm: function() {
        // Do przeciazenia
    },


    /***************************************************************************
     *                  WYSWIETLANIE FORMULARZA EDYCJI
     **************************************************************************/

    /**
     * Wyswietlenie formularza edycji danych
     */
    displayEditForm: function(id) {
        if(this.isVisible()){
            this.hide();
        }
        
        this.setTitle(Application.lang.form_window_update_title);
        this.beforeDisplayEditForm();
        this.items.items[0].task = "update";
        this.items.items[0].idField = id;
        this.show();
        this.resetForm();
        if(!Ext.isEmpty(this.buttons[0]))
            this.buttons[0].setVisible(true);
        if(!Ext.isEmpty(this.buttons[1]))
            this.buttons[1].setVisible(true);
        this.doLoad(id);
        this.afterDisplayEditForm();
    },

    beforeDisplayEditForm: function() {
        // Do przeciazenia
    },

    afterDisplayEditForm: function() {
        // Do przeciazenia
    },


    /***************************************************************************
     *                  WYSWIETLANIE FORMULARZA SZCZEGOLOW
     **************************************************************************/

    /**
     * Wyswietlenie formularza podgadu danych
     */
    displayShowForm: function(id) {
        if(this.isVisible()){    
            this.hide();
        }
        
        this.setTitle(Application.lang.form_window_show_title);
        this.beforeDisplayShowForm();
        this.items.items[0].task = null;
        this.items.items[0].idField = id;
        this.show();
        this.makeReadOnly();
        if(!Ext.isEmpty(this.buttons[0]))
            this.buttons[0].setVisible(false);
        if(!Ext.isEmpty(this.buttons[1]))
            this.buttons[1].setVisible(false);
        this.doLoad(id);
        this.afterDisplayShowForm();
    },

    beforeDisplayShowForm: function() {
        // Do przeciazenia
    },

    afterDisplayShowForm: function() {
        // Do przeciazenia
    },


    /***************************************************************************
     *                     AKCJE PO WYSLANIU FORMULARZA
     **************************************************************************/

    /**
     * Wczytywanie dancyh do formularza
     */
    doLoad: function(id, scope) {
        
        if(Ext.isEmpty(scope)) {
            scope = this;
        }

        scope.items.items[0].load({
            url: Application.config.responseDir + scope.modelName + '/load',
            params: {id: id},
            waitTitle: Application.lang.msg_waiting_title,
            waitMsg: Application.lang.msg_loading_text,
            success: function(form, action) {
                if(Ext.isEmpty(action.result)) {
                    // Pusta odpowiedz
                    Application.errorHandler();
                } else {
                    scope.onLoadSuccess(form, action);
                }
            },
            failure: function(form, action) {
                Application.errorHandler(action.result, action.failureType, false, this);
            },
            scope: scope
        });
    },

    /**
     * Akcja wykonywana po poprawnym zaladowaniu danych
     */
    onLoadSuccess: function(form, action) {
        // Do przeciazenia
    },
    
    /**
     * Akcja dodawania
     */
    doInsert: function(extraParams) {
        this.doAction(extraParams);
    },

    /**
     * Akcja edycji
     */
    doUpdate: function(extraParams) {
        if(Ext.isEmpty(extraParams)) {
            extraParams = {};
        }
        extraParams.id = this.items.items[0].idField;
        this.doAction(extraParams);
    },

    /**
     * Wyslanie danych za pomoca Ajax'a przy edycji lub dodawaniu
     */
    doAction: function(extraParams) {
        this.items.items[0].getForm().submit({
            clientValidation: false,
            url: Application.config.responseDir + this.modelName + '/' + this.items.items[0].task.toLowerCase(),
            params: extraParams,
            waitTitle: Application.lang.msg_waiting_title,
            waitMsg: Application.lang.msg_saving_text,
            success: function(form, action) {
                if(!Ext.isEmpty(action.result)) {
                    // Operacja zakonczona pomyslnie
                    if(this.hideAfterAction)
                        this.hide();
                    if(!Ext.isEmpty(this.onSuccess)) {
                        this.onSuccess(form, action);
                    }
                    if(!Ext.isEmpty(action.result.msg)) {
                       Ext.MessageBox.show({
                            title: Application.lang.text_warning,
                            msg: action.result.msg,
                            buttons: Ext.MessageBox.OK,
                            icon: Ext.MessageBox.INFO
                        });
                    }
                } else {
                    // Pusta odpowiedz
                    Application.errorHandler();
                }
            },
            failure: function(form, action) {
                Application.errorHandler(action.result, action.failureType);
            },
            scope: this
        });
    },

    /**
     * Akcja wykonywana po poprawnej edycji/dodawaniu
     */
    onSuccess: function(form, action) {
        // Do przeciazenia
    },

    onRender: function() {
        Application.formWindow.superclass.onRender.apply(this, arguments);
    }

});

Ext.reg('formWindow', Application.formWindow);

