(function() {

var window = this, undefined;

metrics =
{
    track: function(page) {
        try {
    	var pageTracker = _gat._getTracker("UA-639236-12");
    	pageTracker._trackPageview(page);
    	//console.log(page);
    	} catch(err) {}    
    }
}

metrics.utils = {
    hexToRGBString: function(colorHex) {
        if(!colorHex) {
            colorHex = "666666";
        }
        colorHex = colorHex.toUpperCase()
        return parseInt(colorHex.substring(0,2),16) + ","+parseInt(colorHex.substring(2,4),16)+","+parseInt(colorHex.substring(4,6),16);
    }
}

metrics.graphing = {
    report_data: {},
    question_data: {},
    questions_loaded: 0,
    questions_to_load: 0,
    previous_point: null,
    
    
    drawReport: function(report_id, reload_questions) {
        $("#reportJS").html("Drawing report...");
        $.getJSON("/api/1.0/report_info/"+report_id+"/", function(data){
          metrics.graphing.gotReportData(data, reload_questions);
        });
    },
    
    gotReportData: function(data, reload_questions) {
        metrics.graphing.report_data = data['report'];
        var report_data = metrics.graphing.report_data;
        for(question in report_data['questions']){
            metrics.graphing.questions_to_load += 1;
            $.getJSON("/api/1.0/question_answers/"+question+"/"+report_data['user']+"/", function(data){
              metrics.graphing.gotReportQuestionData(data, "user");
            });
        }
    },
    
    gotReportQuestionData: function(data, user) {
        var curr_question_data = metrics.graphing.question_data[data['question']['id']] = {};
        curr_question_data[user] = data['question']
        metrics.graphing.questions_loaded += 1;
        
        curr_question_data[user]['units_label'] = false;
        curr_question_data[user]['converted_answers'] = metrics.graphing.convertAnswerUnits(data['question']['id'], user)

        if (metrics.graphing.questions_to_load == metrics.graphing.questions_loaded){
            //HACK - crude way to autoselecting the first question
            for(question in metrics.graphing.report_data['questions']){
                hilightQuestionInAnalyzer(question);
                break;
            }
            //metrics.graphing.drawReportGraph();
        }
    },
    
    convertAnswerUnits: function(question_id, user) {
        var answers = metrics.graphing.question_data[question_id][user]['answers'];
        var multiplier = 1
        var assume_zero = true;
        try {
            assume_zero = (metrics.graphing.question_data[question_id][user]['params']['assume_zero']['val'] != "false");
        } catch(err) {}
        try {
            var unit_key = metrics.graphing.question_data[question_id][user]['params']['latest_units']['val'];
            var unit = metrics.graphing.report_data.questions[question_id]['units'][unit_key];
            metrics.graphing.question_data[question_id][user]['units_label'] = unit.name;
            multiplier = 1/unit.multiplier;
        } catch(err) {} 
        var converted_answers = []
        for (answer in answers){
            if(assume_zero || answers[answer]['num_users']>0){
                converted_answers.push([answers[answer]['created_on']*1000, (answers[answer]['data'] * multiplier)]);
            }
        }
        return converted_answers;
        
    },
    
    drawReportGraph: function(hilight_question_id){
        var questions_to_graph = [];
        if(hilight_question_id) {            
            var hilight_question_to_graph = metrics.graphing.getQuestionInfo(hilight_question_id,'user');
            if(hilight_question_to_graph) {
                hilight_question_to_graph['color'] = hilight_question_to_graph['colorfull'];
                hilight_question_to_graph['lines']['fill'] = true;
                hilight_question_to_graph['points']['show'] = true;
                
                questions_to_graph.push(hilight_question_to_graph)                                    
            }
        }

        for(question in metrics.graphing.question_data){
            if(question != hilight_question_id) {
                var question_to_graph = metrics.graphing.getQuestionInfo(question, 'user');
                questions_to_graph.push(question_to_graph)                
            }
        }

        $.plot($("#reportJS"), questions_to_graph,
            {
                xaxis: { 
                    mode:               "time" 
                    },
                grid:{
                    color:              "rgb(205,205,205)",
                    backgroundColor:    "rgb(245,245,245)",
                    borderWidth:        0,
                    tickColor:          "rgb(255,255,255)",
                    hoverable:          true
                    }
            }
        );

        $("#reportJS").bind("plothover", function (event, pos, item) {
            if (item) {
                if(item.series.points.show == true) {
                    if (metrics.graphing.previous_point != item.datapoint) {
                        metrics.graphing.previous_point = item.datapoint;

                        $("#tooltip").remove();
                        var x = item.datapoint[0].toFixed(0),
                            y = item.datapoint[1].toFixed(2);

                        var d = new Date(parseInt(x));
                        metrics.graphing.showTooltip(item.pageX, item.pageY, "<h3>"+y+"</h3><h5>"+(d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear()+"</h5>");
                    }
                } else {
                    $("#tooltip").remove();
                    metrics.graphing.previous_point = null;
                }
            } else {
                $("#tooltip").remove();
                metrics.graphing.previous_point = null;            
            }
        });
        
    },
    
    showTooltip: function (x, y, contents) {
        $('<div id="tooltip">' + contents + '</div>').css( {
            position: 'absolute',
            display: 'none',
            top: y - 100,
            left: x - 33,
            opacity: 0.85
        }).appendTo("body").fadeIn(100);
    },
    
    
    getQuestionInfo:function(question_id, user) {
        if(metrics.graphing.report_data['questions'][question_id]) {
            var question_color_hex = metrics.graphing.report_data['questions'][question_id]['params']['color'];
            var question_color = "rgb("+metrics.utils.hexToRGBString(question_color_hex)+")";
            var question_color_mild = "rgba("+metrics.utils.hexToRGBString(question_color_hex)+",0.6)";
            var fill_color = "rgba("+metrics.utils.hexToRGBString(question_color_hex)+",0.8)";
            var question_name = metrics.graphing.report_data['questions'][question_id]["name"];
            var label = metrics.graphing.question_data[question_id][user]['units_label']
            label = (label) ? " - "+ label:"";
            
            var question_info = {
                label:      question_name + label,
                data:       metrics.graphing.question_data[question_id][user]['converted_answers'],
                lines:      {
                            show:       true,
                            fill:       false,
                            fillColor:  fill_color,
                            },
                points:     {
                            show:       false,
                            fill:       true,
                            //fillColor:  "rgb(255,255,255)",
                            fillColor:  question_color,
                            radius:     1.5,
                            },
                color:      question_color_mild,
                colorfull:  question_color,
                shadowSize: 0,
            }
            return question_info;
        } else {
            //invalid question
            return false
        }
    }
    
}

metrics = window.metrics;
})();
