﻿
var dBarWidth = null;
var globalBarRealWidth = null;
var globalClickBindings = [];
var globalGraphData;
var globalWorkoutTypeList = new Array();
var globalMaxTypeStr = null;

var globalTotals = new Array();

globalWorkoutTypeList = [];




var workoutLabel = {};



var workoutTypeColor = {};
var workoutTypeColorIn = {};

function workoutTypeColorByString(strType) {
    for (key in workoutLabel) {
        if (workoutLabel[key] == strType) {
            return workoutTypeColor[key];
        }
    }
    return "AA5522";
}

function workoutTypeByString(strType) {
    for (key in workoutLabel) {
        if (workoutLabel[key] == strType) {
            return key;
        }
    }
}

function setLegendColors() {
    for (key in workoutTypeColor) {
        
        $("#legend_color" + key).css("background-color", "#" + workoutTypeColor[key]);
    }
    
}

var globalDateStart;
var globalDateEnd;





function showTooltip(x, y, contents) {
    $('<div id="tooltip">' + contents + '</div>').css({
        position: 'absolute',
        display: 'none',
        top: y,
        left: x,
        border: '1px solid #fdd',
        padding: '2px',
        'background-color': '#fee',
        opacity: 0.80
    }).appendTo("body").fadeIn(200);
}



function fullClone(obj) { // obj instanceof Array
    var newObj = (obj.constructor == Array) ? [] : {};
    for (i in obj) {
        if (i == 'fullClone') continue;
        if (obj[i] && typeof obj[i] == 'object') {
            newObj[i] = fullClone(obj[i]);
        }
        else newObj[i] = obj[i];
    }
    return newObj;
};

function fullText(obj) {
    var newObj = new String();
    newObj += (obj.constructor == Array) ? "[" : "{";
    for (i in obj) {
        if (i == 'fullText') continue;
        if (obj[i] && typeof obj[i] == 'object') {
            newObj += i + "=" + fullText(obj[i]) + ",";
        }
        else newObj += i + "=" + obj[i] + ",";
    }
    newObj += (obj.constructor == Array) ? "]" : "}";
    return newObj;
}

function transformSeries(rawData, workoutTypeList) {
    globalTotals = [];
    var transformed = fullClone(rawData);
    for (var i = 0; i < transformed.length; ++i) { // for each graph
        var lastArray = [];
        for (var j = 0; j < transformed[i].Results.length; ++j) { // for each workoutType
            if (transformed[i].Results[j].wTypeId in workoutTypeList) {
                if (!transformed[i].IsAvg) { // only transform non-averages
                    for (k = 0; k < transformed[i].Results[j].PointsArray.length; ++k) {
                        var atTime = transformed[i].Results[j].PointsArray[k][0];
                        if (!globalTotals[transformed[i].GraphObject]) {
                            globalTotals[transformed[i].GraphObject] =
                                transformed[i].Results[j].PointsArray[k][1];
                        }
                        else {
                            globalTotals[transformed[i].GraphObject] +=
                                transformed[i].Results[j].PointsArray[k][1];
                        }
                        if (lastArray[atTime] != null) {
                            // value starts at this height
                            transformed[i].Results[j].PointsArray[k].push(lastArray[atTime]);
                            // value ends at new height:
                            transformed[i].Results[j].PointsArray[k][1] += lastArray[atTime];
                            lastArray[atTime] = transformed[i].Results[j].PointsArray[k][1];
                        }
                        else {
                            transformed[i].Results[j].PointsArray[k].push(0);
                            lastArray[atTime] = transformed[i].Results[j].PointsArray[k][1];
                        }
                    }
                }
                transformed[i].Results[j].isVisible = true;
            }
            else { // zero invisible workout types.
                transformed[i].Results[j].isVisible = false;
            }
        }
    }
    return transformed;
}



function loadTimelineGraphs(TimeUnit, DateStart, DateEnd) {
    if (!(TimeUnit && DateStart && DateEnd)) {
        throw ("Invalid parameters to " + loadTimelineGraphs);
    }
    var today = new Date()
    var offsetMinutes = today.getTimezoneOffset();
    globalDateStart = DateStart;
    globalDateEnd = DateEnd;
    $.getJSON("/Results/GetAllMyBarsJSON", {
        timeUnit: TimeUnit,
        dateStart: DateStart,
        dateEnd: DateEnd,
        offsetMinutes: offsetMinutes,
        user_id: $("#user_id").val()
    }, loadedMultiTimelineGraph);
}

var loadedMultiTimelineGraph = function(jsonData) {
    globalGraphData = jsonData;
    showAvailableCheckboxes();
    if (jsonData != null) {
        graphMultiRedraw();
        updateTotalStats();
    }
}

