if (!Ext.ww) Ext.ww={}
if (!Ext.ww.form) Ext.ww.form={}
Ext.ww.form.DateComboField = function (config) {
  if (config.itemDefaults) Ext.apply(this.defaults.defaults, config.itemDefaults);
  Ext.ww.form.DateComboField.superclass.constructor.call(this, config);

  if (!this.name) this.name = this.id;
  this.manipulateCombo();
  Ext.apply(this, {
    dt: this.items.get(0).items.get(0),
    cbday: this.items.get(1).items.get(0),
    cbmth: this.items.get(2).items.get(0),
    cbyr: this.items.get(3).items.get(0)
  });
  this.cbmth.on('select', this.onMonthSelect, this);
  this.cbyr.on('select', this.onYearSelect, this);

  this.cbday.on('select', this.onUpdateField, this);
  this.cbmth.on('select', this.onUpdateField, this);
  this.cbyr.on('select', this.onUpdateField, this);
  this.dt.mountTextValue = this.mountTextValue;
}

Ext.extend(Ext.ww.form.DateComboField, Ext.Panel,  {
  layout: 'column', 
  retrieveformat: {d:0, m:1, y:2}, 
  format: 'd/m/Y', 
  dateSeparator: '/', 
  monthDisplay: 'F', 
  monthValue: 'm', 
  minYear: new Date().format('Y') - 50, 
  maxYear: new Date().format('Y') + 50,
  columnsWidth: [.28, .20, .45] , 
  labelWidth: 90, 
  defaults: {layout: 'form', border: false,
    defaults: {
      allowBlank: false, xtype: 'combo', typeAhead: true,
      triggerAction: 'all', mode: 'local',
      selectOnFocus: true, forceSelection: true
    }
  },
  manipulateCombo: function () {
    var arrD = {day: [], mth: [], yr: []}
    for (var i=this.minYear; i<=this.maxYear; i++) arrD.yr.push(i);
    for (var i=0; i<=11; i++) {
      var dt = new Date(this.maxYear, i, 1);
      arrD.mth.push([dt.format('F'), dt.format('m'), dt.format('M'), dt.format('n')]);
    }
    for (var i=1; i<=31; i++) arrD.day.push((i<10)?'0'+i:i);
    
    var errorName = this.fieldLabel;
    var arrConf = [{
      columnWidth: .0001, items: {xtype: 'hidden', labelSeparator: '', name: this.name}
    }, {
      columnWidth: this.columnsWidth[0], labelWidth: this.labelWidth, items: Ext.apply({fieldLabel: (this.fieldLabel||''), name: (this.name||'') + '_Day',  errorLabel: errorName + '-Day', emptyText:'Day', width: 60, store: arrD.day}, this.dconf||{})
    }, {
      columnWidth: this.columnsWidth[1], labelWidth: 5, items: Ext.apply({fieldLabel: this.dateSeparator, labelSeparator: '', name: (this.name||'') + '_Month', errorLabel: errorName + '-Month', emptyText:'Month', width: 100, 
        displayField: this.monthDisplay, valueField: this.monthValue, store: 
        new Ext.data.SimpleStore({fields: ['F', 'm', 'M', 'n', 't'], data: arrD.mth})
        }, 
      this.mconf||{})
    }, {
      columnWidth: this.columnsWidth[2], labelWidth: 5, items: Ext.apply({fieldLabel: this.dateSeparator, labelSeparator: '', name: (this.name||'') + '_Year', errorLabel: errorName + '-Year', emptyText:'Year', width: 100, store: arrD.yr}, this.yconf||{})
    }]
    for (var i=0; i<arrConf.length; i++) this.add(arrConf[i]);
  },
  mountTextValue: function (v) {
    var pr = this.ownerCt.ownerCt;
    var arr = v.toString().split(pr.dateSeparator);
    if (arr.length == 3) {
      var dt={d: arr[pr.retrieveformat.d], m: arr[pr.retrieveformat.m], y: arr[pr.retrieveformat.y]}
      pr.cbday.setValue(dt.d.toString());
      pr.cbmth.setValue(dt.m.toString());
      pr.cbyr.setValue(dt.y.toString());
    }
    pr.dt.setValue(v);
  },
  reConstructDay: function (t) {
    this.cbday.store.removeAll();
    var rc = Ext.data.Record.create({name: 'text'});
    for (var i=1;i<=t;i++) this.cbday.store.add(new rc({text: (i<10)?'0'+i:i}));
  },
  onUpdateField: function () {
    var dt = {d: this.cbday.getValue(), m: this.cbmth.getValue(), y: this.cbyr.getValue()};
    if (dt.d && dt.m && dt.y) {
      var s = new Date(dt.y, parseInt(dt.m)-1, dt.d).format(this.format);
      this.dt.setValue(s);
    }
  },
  onMonthSelect: function () {
    var t = new Date(this.cbyr.getValue(), parseInt(this.cbmth.getValue()) - 1).format('t');
    if (this.cbday.store.data.length != t) this.reConstructDay(t);
  },
  onYearSelect: function () {
    var t = new Date(this.cbyr.getValue(), parseInt(this.cbmth.getValue()) - 1).format('t');
    if (this.cbday.store.data.length != t) this.reConstructDay(t);
  }
});
Ext.reg('datecombofield', Ext.ww.form.DateComboField);
