/*
 * Add or connect to the individual_graphs. We are lazy, and assume if the outermost
 * div exists that the full required HTML structure hs been properly set up
 * by the server. We might not even use this functionality, but just in case
 */
window.intelesense_data.add_model((function( $, intelesense_data )
{
    function sensor_data()
    {
        this.first_loaded_time = null;
        this.last_loaded_time = null;
        this.selected = [];
        this.data = [];
        this.time_offset_map = [];
        this.columns = {};
        this.map = null;
    };

    sensor_data.prototype.add_column = function(init)
    {
        if(init.field_id != undefined)
        {
            this.columns[init.field_id] = $.extend({
                name:null,
                description:null,
                intelecell:null,
                sensor:null,
                time_zone:0,
                field_id:null,
                units:null,
                latest_reading:null,
                tab:null,
                sort_order:null,
                last_available_time:null,
                first_available_time:null,
                display:'flash_graph',
                data_loaded:false,
                max:null,
                min:null,
                total:null
            },init);
        }
    }

    sensor_data.prototype.init = function()
    {

    };

    sensor_data.prototype.firstAvailableTime = function(columns)
    {

    }

    sensor_data.prototype.lastAvailableTime = function(columns)
    {

    }

    sensor_data.prototype.add_data = function(data)
    {
        var i,x;
        for(i in data)
        {
            x = data[i];
            this.data.push(x);
        }
    }

    sensor_data.prototype.get_data = function(column,options)
    {
        var return_data=[],
            i=0,
            j=0,
            val=null;

        for (i = 0; i < this.data.length; i++)
        {
            val = this.data[i][column.field_id];
            if(val!==null)
            {
                return_data[j] = [this.data[i].time,val];
                j++;
            }
        }
        return return_data;
    }

    sensor_data.prototype.mark_selected_invalid = function()
    {
        $(document).trigger('eventDataMarkedInvalid', [cells]);
    }

    sensor_data.prototype.format_date = function(d,fmt,col,zone) //zone: utc, data, user
    {
        //sensible defaults, I hope
        zone = zone || 'data';
        fmt = fmt || '%y/%m/%d %H:%M';
        d = d || new Date();
        var offset = !col ? 0 : col.time_zone;
        
        var map = {
            getFullYear:'getUTCFullYear',
            getMonth:'getUTCMonth',
            getDate:'getUTCDate',
            getHours:'getUTCHours',
            getMinutes:'getUTCMinutes',
            getSeconds:'getUTCSeconds'
        };

        //do our trickery
        if(zone=='data')
        {
            d.setTime(d.getTime()+offset);
        }
        else if (zone=='utc')
        {
            //I think we don't need to do anything here'

        }
        else if(zone=='user')
        {
            map = {
                getFullYear:'getFullYear',
                getMonth:'getMonth',
                getDate:'getDate',
                getHours:'getHours',
                getMinutes:'getMinutes',
                getSeconds:'getSeconds'
            };
        }

        var leftPad = function(n) {
            n = "" + n;
            return n.length == 1 ? "0" + n : n;
        };

        var r = [];
        var escape = false, padNext = false;
        var hours = d[map.getHours]();
        var isAM = hours < 12;
        var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

        if (fmt.search(/%p|%P/) != -1) {
            if (hours > 12) {
                hours = hours - 12;
            } else if (hours == 0) {
                hours = 12;
            }
        }
        for (var i = 0; i < fmt.length; ++i) {
            var c = fmt.charAt(i);

            if (escape) {
                switch (c) {
                case 'h': c = "" + hours; break;
                case 'H': c = leftPad(hours); break;
                case 'M': c = leftPad(d[map.getMinutes]()); break;
                case 'S': c = leftPad(d[map.getSeconds]()); break;
                case 'd': c = "" + leftPad(d[map.getDate]()); break;
                case 'm': c = "" + leftPad(d[map.getMonth]() + 1); break;
                case 'y': c = "" + d[map.getFullYear](); break;
                case 'b': c = "" + monthNames[d[map.getMonth]()]; break;
                case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;
                case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;
                case '0': c = ""; padNext = true; break;
                }
                if (c && padNext) {
                    c = leftPad(c);
                    padNext = false;
                }
                r.push(c);
                if (!padNext)
                    escape = false;
            }
            else {
                if (c == "%")
                    escape = true;
                else
                    r.push(c);
            }
        }
        return r.join("");
    }

    sensor_data.prototype.mark_selected_valid = function()
    {
        $(document).trigger('eventDataMarkedValid', [cells]);
    }

    sensor_data.prototype.select = function(item)
    {
        this.selected.push(item);
        $(document).trigger('selectionChanged', [item,'add']);
        return true;
    }

    sensor_data.prototype.unselect = function(item)
    {
        for(var i in this.selected)
        {
            if(this.selected[i]==item)
            {
                this.selected.splice(i,1);
                $(document).trigger('selectionChanged', [item,'remove']);
                return true;
            }
        }
        return false;
    }

    sensor_data.prototype.toggle_select = function(item)
    {
        if(!this.unselect(item))
        {
            this.select(item);
        }
    }

    sensor_data.prototype.reset_select = function()
    {
        this.selected = [];
        $(document).trigger('selectionChanged');
    }

    sensor_data.prototype.get_selected = function(e)
    {

    }

    return( new sensor_data() );

})( jQuery, window.intelesense_data ));
