var Ctrl_Calendar_EventModel = Class.extend({
    
    init: function(data) {
        this.clear();
        
        this.index(data);
        
        this._requestsInProgess = {}
    },

    clear: function() {
        this.ids = {};
        this.calendar = {};
        this.data = {};
    },
    
    index: function(data) {
        for(var i in data) {
            if(isNaN(i))
                continue;
            
            var event = new Ctrl_Calendar_Event(data[i]);
            var y = event.start.getFullYear();
            var m = event.start.format('m');
            var d = event.start.format('d');
            
            // index by id
            this.ids[data[i].ID] = event;
            
            // index by calendar
            if(this.calendar[data[i].calendar_id] == undefined)
                this.calendar[data[i].calendar_id] = [];
            
            this.calendar[data[i].calendar_id].push(event);

            // index by date
            if(this.data[y] == undefined)
                this.data[y] = {}

            if(this.data[y][m] == undefined)
                this.data[y][m] = {}
            
            if(this.data[y][m][d] == undefined)
                this.data[y][m][d] = [];
            
            this.data[y][m][d].push(event);
            
         };
    },
    
    unindex: function(events) {
        for(var e in events) {
            if(isNaN(e))
                continue;
            
            var y = events[e].start.getFullYear();
            var m = events[e].start.format('m');
            var d = events[e].start.format('d');
            
            delete this.ids[events[e].ID];
            
            for(var i=0; i<this.data[y][m][d].length; i++) {
                if(this.data[y][m][d][i].ID == events[e].ID)
                    this.data[y][m][d].splice(i, 1);
            }
        }
    },
    
    hasMonth: function(date) {
        var path = this._getDatePath(date);
        
        if(this.data[path.y] == undefined)
            return false;

        return (this.data[path.y][path.m] !== undefined);
    },
    
    _getDatePath: function(date) {
        if(date instanceof Date) {
            var y = date.getFullYear();
            var m = date.format('m');
            var d = date.format('d');
        } else {
            var y = date.substr(0, 4);
            var m = date.substr(4, 2);
            var d = date.substr(6, 2);
        }
        
        return {y: y, m: m, d: d};
    },
    

    pathHasEvents: function(path) {
        if(this.data[path.y] == undefined)
            return false;

        if(this.data[path.y][path.m] == undefined)
            return false;
        
        if(this.data[path.y][path.m][path.d] == undefined)
            return false;
        else
            return this.data[path.y][path.m][path.d].length;
    },
    
    getDate: function(date) {
        var path = this._getDatePath(date);
        var events = (this.pathHasEvents(path))? this.data[path.y][path.m][path.d] : [];
        
       // events.sort(function(a,b){ return a.start.getHours() - b.start.getHours() });
        
        return events;
    },
    
    getRange: function(start, end) {
        var events = [];
        for (var c = start.clone(); c.format('Ymd') <= end.format('Ymd'); c.setDate(c.getDate() +1)) {
            events = events.concat(this.getDate(c));
        }
        return events;
    },
    
    fetchMonth: function(date, callback) {
        if(date instanceof Date) {
            date = date.format('Ymd');
        }
        
        if(this._requestsInProgess[date] && this._requestsInProgess[date] == true)
            return;
        
        var that = this;
        this._requestsInProgess[date] = true;
        var that = this;
        $.getJSON(calendarConfig.fetchUrl.parameterize({date: date}), function(data) {
           that.index(data.events);
           callback.call();
           that._requestsInProgess[date] = false;
        });
    }
    
});

