﻿// Copyright (C) 2008 Xtensive LLC.
// All rights reserved.
// For conditions of distribution and use, see license.
// Created by: Marat Faskhiev
// Created:    2008.10.16

stringFormat=function(B) {
  var A=Array.prototype.slice.call(arguments,1);
  return B.replace(/\{(\d+)\}/g, function(C,D){return A[D]});
}

Date.formatCodeToRegex = function(character, currentGroup) {
  var p = Date.parseCodes[character];

  if (p) {
    p = Ext.type(p) == 'function'? p() : p;
    Date.parseCodes[character] = p;
  }

  var oldStringFormat = String.format;
  String.format = stringFormat;

  var result = p? Ext.applyIf({
    c: p.c? String.format(p.c, currentGroup || "{0}") : p.c
    }, p) : {
      g:0,
      c:null,
      s:Ext.escapeRe(character) };

  String.format = oldStringFormat;

  return result;
}

var $f = Date.formatCodeToRegex;

Ext.override(Ext.grid.GridView, {
  layout : function() {
    if (!this.mainBody)
      return;

    var g = this.grid;
    var c = g.getGridEl();
    var csize = c.getSize(true);
    var vw = csize.width;
    if(vw<20 || csize.height<20)
      return;

    if (g.autoHeight) {
      this.scroller.dom.style.overflowX = 'auto';
      this.scroller.setWidth(vw);
      if (Ext.isIE) {
        var scrollWidth = this.mainBody.dom.scrollWidth;
        if (scrollWidth>vw)
          this.scroller.setStyle("padding-bottom", this.scrollOffset+2);
        else
          this.scroller.setStyle("padding-bottom", 0);
        this.scroller.setStyle("overflow-y", "hidden");
      }
    }
    else {
      this.el.setSize(csize.width, csize.height);
      var hdHeight = this.mainHd.getHeight();
      var vh = csize.height - (hdHeight);
      this.scroller.setSize(vw, vh);
    }
    if (this.innerHd)
      this.innerHd.style.width = (vw)+'px';
    if (this.forceFit) {
      if (this.lastViewWidth!=vw) {
        this.fitColumns(false, false);
        this.lastViewWidth = vw;
      }
    }
    else {
      this.autoExpand();
      this.syncHeaderScroll();
    }
    this.onLayout(vw, vh);
  }
});

Ext.override(Ext.Container, {
  applyDefaults : function(c) {
    if (this.defaults) {
      if (typeof c=='string') {
        c = Ext.ComponentMgr.get(c);
        Ext.apply(c, this.defaults);
      }
      else
        Ext.applyIf(c, this.defaults);
    }
    return c;
  }
});

Ext.override(Ext.grid.EditorGridPanel, {
  startEditing : function(row, col) {
    this.stopEditing();
    if (this.colModel.isCellEditable(col, row)) {
      this.view.ensureVisible(row, col, true);
      var r = this.store.getAt(row);
      var field = this.colModel.getDataIndex(col);
      var e = {
        grid: this,
        record: r,
        field: field,
        value: r.data[field],
        row: row,
        column: col,
        cancel:false
      };
      if (this.fireEvent("beforeedit", e)!==false && !e.cancel) {
        this.editing = true;
        var ed = this.colModel.getCellEditor(col, row);
        if(!ed.rendered)
          ed.render(this.view.getEditorParent(ed));
        (function() {
          ed.row = row;
          ed.col = col;
          ed.record = r;
          ed.on("complete", this.onEditComplete, this, {single: true});
          ed.on("specialkey", this.selModel.onEditorKey, this.selModel);
          this.activeEditor = ed;
          var v = this.preEditValue(r, field);
          this.view.scroller.un('scroll', this.view.syncScroll, this.view);
          ed.startEdit(this.view.getCell(row, col).firstChild, v);
          this.view.scroller.on('scroll', this.view.syncScroll, this.view);
        }).defer(50, this);
      }
    }
  }
});

Ext.override(Ext.Editor, {
  fixIEFocus : true
});

Ext.override(Ext.form.TextArea, {
  doLayout : function() {
    this.autoSize();
  }
});

destroyExtComponent = function(component) {
  if (component.ownerCt)
    return;
  try {
    component.destroy();
  } 
  catch(e) {}
}

if(typeof(Sys)!=='undefined')
    Sys.Application.notifyScriptLoaded();