    /* @private
     * This is an internal helper class for the calendar views and should not be overridden.
     * It is responsible for the base event rendering logic underlying all views based on a
     * box-oriented layout that supports day spanning (MonthView, MultiWeekView, DayHeaderView).
     */
    Ext.ensible.cal.WeekEventRenderer = function(){

        var getEventRow = function(id, week, index){
            var indexOffset = 1; //skip row with date #'s
            var evtRow, wkRow = Ext.get(id+'-wk-'+week);
            if(wkRow){
                var table = wkRow.child('.ext-cal-evt-tbl', true);
                evtRow = table.tBodies[0].childNodes[index+indexOffset];
                if(!evtRow){
                    evtRow = Ext.DomHelper.append(table.tBodies[0], '');
                }
            }
            return Ext.get(evtRow);
        };

        return {
            render: function(o){
                var w = 0, grid = o.eventGrid,
                    dt = o.viewStart.clone(),
                    eventTpl = o.tpl,
                    max = o.maxEventsPerDay != undefined ? o.maxEventsPerDay : 999,
                    weekCount = o.weekCount < 1 ? 6 : o.weekCount,
                    dayCount = o.weekCount == 1 ? o.dayCount : 7;

                for(; w < weekCount; w++){
                    var row, d = 0, wk = grid[w];
                    var startOfWeek = dt.clone();
                    var endOfWeek = startOfWeek.add(Date.DAY, dayCount).add(Date.MILLI, -1);

                    for(; d < dayCount; d++){
                        if(wk && wk[d]){
                            var ev = emptyCells = skipped = 0,
                                day = wk[d], ct = day.length, evt;

                            for(; ev < ct; ev++){
                                if(!day[ev]){
                                    emptyCells++;
                                    continue;
                                }
                                if(emptyCells > 0 && ev-emptyCells < max){
                                    row = getEventRow(o.id, w, ev-emptyCells);
                                    var cellCfg = {
                                        tag: 'td',
                                        cls: 'ext-cal-ev',
                                        html: ' ',
                                        id: o.id+'-empty-'+ct+'-day-'+dt.format('Ymd')
                                    }
                                    if(emptyCells > 1 && max-ev > emptyCells){
                                        cellCfg.rowspan = Math.min(emptyCells, max-ev);
                                    }
                                    Ext.DomHelper.append(row, cellCfg);
                                    emptyCells = 0;
                                }

                                if(ev >= max){
                                    skipped++;
                                    continue;
                                }
                                evt = day[ev];

                                if(!evt.isSpan || evt.isSpanStart){ //skip non-starting span cells
                                    var item = evt.data || evt.event.data;
                                    item._weekIndex = w;
                                    item._renderAsAllDay = item[Ext.ensible.cal.EventMappings.IsAllDay.name] || evt.isSpanStart;
                                    item.spanLeft = item[Ext.ensible.cal.EventMappings.StartDate.name].getTime() < startOfWeek.getTime();
                                    item.spanRight = item[Ext.ensible.cal.EventMappings.EndDate.name].getTime() > endOfWeek.getTime();
                                    item.spanCls = (item.spanLeft ? (item.spanRight ? 'ext-cal-ev-spanboth' :
                                        'ext-cal-ev-spanleft') : (item.spanRight ? 'ext-cal-ev-spanright' : ''));

                                    var row = getEventRow(o.id, w, ev),
                                        cellCfg = {
                                            tag: 'td',
                                            cls: 'ext-cal-ev',
                                            cn : eventTpl.apply(o.templateDataFn(item))
                                        },
                                        diff = Ext.ensible.Date.diffDays(dt, item[Ext.ensible.cal.EventMappings.EndDate.name]) + 1,
                                        cspan = Math.min(diff, dayCount-d);

                                    if(cspan > 1){
                                        cellCfg.colspan = cspan;
                                    }
                                    Ext.DomHelper.append(row, cellCfg);
                                }
                            }
                            if(ev > max){
                                row = getEventRow(o.id, w, max);
                                Ext.DomHelper.append(row, {
                                    tag: 'td',
                                    cls: 'ext-cal-ev-more',
                                    id: 'ext-cal-ev-more-'+dt.format('Ymd'),
                                    cn: {
                                        tag: 'a',
                                        html: String.format(o.getMoreText(skipped), skipped)
                                    }
                                });
                            }
                            if(ct < o.evtMaxCount[w]){
                                row = getEventRow(o.id, w, ct);
                                if(row){
                                    var cellCfg = {
                                        tag: 'td',
                                        cls: 'ext-cal-ev',
                                        //html: ' ',
                                        id: o.id+'-empty-'+(ct+1)+'-day-'+dt.format('Ymd')
                                    };
                                    var rowspan = o.evtMaxCount[w] - ct;
                                    if(rowspan > 1){
                                        cellCfg.rowspan = rowspan;
                                    }
                                    Ext.DomHelper.append(row, cellCfg);
                                }
                            }
                        }else{
                            row = getEventRow(o.id, w, 0);
                            if(row){
                                var cellCfg = {
                                    tag: 'td',
                                    cls: 'ext-cal-ev',
                                    html: ' ',
                                    id: o.id+'-empty-day-'+dt.format('Ymd')
                                };
                                if(o.evtMaxCount[w] > 1){
                                    cellCfg.rowspan = o.evtMaxCount[w];
                                }
                                Ext.DomHelper.append(row, cellCfg);
                            }
                        }
                        dt = dt.add(Date.DAY, 1);
                    }
                }
            }
        };
    }();