if (typeof(Prototype)!='undefined' && typeof(scal)!='undefined') {
  var Calendar = Class.create({
    initialize  : function(element) {
      var self      = Calendar.instance = this,
          timestamp = arguments[1] || undefined,
          callbacks = Object.extend({
            onUpdate : Prototype.emptyFunction,
            onSelect : Prototype.emptyFunction
          }, arguments[2] || {});
      if (timestamp) {
        self.date = new Date(parseInt(timestamp+'000'));
      } else {
        self.date = new Date();
      }
      self.onUpdate = callbacks.onUpdate;
      self.onSelect = callbacks.onSelect;
      Try.block(function() {
        self.element  = $(element);
        self.updates  = $(self.element.identify()+'_updates');
        self.cover    = $(self.element.identify()+'_cover');
        self.scal     = new scal(self.element, self.updates, {
          dayheadlength : 9,
          exactweeks    : true,
          year          : self.date.getFullYear(),
          month         : (self.date.getMonth()+1),
          day           : self.date.getDate()
        });
        (function() {
          Try.block(function() {
            self.cover.absolutize().clonePosition(self.scal.element);
            self.cover.setStyle({
              background  : 'transparent url(/img/loading.gif) no-repeat center center'
            });
          });
        }).defer();
        self.scal._update = self.scal._update.wrap(function() {
          var args = $A(arguments), proceed = args.shift();
          Try.block(function() {
            self.scal.element.setOpacity(0.5);
            self.cover.show();
            (function() {
              Try.block(function() {
                proceed.apply(self.scal, args);
                self.onDraw();
                self.scal.element.setOpacity(1.0);
                self.cover.hide();
              });
            }).delay(1);
          });
        });
      });
      self.onDraw();
    },
    onDraw : function() {
      var self = this;
      Try.block(function() {
        var width   = ((self.element.up().getWidth())/7).floor()-1,
            height  = width;
        self.scal.getSelectedElement().addClassName('focus');
        self.scal.element.setStyle({
          width : ((width*7)+8)+'px'
        });
        self.scal.element.down('.calheader').setStyle({
          width : ((width*7)+6)+'px'
        });
        self.scal.element.select('.weekboxname .daybox').invoke('setStyle', {
          width   : width+'px'
        });
        self.scal.element.select('.calweekswrapper .daybox').each(function(daybox) {
          daybox.setStyle({
            width   : width+'px',
            height  : height+'px',
            cursor  : 'default',
            overflow:'hidden'
          });

/*          daybox.down('.dayboxvalue').setStyle({
            width   : width+'px',
            height  : (height-daybox.down('.dayboxdate').getHeight()-1)+'px',
            overflowY : 'auto'
          });*/
        });
        self.onUpdate.apply(self);
      });
    }
  });
}