function showAvailableCheckboxes() {
    var types = globalGraphData[5].Results;
    for (var k = 0; k < types.length; ++k) {
        if (types[k].PointsArray.length > 0) {
            $("#sel_" + types[k].wTypeId).show();
        }
        else {
            $("#sel_" + types[k].wTypeId).hide();
        }
    }
}

function graphMultiRedraw() {
    if (globalGraphData != null) {
        var toRedraw = transformSeries(globalGraphData, globalWorkoutTypeList);
        for (k = 0; k < toRedraw.length; ++k) {
            try {
                drawMultiGraph(toRedraw[k]);
            }
            catch (e) { }
        }
    }
}


var globalPreviousPoint;

function drawMultiGraph(dataToDraw) {
    dBarWidth = 70000000 * dataToDraw.TimeScale;
    globalBarRealWidth = 86400000 * dataToDraw.TimeScale;

    var series = new Array();
    for (var i = 0; i < dataToDraw.Results.length; ++i) { // for each "result"
        if (dataToDraw.Results[i].isVisible) {
            if (dataToDraw.IsAvg) {
                series.push(
                        {
                            data: dataToDraw.Results[i].PointsArray,
                            bars: { show: false },
                            points: { show: true },
                            lines: { show: true },
                            color: "#" + workoutTypeColor[dataToDraw.Results[i].wTypeId],
                            label: workoutLabel[dataToDraw.Results[i].wTypeId],
                            itemsUnit: dataToDraw.Results[i].yUnit
                        }
                );
            }
            else {
                series.push(
                        {
                            data: dataToDraw.Results[i].PointsArray,
                            bars: { show: true, barWidth: dBarWidth, align: "left" },
                            points: { show: false },
                            lines: { show: false },
                            color: "#" + workoutTypeColor[dataToDraw.Results[i].wTypeId],
                            label: workoutLabel[dataToDraw.Results[i].wTypeId],
                            itemsUnit: dataToDraw.Results[i].yUnit
                        }
                );
            }
        }
    }
    $("#" + dataToDraw.GraphObject).html("");
    $.plot(
            $("#" + dataToDraw.GraphObject), series,
            {
                xaxis: {
                    mode: "time",
                    tickDecimals: 3,
                    ticks: 8,
                    min: globalDateStart,
                    max: globalDateEnd
                },
                yaxis: {
                    ticks: 4,
                    labelWidth: 25,
                    min: 0
                },
                grid: {
                    borderWidth: 1,
                    clickable: true,
                    backgroundColor: "#FFFFFF",
                    backgroundColorFillAll: false,
                    hoverable: true
                },
                legend:
                {
                    show: false
                }
            }
        );
    if (!globalClickBindings[dataToDraw.GraphObject]) {
        $("#" + dataToDraw.GraphObject).bind("plothover", function(event, pos, item) {
            if (item) {
                if (globalPreviousPoint != item.datapoint) {
                    globalPreviousPoint = item.datapoint;

                    $("#tooltip").remove();


                    //$("#clickdata").text("You clicked point " + item.dataIndex + " in " + item.series.label + ".");
                    var showValue = item.datapoint[1];
                    if (item.datapoint.length == 3) showValue -= item.datapoint[2];
                    var displayDateText;
                    if (globalBarRealWidth < 86400001) {
                        displayDateText = formatDate(item.datapoint[0], "%b %d");
                    }
                    else if (globalBarRealWidth < 25 * 86400001) {
                        displayDateText = formatDate(item.datapoint[0], "%b %d") + " - "
                        + formatDate(item.datapoint[0] + globalBarRealWidth, "%b %d")
                    }
                    else {
                        displayDateText = formatDate(item.datapoint[0], "%b %y");
                    }
                    showTooltip(item.pageX + 7, item.pageY - 28,
                    roundingForValue(showValue) + " " + item.series.itemsUnit + "<br />"
                    + displayDateText
                    );
                }
            }
            else {
                $("#tooltip").remove();
                globalPreviousPoint = null;
            }

        });
        globalClickBindings[dataToDraw.GraphObject] = true;
    }
}

function roundingForValue(showValue) {
    return Math.round((showValue) * 100.0) / 100.0;
}

/*********************************************/
/* google pies                               */
/*********************************************/


function googlePieIt(imgObj, pieValues, pieLabels, pieColors) {
    //  <img name="PieCalories" />
    var strAddress = "http://chart.apis.google.com/chart?cht=p3";
    strAddress += "&chd=t:" + pieValues.substr(0, pieValues.length - 1);
    strAddress += "&chs=195x65"
    strAddress += "&chl=" + pieLabels;
    strAddress += "&chco=" + pieColors.substr(0, pieColors.length - 1);
    imgObj.src = "";
    imgObj.src = strAddress;
}


