var ajaxUrl = '/wordpress/wp-admin/admin-ajax.php';
var Charts;
var SavingsCalc = new Object();
SavingsCalc.error = new Object();
SavingsCalc.error.cap = false;
SavingsCalc.error.perf = false;

function doCalc() {
    
    var results = null;
    var data = {
        'action': 'savings_calculator',
        'tb': SavingsCalc.inputs.cap,
        'ops': SavingsCalc.inputs.perf
    };
    
    $.ajax({
        url:ajaxUrl,
        type:'POST',
        data:data,
        success:function(response)
        {
            results = $.parseJSON(response);
            if(results !== null && results !== -1)
            {
                // Branded NAS
                SavingsCalc.netapp = new Object();
                SavingsCalc.netapp.capital = results.netapp_capital;
                SavingsCalc.netapp.rackspace = results.netapp_rackspace;
                SavingsCalc.netapp.power = results.netapp_power;
                SavingsCalc.netapp.cooling = results.netapp_cooling;
                
                // Alacritech + Branded NAS
                SavingsCalc.alacnetapp = new Object();
                SavingsCalc.alacnetapp.capital = results.alacnetapp_capital;
                SavingsCalc.alacnetapp.rackspace = results.alacnetapp_rackspace;
                SavingsCalc.alacnetapp.power = results.alacnetapp_power;
                SavingsCalc.alacnetapp.cooling = results.alacnetapp_cooling;
                
                // Alacritech + Linux File Server
                SavingsCalc.alaclinux = new Object();
                SavingsCalc.alaclinux.capital = results.alaclinux_capital;
                SavingsCalc.alaclinux.rackspace = results.alaclinux_rackspace;
                SavingsCalc.alaclinux.power = results.alaclinux_power;
                SavingsCalc.alaclinux.cooling = results.alaclinux_cooling;
                
                Charts = new Array();
                Charts.push(SavingsCalc.netapp);
                Charts.push(SavingsCalc.alacnetapp);
                Charts.push(SavingsCalc.alaclinux);
                
                $("#sc_q").trigger("calccompleted");
            }else{
                alert('There was an error converting your results. Please try again.');
            }
        },
        error:function(response)
        {
            alert(response.responseText);
        }
    });
}

$(function() {
    $("#sc_q").submit( function () {
        SavingsCalc.inputs = new Object;
        SavingsCalc.inputs.cap = document.sc_q.sc_cap.value; // in terabytes
        SavingsCalc.inputs.perf = document.sc_q.sc_perf.value; // in operations per second     
        
        validateInputs();
        
        if (!SavingsCalc.error.cap && !SavingsCalc.error.perf) {
    
            logQuery();
    
            if (exists($("#sc_calc_results"))) {
                updateHTML();
            }
            else {  
                insertHTML();
            }
            removeOldWarnings();
        }
        else {
            addWarnings();
            removeOldWarnings();
        }
        return false;
    });
    
    hideInputValues();
});

function hideInputValues() {
    $("#sc_calc #sc_calc_wizard #sc_cap_row input").blur(function() {
        if ($(this).attr("value") == "") {
            $(this).attr("value", "10");
            $(this).addClass("default");
        }
    });
    $("#sc_calc #sc_calc_wizard #sc_cap_row input").focus(function() {
        $(this).attr("value", "");
        $(this).removeClass("default");
    });
    $("#sc_calc #sc_calc_wizard #sc_perf_row input").blur(function() {
        if ($(this).attr("value") == "") {
            $(this).attr("value", "70,000");
            $(this).addClass("default");
        }
    });
    $("#sc_calc #sc_calc_wizard #sc_perf_row input").focus(function() {
        $(this).attr("value", "");
        $(this).removeClass("default");
    });
}

function validateInputs() {
    sanitizeInputs();
    checkBounds();
    $("#sc_calc #sc_calc_wizard input").removeClass("default");
}

