Ext.form.TextField.prototype.size = 30;
Ext.form.TextField.prototype.initValue = function() { SetMaxLengthLockTyping(this); };

Ext.form.NumberField.prototype.size = 30;
Ext.form.NumberField.prototype.initValue = function() { SetMaxLengthLockTyping(this); };

var SetMaxLengthLockTyping = function (obj){
  if (obj.value !== undefined){
    obj.setValue(obj.value);
  }else if (obj.el.dom.value.length > 0){
    obj.setValue(obj.el.dom.value);
  }  
  if (obj.type=="combobox")
    obj.clearInvalid();
    
  if (obj.maxLengthLockTyping != true)
    return;
  
  obj.el.dom.size = obj.size;
  if (!isNaN (obj.maxLength) && (obj.maxLength) > 0 && (obj.maxLength != Number.MAX_VALUE)) 
    obj.el.dom.maxLength = obj.maxLength;
};

if (!Ext.ww) Ext.ww = {};
Ext.ww.advFieldSet =  Ext.extend(Ext.form.FieldSet, {
  layout: 'table', autoHeight: true, border:false, 
  layoutConfig: { columns: 1 },
  initComponent: function() {
    if (this.advItems.length>1)
      this.layoutConfig.columns = this.advItems.length;
    
    for (var i=0; i<this.advItems.length; i++)
    {
      var panelWidth = ((this.width)?this.width/this.advItems.length : '100%');
      var tmpPanel = new Ext.Panel({layout:'form', border: false, width: panelWidth, style: 'padding-right: 20px;', labelWidth: this.labelWidth});
      
      for (var itemName in this.advItems[i])
      {
        var currItem = this.advItems[i][itemName];
        var tmpItem;
        
        if ( typeof(currItem) == "string" )
          tmpItem = new Ext.form.TextField({ name: itemName, fieldLabel: currItem, allowBlank: false });
        else
        {
          if (!currItem.conf) currItem.conf = {};
          currItem.conf.name = itemName;
          currItem.conf.type = currItem.type || 'textfield';
          currItem.conf.value = currItem.value;
          currItem.conf.fieldLabel = currItem.label || itemName;
          currItem.conf.allowBlank = currItem.conf.allowBlank || false;
          tmpItem = ww.form._getFieldItem(currItem.conf);
        }
        
        if (tmpItem)
          tmpPanel.add(tmpItem);
      }
      this.add(tmpPanel);
    }
    //Ext.Window.superclass.initComponent.call(this);
  }
});

if (!ww.form) ww.form ={};
ww.form._getFieldItem = function(conf){
  if (eval('ww.form._' + conf.type ))
    return tmpItem = eval('ww.form._' + conf.type + '(conf)');
  else
    return false;
};

ww.form._textfield = function(conf){
  conf.maxLengthLockTyping = conf.maxLengthLockTyping || true;
  return new Ext.form.TextField(conf);
};

ww.form._email = function(conf){
  conf.vtype = 'email';
  conf.maxLengthLockTyping = conf.maxLengthLockTyping || true;
  return new Ext.form.TextField(conf);
};

ww.form._label = function(conf){
  conf.html = conf.value;
  return (ww.extend({
    layout: '',
    border: false
  }, conf));
};

ww.form._radiogroup = function(conf){
  return ww.form._getRadioCBgroup(conf);
};

ww.form._getRadioCBgroup = function(conf, type){
  var oInt = ww.clone(conf);
  var inputName = conf.name;
  var options = conf.options;
  Ext.apply(oInt, {type: null, options : null, name: 'grp_' + inputName, id: 'grp_' + inputName, columns: (conf.columns||1)});  

  var items = []; var i = 0;
  for (var opt in options) {
    if (typeof(options[opt]) != 'function') {
      items[i] = ww.el.getObject_viaSingle(options[opt], ['inputValue', 'boxLabel'], (typeof(options[opt])=='string')?i:0); 
      if (conf.value == items[i].inputValue)
        Ext.apply(items[i], {checked: true});
      else if (type=="cbg" && conf.value){
        conf.value = conf.value.replace (" ", "");
        var arrValue = conf.value.split(",");
        
        for (var j=0; j<arrValue.length; j++)
          if (items[i].inputValue == arrValue[j]) {
            items[i].checked = true;
            break;
          }
      }
      Ext.apply(items[i], {name: inputName, parentid: 'grp_' + inputName});
      i++;
    }
  }
  
  oInt.items = items;
  return ((type=='cbg')?new Ext.form.CheckboxGroup(oInt):new Ext.form.RadioGroup(oInt));  
};

ww.form._combobox = function(conf){
  var options = conf.options;
  var optionFields = conf.optionFields || ['field1'];
  conf.options = '';
  conf.optionFields = '';
  
  var store = new Ext.data.SimpleStore({
    data: options,
    fields: optionFields
  });
    
  var finalConf = ww.extend({
    store: store, valueField: optionFields[0], displayField: optionFields[1] || optionFields[0], mode: 'local', triggerAction: 'all',
    emptyText: 'Please select ...', editable:false 
  }, conf);
  
  return new Ext.form.ComboBox(finalConf);
};

ww.form._checkboxgroup = function(conf){
  return ww.form._getRadioCBgroup(conf, "cbg");
};

ww.form._textarea = function(conf){
  conf.maxLengthLockTyping = conf.maxLengthLockTyping || true;
  conf.enableKeyEvents = conf.enableKeyEvents || true;
  if (conf.maxLengthLockTyping){
    if (!conf.listeners) conf.listeners = [];
    conf.listeners['keydown'] = function(obj, e){
      if (this.el.dom.value.length >= this.maxLength)
        this.el.dom.value = this.el.dom.value.substring(0, this.maxLength-1);
    };
    conf.listeners['change'] = function(obj, oldV, newV){
      if (this.el.dom.value.length > this.maxLength)
        this.el.dom.value = this.el.dom.value.substring(0, this.maxLength);
    };
  }
  return new Ext.form.TextArea(conf);
};

ww.form._numberfield = function(conf){
  conf.maxLengthLockTyping = conf.maxLengthLockTyping || true;
  return new Ext.form.NumberField(conf);
};

ww.form._postcode = function(conf){
  conf.minLength = conf.minLength || 6;
  conf.maxLength = conf.maxLength || 6;
  return ww.form._numberfield(conf);
};

ww.form._phonenumber = function(conf){
  conf.minLength = conf.minLength || 8;
  conf.maxLength = conf.maxLength || 8;
  return ww.form._numberfield(conf);
};