function loadPieData(DateStart, DateEnd) {
    //Example URL: /Results/GetMyPiesJSON?dateStart=01.01.2006&dateEnd=01.01.2010
    $.getJSON(
            "/Results/GetMyPiesJSON",
            {
                dateStart: DateStart,
                dateEnd: DateEnd,
                user_id: $("#user_id").val()
            },
            function(jsonPies) {
                var pieLabels = "";
                var pieColors = "";
                var pieValuesTime = "", pieValuesDistance = "", pieValuesCalories = "";
                var TimeMax = 0;
                for (var k = 0; k < jsonPies.Partials.length; ++k) {

                    jsonPies.Partials[k].DistanceTotal =
                        jsonPies.Partials[k].DistanceTotal / jsonPies.Totals.DistanceTotal;
                    pieValuesDistance += (100 * jsonPies.Partials[k].DistanceTotal) + ",";

                    jsonPies.Partials[k].TimeTotal =
                        jsonPies.Partials[k].TimeTotal / jsonPies.Totals.TimeTotal;
                    pieValuesTime += 100 * jsonPies.Partials[k].TimeTotal + ",";

                    if (TimeMax < jsonPies.Partials[k].TimeTotal) {
                        TimeMax = jsonPies.Partials[k].TimeTotal;
                        globalMaxTypeStr = jsonPies.Partials[k].WType;
                    }

                    jsonPies.Partials[k].CaloriesTotal =
                        jsonPies.Partials[k].CaloriesTotal / jsonPies.Totals.CaloriesTotal;

                    pieValuesCalories += 100 * jsonPies.Partials[k].CaloriesTotal + ",";
                    
                    pieLabels += Math.round(100.0 * jsonPies.Partials[k].TimeTotal) + "%|";
                    //pieLabels
                    pieColors += workoutTypeColorByString(jsonPies.Partials[k].WType) + ",";
                }

                var hasChecked = false;
                for (workoutType in workoutLabel) {
                    if ($('#' + workoutType + ':checked').val() != null) {
                        hasChecked = true;
                        break;
                    }
                }
                if (!hasChecked) {
                    $('#' + workoutTypeByString(globalMaxTypeStr)).attr("checked", "checked")

                }
                checkboxesUpdate();
                googlePieIt(document.PieTime, pieValuesTime, pieLabels, pieColors);
                

            }
        );
}


/*********************************************/
/* Results page script                       */
/*********************************************/


var graphDataKeep = new Array();

function updateResults(dateStart, dateEnd) {
    delete graphDataKeep;
    graphDataKeep = new Array();
    var timeUnit = $("#timeUnit").val();
    loadTimelineGraphs(timeUnit, dateStart, dateEnd);
    loadPieData(dateStart, dateEnd);
    $("#slider-range").slider('values', 0, dateStart);
    $("#slider-range").slider('values', 1, dateEnd);
}

var globalUnitStrings = new Array();

function checkboxesUpdate() {
    globalWorkoutTypeList = [];
    var outChecked = $("#chk_cat_outdoor:checked").val() != null;
    var inChecked = $("#chk_cat_indoor:checked").val() != null;
    for (var workoutType in workoutLabel) {
        var catChecked = workoutType.split("_")[0] == "out" ? outChecked : inChecked;
        if ($('#' + workoutType + ':checked').val() != null && catChecked) { // workout type checked
            globalWorkoutTypeList[workoutType] = workoutType;
           
        }
    }
    graphMultiRedraw();
    updateTotalStats();
}

function updateTotalStats() {
    for (key in globalTotals) {
        //console.log(key);
        $("#Stat" + key).html(roundingForValue(globalTotals[key]) + " " + globalUnitStrings[key]);
    }
}

var lastMonth = function() {
    var today = new Date();
    var timestampRight = today.getTime() + 24 * 3600000;
    var timestampLeft = timestampRight - 33 * 24 * 3600000;
    updateResults(timestampLeft, timestampRight);
    updateSliderDates(timestampLeft, timestampRight);
    graphMultiRedraw();
    
}



var twoLetter = function(str) {
    if (str.length < 2) {
        return "0" + str;
    }
    return str;
}
var generateColor = function(number, max) {

    var mod1 = 3
    var mod2 = 5;
    var mod3 = 7;
    var r = Math.round(new Number((number % mod1) / (mod1 - 1) * 180)).toString(16);
    var g = Math.round(new Number((number % mod2) / (mod2 - 1) * 200)).toString(16);
    var b = Math.round(new Number((number % mod3) / (mod3 - 1) * 220)).toString(16);
    var rgb = twoLetter(r) + twoLetter(g) + twoLetter(b);
    //console.log(rgb);
    return rgb;
}

