/*
 * AshAlom Gauge Meter.  Version 2.0.0
 * Copyright AshAlom.com  All rights reserved.
 * https://github.com/AshAlom/GaugeMeter <- Deleted!
 * https://github.com/githubsrinath/GaugeMeter <- Backup original.
 *
 * Original created by Dr Ash Alom
 *
 * This is a bug fixed and modified version of the AshAlom Gauge Meter.
 * Copyright 2018 Michael Wolf (Mictronics)
 * https://github.com/mictronics/GaugeMeter
 *
 */
!function ($) {
    $.fn.gaugeMeter = function (t) {
        var defaults = $.extend({
            id: "",
            percent: 0,
            used: null,
            min: null,
            total: null,
            size: 100,
            prepend: "",
            append: "",
            theme: "Red-Gold-Green",
            color: "",
            back: "RGBa(0,0,0,.06)",
            width: 3,
            style: "Full",
            stripe: "0",
            animationstep: 1,
            animate_gauge_colors: false,
            animate_text_colors: false,
            label: "",
            label_color: "Black",
            text: "",
            text_size: 0.22,
            fill: "",
            showvalue: false
        }, t);
        return this.each(function () {

            function getThemeColor(e) {
                var t = "#2C94E0";
                return e || (e = 1e-14),
                    "Red-Gold-Green" === option.theme && (e > 0 && (t = "#d90000"), e > 10 && (t = "#e32100"), e > 20 && (t = "#f35100"), e > 30 && (t = "#ff8700"), e > 40 && (t = "#ffb800"), e > 50 && (t = "#ffd900"), e > 60 && (t = "#dcd800"), e > 70 && (t = "#a6d900"), e > 80 && (t = "#69d900"), e > 90 && (t = "#32d900")),
                    "Green-Gold-Red" === option.theme && (e > 0 && (t = "#32d900"), e > 10 && (t = "#69d900"), e > 20 && (t = "#a6d900"), e > 30 && (t = "#dcd800"), e > 40 && (t = "#ffd900"), e > 50 && (t = "#ffb800"), e > 60 && (t = "#ff8700"), e > 70 && (t = "#f35100"), e > 80 && (t = "#e32100"), e > 90 && (t = "#d90000")),
                    "Green-Red" === option.theme && (e > 0 && (t = "#32d900"), e > 10 && (t = "#41c900"), e > 20 && (t = "#56b300"), e > 30 && (t = "#6f9900"), e > 40 && (t = "#8a7b00"), e > 50 && (t = "#a75e00"), e > 60 && (t = "#c24000"), e > 70 && (t = "#db2600"), e > 80 && (t = "#f01000"), e > 90 && (t = "#ff0000")),
                    "Red-Green" === option.theme && (e > 0 && (t = "#ff0000"), e > 10 && (t = "#f01000"), e > 20 && (t = "#db2600"), e > 30 && (t = "#c24000"), e > 40 && (t = "#a75e00"), e > 50 && (t = "#8a7b00"), e > 60 && (t = "#6f9900"), e > 70 && (t = "#56b300"), e > 80 && (t = "#41c900"), e > 90 && (t = "#32d900")),
                    "DarkBlue-LightBlue" === option.theme && (e > 0 && (t = "#2c94e0"), e > 10 && (t = "#2b96e1"), e > 20 && (t = "#2b99e4"), e > 30 && (t = "#2a9ce7"), e > 40 && (t = "#28a0e9"), e > 50 && (t = "#26a4ed"), e > 60 && (t = "#25a8f0"), e > 70 && (t = "#24acf3"), e > 80 && (t = "#23aff5"), e > 90 && (t = "#21b2f7")),
                    "LightBlue-DarkBlue" === option.theme && (e > 0 && (t = "#21b2f7"), e > 10 && (t = "#23aff5"), e > 20 && (t = "#24acf3"), e > 30 && (t = "#25a8f0"), e > 40 && (t = "#26a4ed"), e > 50 && (t = "#28a0e9"), e > 60 && (t = "#2a9ce7"), e > 70 && (t = "#2b99e4"), e > 80 && (t = "#2b96e1"), e > 90 && (t = "#2c94e0")),
                    "DarkRed-LightRed" === option.theme && (e > 0 && (t = "#d90000"), e > 10 && (t = "#dc0000"), e > 20 && (t = "#e00000"), e > 30 && (t = "#e40000"), e > 40 && (t = "#ea0000"), e > 50 && (t = "#ee0000"), e > 60 && (t = "#f30000"), e > 70 && (t = "#f90000"), e > 80 && (t = "#fc0000"), e > 90 && (t = "#ff0000")),
                    "LightRed-DarkRed" === option.theme && (e > 0 && (t = "#ff0000"), e > 10 && (t = "#fc0000"), e > 20 && (t = "#f90000"), e > 30 && (t = "#f30000"), e > 40 && (t = "#ee0000"), e > 50 && (t = "#ea0000"), e > 60 && (t = "#e40000"), e > 70 && (t = "#e00000"), e > 80 && (t = "#dc0000"), e > 90 && (t = "#d90000")),
                    "DarkGreen-LightGreen" === option.theme && (e > 0 && (t = "#32d900"), e > 10 && (t = "#33db00"), e > 20 && (t = "#34df00"), e > 30 && (t = "#34e200"), e > 40 && (t = "#36e700"), e > 50 && (t = "#37ec00"), e > 60 && (t = "#38f100"), e > 70 && (t = "#38f600"), e > 80 && (t = "#39f900"), e > 90 && (t = "#3afc00")),
                    "LightGreen-DarkGreen" === option.theme && (e > 0 && (t = "#3afc00"), e > 10 && (t = "#39f900"), e > 20 && (t = "#38f600"), e > 30 && (t = "#38f100"), e > 40 && (t = "#37ec00"), e > 50 && (t = "#36e700"), e > 60 && (t = "#34e200"), e > 70 && (t = "#34df00"), e > 80 && (t = "#33db00"), e > 90 && (t = "#32d900")),
                    "DarkGold-LightGold" === option.theme && (e > 0 && (t = "#ffb800"), e > 10 && (t = "#ffba00"), e > 20 && (t = "#ffbd00"), e > 30 && (t = "#ffc200"), e > 40 && (t = "#ffc600"), e > 50 && (t = "#ffcb00"), e > 60 && (t = "#ffcf00"), e > 70 && (t = "#ffd400"), e > 80 && (t = "#ffd600"), e > 90 && (t = "#ffd900")),
                    "LightGold-DarkGold" === option.theme && (e > 0 && (t = "#ffd900"), e > 10 && (t = "#ffd600"), e > 20 && (t = "#ffd400"), e > 30 && (t = "#ffcf00"), e > 40 && (t = "#ffcb00"), e > 50 && (t = "#ffc600"), e > 60 && (t = "#ffc200"), e > 70 && (t = "#ffbd00"), e > 80 && (t = "#ffba00"), e > 90 && (t = "#ffb800")),
                    "Voltage" === option.theme && (e <= 0 && (t = "#d90000"), e > 0 && (t = "#e32100"), e > 10 && (t = "#ffb800"), e > 20 && (t = "#dcd800"), e > 30 && (t = "#32d900"), e > 40 && (t = "#32d900"), e > 50 && (t = "#32d900"), e > 60 && (t = "#32d900"), e > 70 && (t = "#dcd800"), e > 80 && (t = "#ffb800"), e > 90 && (t = "#e32100"), e >= 100 && (t = "#d90000")),
                    "White" === option.theme && (t = "#fff"),
                    "Black" === option.theme && (t = "#000"),
                    t;
            };
            /* The label below gauge. */
            function createLabel(t, a) {
                if(t.children("b").length === 0){
                    $("<b></b>").appendTo(t).html(option.label).css({
                        "line-height": option.size + 5 * a + "px",
                        color: option.label_color
                    });
                }
            };
            /* Prepend and append text, the gauge text or percentage value. */
            function createSpanTag(t) {
                var fgcolor = "";
                if (option.animate_text_colors === true){
                    fgcolor = option.fgcolor;
                }
                var child = t.children("span");
                if(child.length !== 0){
                    child.html(r).css({color: fgcolor});
                    return;
                }
                if(option.text_size <= 0.0 || Number.isNaN(option.text_size)){
                    option.text_size = 0.22;
                }
                if(option.text_size > 0.5){
                    option.text_size = 0.5;
                }
                $("<span></span>").appendTo(t).html(r).css({
                    "line-height": option.size + "px",
                    "font-size": option.text_size * option.size + "px",
                    color: fgcolor
                });
            };
            /* Get data attributes as options from div tag. Fall back to defaults when not exists. */
            function getDataAttr(t) {
                $.each(dataAttr, function (index, element) {
                    if(t.data(element) !== undefined && t.data(element) !== null){
                        option[element] = t.data(element);
                    } else {
                        option[element] = $(defaults).attr(element);
                    }

                    if(element === "fill"){
                        s = option[element];
                    }

                    if((element === "size" ||
                        element === "width" ||
                        element === "animationstep" ||
                        element === "stripe"
                        ) && !Number.isInteger(option[element])){
                        option[element] = parseInt(option[element]);
                    }

                    if(element === "text_size"){
                        option[element] = parseFloat(option[element]);
                    }
                });
            };
            /* Draws the gauge. */
            function drawGauge(a) {
		        if(M < 0) M = 0;
                if(M > 100) M = 100;
                var lw = option.width < 1 || isNaN(option.width) ? option.size / 20 : option.width;
                g.clearRect(0, 0, b.width, b.height);
                g.beginPath();
                g.arc(m, v, x, G, k, !1);
                if(s){
                    g.fillStyle = option.fill;
                    g.fill();
                }
                g.lineWidth = lw;
                g.strokeStyle = option.back;
                option.stripe > parseInt(0) ? g.setLineDash([option.stripe], 1) : g.lineCap = "round";
                g.stroke();
                g.beginPath();
                g.arc(m, v, x, -I, P * a - I, !1);
                g.lineWidth = lw;
                g.strokeStyle = option.fgcolor;
                g.stroke();
                c > M && (M += z, requestAnimationFrame(function(){
                    drawGauge(Math.min(M, c) / 100);
                }, p));
            };

            $(this).attr("data-id", $(this).attr("id"));
            var r,
                dataAttr = ["percent",
                    "used",
                    "min",
                    "total",
                    "size",
                    "prepend",
                    "append",
                    "theme",
                    "color",
                    "back",
                    "width",
                    "style",
                    "stripe",
                    "animationstep",
                    "animate_gauge_colors",
                    "animate_text_colors",
                    "label",
                    "label_color",
                    "text",
                    "text_size",
                    "fill",
                    "showvalue"],
                option = {},
                c = 0,
                p = $(this),
                s = false;
            p.addClass("gaugeMeter");
            getDataAttr(p);

            if(Number.isInteger(option.used) && Number.isInteger(option.total)){
                var u = option.used;
                var t = option.total;
                if(Number.isInteger(option.min)) {
                    if(option.min < 0) {
                        t -= option.min;
                        u -= option.min;
                    }
                }
                c = u / (t / 100);
            } else {
                if(Number.isInteger(option.percent)){
                    c = option.percent;
                } else {
                    c = parseInt(defaults.percent);
                }
            }
            if(c < 0) c = 0;
            if(c > 100) c = 100;

            if( option.text !== "" && option.text !== null && option.text !== undefined){
                if(option.append !== "" && option.append !== null && option.append !== undefined){
                    r = option.text + "<u>" + option.append + "</u>";
                } else {
                    r = option.text;
                }
                if(option.prepend !== "" && option.prepend !== null && option.prepend !== undefined){
                    r = "<s>" + option.prepend + "</s>" + r;
                }
            } else {
                if(defaults.showvalue === true || option.showvalue === true){
                    r = option.used;
                } else {
                    r = c.toString();
                }
                if(option.prepend !== "" && option.prepend !== null && option.prepend !== undefined){
                    r = "<s>" + option.prepend + "</s>" + r;
                }

                if(option.append !== "" && option.append !== null && option.append !== undefined){
                    r = r + "<u>" + option.append + "</u>";
                }
            }

            option.fgcolor = getThemeColor(c);
            if(option.color !== "" && option.color !== null && option.color !== undefined){
                option.fgcolor = option.color;
            }

            if(option.animate_gauge_colors === true){
                option.fgcolor = getThemeColor(c);
            }
            createSpanTag(p);

            if(option.style !== "" && option.style !== null && option.style !== undefined){
                createLabel(p, option.size / 13);
            }

            $(this).width(option.size + "px");

            var b = $("<canvas></canvas>").attr({width: option.size, height: option.size}).get(0),
                    g = b.getContext("2d"),
                    m = b.width / 2,
                    v = b.height / 2,
                    _ = 360 * option.percent,
                    x = (_ * (Math.PI / 180), b.width / 2.5),
                    k = 2.3 * Math.PI,
                    G = 0,
                    M = 0 === option.animationstep ? c : 0,
                    z = Math.max(option.animationstep, 0),
                    P = 2 * Math.PI,
                    I = Math.PI / 2,
                    R = option.style;
            var child = $(this).children("canvas");
            if(child.length !== 0){
                /* Replace existing canvas when new percentage was written. */
                child.replaceWith(b);
            } else {
                /* Initially create canvas. */
                $(b).appendTo($(this));
            }

            if ("Semi" === R){
                k = 2 * Math.PI;
                G = 3.13;
                P = 1 * Math.PI;
                I = Math.PI / .996;
            }
            if ("Arch" === R){
                k = 2.195 * Math.PI;
                G = 1, G = 655.99999;
                P = 1.4 * Math.PI;
                I = Math.PI / .8335;
            }
            drawGauge(M / 100);
        });
    };
}
(jQuery);