function logQuery() {
    var data = {
        'action': 'savings_calculator_history',
        'tb': SavingsCalc.inputs.cap,
        'ops': SavingsCalc.inputs.perf
    };
    $.ajax({
        url:ajaxUrl,
        type:'POST',
        data:data,
        success:function(response){}
    });
}

function insertHTML() {
    $("#sc_q").bind("calccompleted", function(){
        var results = makeResults();
        $(results).css("display", "none");
        $("#sc_calc_contact").css("display", "none");
        $("#sc_calc").append(results);
        $("#sc_calc_results").fadeIn(2500);
        
        var offset = $("#sc_calc_results .sc_calc_summary").offset();
        $("html, body").animate({ scrollTop: offset.top}, 1000);
    });
    
    doCalc();
}

function updateHTML() {
    $("#sc_q").bind("calccompleted", function(){
        var results = updateResults();
        $(results.p).css("display", "none");
        $(results.graphs).css("display", "none");
        $("#sc_calc_results .sc_calc_summary p:first").fadeOut(1000, function() {
            $(".sc_calc_summary p:first").replaceWith(results.p);
            $(".sc_calc_summary p:first").fadeIn(1500);
        });
        $("#sc_calc_graphs").fadeOut(1000, function() {
            $("#sc_calc_graphs").remove();
            $("#sc_calc_results").append(results.graphs);
            $("#sc_calc_graphs").fadeIn(1500);
        });
        
        var offset = $("#sc_calc_results .sc_calc_summary").offset();
        $("html, body").animate({ scrollTop: offset.top}, 1000);
    });
    
    doCalc();
}

function makeResults() {
    var results = $("<div id=\"sc_calc_results\"></div>");
    var summary = $("<div class=\"sc_calc_summary\">Annual Expense</div>");
    $(results).append(summary);
    $(results).append(makeGraphs());
    return results;
}

function updateResults() {
    var results = new Object();
    results.p = document.createElement("p");
    $(results.p).append("Annual Expense <span class=\"emem\">&ndash; shorter is better!</span>");
    results.graphs = makeGraphs();
    return results;
}

function makeGraphs() {
    var graph_types = [
        ["capital", "Capital Equipment"],
        ["power", "Power"],
        ["rackspace", "Rack Space"],
        ["cooling", "Cooling"]
    ];
    
    var graphs = document.createElement("div");
    graphs.className = "sc_calc_graphs";
    graphs.id = "sc_calc_graphs";
    
    var graph_height = 200;
    var intervals = 4;
    var intervals_gap = graph_height / intervals;
    var margins = 10;
    
    for (i=0;i<graph_types.length;i++)
    {
        // create elements and assign attributes
        var container = document.createElement("div");
        container.className = "sc_calc_graph_container";
        container.id = "sc_calc_graph_" + graph_types[i][0];
        
        var graph = document.createElement("div");
        graph.className = "sc_calc_graph";  
        
        // Position properties
        var max_value = getMaxHeight(graph_types[i][0]);
        var ratio = graph_height / max_value;
        
        // Draw the horizontal grid lines
        for (j = intervals; j >= 1; j--)
        {
            var lbl = max_value / j;
            var y = graph_height - intervals_gap * j;
            var v = intervals_gap * j / ratio;
            var gridline = document.createElement("div");
            $(gridline).attr('class','sc_calc_gridline');
            $(gridline).css({"top": y + 60});
            $(gridline).append("$" + addCommas(Math.round(v)));
            $(graph).append(gridline);
        }
        
        // Title on top of graph
        var title = document.createElement("h3");
        title.className = "sc_calc_graph_title";
        $(title).append(graph_types[i][1]);
        
        $(graph).append(title);
        
        for(c = 0; c < Charts.length; c++)
        {
            var chartValue = Charts[c][graph_types[i][0]];
            var cheight = parseInt(chartValue * ratio);
            var col = document.createElement("div");
            $(col).attr('class','sc_calc_graph_col_' + (c + 1) + ' sc_calc_graph_col sc_calc_tip');
            $(col).attr('title', '$' + addCommas(chartValue));
            $(col).animate({"height": cheight}, 2000);
            
            // Add to the graph
            $(graph).append(col);
        }
        
        $(container).append(graph);
        $(graphs).append(container);
    }
    
    var legend = document.createElement("div");
    $(legend).attr('id','sc_calc_legend');
    $(legend).append('<div class="legendbox netapp"></div><div class="legendtitle">Branded NAS</div>');
    $(legend).append('<div class="legendbox alacnetapp"></div><div class="legendtitle">Alacritech + Branded NAS</div>');
    $(legend).append('<div class="legendbox alaclinux"></div><div class="legendtitle">Alacritech + Linux File Server</div>');
    
    // Append legend to the end of the graphs
    $(graphs).append(legend);
    
    return graphs;
}