var initializeTypes = function() {
    var typeCheckboxes = $('.rs_checkbox');
    for (var k = 0; k < typeCheckboxes.length; ++k) {
        var typeId = typeCheckboxes[k].id;
        var Id = typeCheckboxes[k].id.split("_")[1];
        workoutLabel[typeId] = $.trim($("#typeName_" + typeId).html());
        workoutTypeColor[typeId] = generateColor(Id, typeCheckboxes.length);//"AA5522";
    }
    workoutTypeColor[1] = "2255AA";
    workoutTypeColor[2] = "6622AA";
    workoutTypeColor[3] = "22AA55";
    workoutTypeColor[4] = "779922";
    workoutTypeColor[5] = "AA5522";
    workoutTypeColor[6] = "777777";
}




var updateWorkoutTypes = function() {


}
var initCat = function() {
    if ($.cookies.get('type') == null) {
        $.cookies.set('type', { out: "true", ind: "true" })
    }
    $("#chk_cat_outdoor").attr("checked", $.cookies.get('type')["out"]);
    $("#chk_cat_indoor").attr("checked", $.cookies.get('type')["ind"]);
}
    var updateCookie = function() {
        $.cookies.set('type', { out: $("#cat_outdoor").hasClass("r_category_active"), ind: $("#cat_indoor").hasClass("r_category_active") });
    }

    var initType = function() {
    if ($.cookies.get('type')["out"]) {
        $("#cat_outdoor").addClass("r_category_active")
        $("#chk_cat_outdoor").attr("checked", true)
        $(".rs_workout_type_out").css("display", "block")
    }
    else {

        $("#chk_cat_outdoor").attr("checked", false);
        $(".checkout").attr('checked', false);
        $(".rs_workout_type_out").css("display", "none");
        checkboxesUpdate();
    }
    if ($.cookies.get('type')["ind"]) {
        $("#cat_indoor").addClass("r_category_active");
        $("#chk_cat_indoor").attr("checked", true);
        $(".rs_workout_type_in").css("display", "block");
    }
    else {

        $("#chk_cat_indoor").attr("checked", false);
        $(".checkin").attr('checked', false);
        $(".rs_workout_type_in").css("display", "none");
        checkboxesUpdate();
    }

}

$(document).ready(function() {

    initCat();
    initializeTypes();
    globalUnitStrings["TOT_DISTANCE"] = Convertor.DISTANCE_KM[$("#ms").val()];
    globalUnitStrings["AVG_SPEED"] = Convertor.SPEED[$("#ms").val()];
    globalUnitStrings["TOT_TIME"] = 'hrs';
    globalUnitStrings["TOT_CALORIES"] = Convertor.CALORIES;

    $("#distance_unit").html(Convertor.DISTANCE_KM[$("#ms").val()]);
    $("#speed_unit").html(Convertor.SPEED[$("#ms").val()]);

    var today = new Date();
    var timestampLeft = today.getTime();
    timestampLeft = timestampLeft - 365 * 24 * 3600000;
    var timestampRight = today.getTime();

    initSlider(updateResults);

    $('#tabs').tabs({
        show: function(event, ui) {
            //redrawGraphs(graphDataKeep);
            graphMultiRedraw();
        }
    });

    $("#dialog").dialog({
        autoOpen: false,
        bgiframe: true,
        modal: true,
        buttons: {
            Ok: function() {
                $(this).dialog('close');
            }
        }
    });
    //updateResults(timestampLeft, timestampRight);
    setLegendColors();
    $("#lastMonth").click(lastMonth);
    

    initType();

    $("#cat_outdoor").click(function() {

        if (!$("#cat_outdoor").hasClass("r_category_active")) {
            $("#cat_outdoor").addClass("r_category_active");
            $("#chk_cat_outdoor").attr("checked", true);
            $("#allTypeCheckboxes_out").show();
        }
        else {
            $("#cat_outdoor").removeClass("r_category_active");
            $("#chk_cat_outdoor").attr("checked", false);
            $(".checkout").attr('checked', false);
            $("#allTypeCheckboxes_out").hide();

        }
        checkboxesUpdate();
        updateCookie();
    });

    $("#cat_indoor").click(function() {
        if (!$("#cat_indoor").hasClass("r_category_active")) {
            $("#cat_indoor").addClass("r_category_active");
            $("#chk_cat_indoor").attr("checked", true);
            $("#allTypeCheckboxes_in").show();
        }
        else {
            $("#cat_indoor").removeClass("r_category_active");
            $("#chk_cat_indoor").attr("checked", false);
            $(".checkin").attr('checked', false);
            $("#allTypeCheckboxes_in").hide();
        }
        checkboxesUpdate();
        updateCookie();
    });
    lastMonth();

});

/* End results page script */