function getMaxHeight(graph) {
    var height = 0;
    for(x = 0; x < Charts.length; x++)
    {
        var h = parseInt(Charts[x][graph]);
        if(h > height) height = h;
    }
    return height;
}

function exists(el) {
    if ($(el).length > 0) return true;
    else return false;
}

function sanitizeInputs() {
    // remove anything that is not a digit or decimal
    var pattern = /[^\d\.]*/g;
    SavingsCalc.inputs.cap = SavingsCalc.inputs.cap.replace(pattern, "");
    SavingsCalc.inputs.perf = SavingsCalc.inputs.perf.replace(pattern, "");
    updateInputs();
}

function updateInputs() {
    document.sc_q.sc_cap.value = addCommas(SavingsCalc.inputs.cap); // in terabytes
    document.sc_q.sc_perf.value = addCommas(SavingsCalc.inputs.perf); // in operations per second          
}

function checkBounds() {
    pattern = /\./;
    var str = SavingsCalc.inputs.cap;
    var cap = str.split(pattern);
    
    if (SavingsCalc.inputs.cap < 1 || SavingsCalc.inputs.cap > 24 || cap.length > 2) {
        SavingsCalc.error.cap = true;
    }
    else {
        SavingsCalc.error.cap = false;
    }

    str = SavingsCalc.inputs.perf;
    var perf = str.split(pattern);
    if (SavingsCalc.inputs.perf < 1000 || SavingsCalc.inputs.perf > 100000 || perf.length > 2) {
        SavingsCalc.error.perf = true;
    }
    else {
        SavingsCalc.error.perf = false;
    }
}

function addWarnings() {
    if (SavingsCalc.error.cap) {
        if (!exists($("#sc_cap_row .sc_calc_msg"))) {
            $("#sc_cap_row").addClass("sc_calc_warning");
            $("#sc_cap_row").append("<span class=\"sc_calc_msg\">Please enter a number between 1 and 24</span>");
            $("#sc_cap_row .sc_calc_msg").fadeIn(1500);
        }
    }
    if (SavingsCalc.error.perf) {
        if (!exists($("#sc_perf_row .sc_calc_msg"))) {
            $("#sc_perf_row").addClass("sc_calc_warning");
            $("#sc_perf_row").append("<span class=\"sc_calc_msg\">Please enter a number between 1,000 and 100,000</span>");
            $("#sc_perf_row .sc_calc_msg").fadeIn(1500);
        }
    }
}

function removeOldWarnings() {
    if (!SavingsCalc.error.cap && exists($("#sc_cap_row .sc_calc_msg"))) {
        $("#sc_cap_row .sc_calc_msg").fadeOut("slow", function() {
            $("#sc_cap_row").removeClass("sc_calc_warning");
            $("#sc_cap_row .sc_calc_msg").remove();
        });
    }
    if (!SavingsCalc.error.perf && exists($("#sc_perf_row .sc_calc_msg"))) {
        $("#sc_perf_row .sc_calc_msg").fadeOut("slow", function() {
            $("#sc_perf_row").removeClass("sc_calc_warning");
            $("#sc_perf_row .sc_calc_msg").remove();
        });
    }
}

function addCommas(nStr)
{
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}
