﻿

jQuery.fx.interval = 30;

var Idonix = {};

//
// do some browser sniffing to check supported features:
//
var userAgent = navigator.userAgent.toLowerCase();
$.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());
var version = 0;

Idonix.AnimationsLookBad = false;
Idonix.BrowserIsIE6 = false;
Idonix.BrowserIsIE7 = false;
Idonix.BrowserIsIE = false;
Idonix.BrowserIsChrome = false;
Idonix.BrowserIsSafari = false;
Idonix.BrowserIsFF = false;
Idonix.BrowserIsWebkit = false;

// Is this a version of IE?
if ($.browser.msie) {
    userAgent = $.browser.version;
    userAgent = userAgent.substring(0, userAgent.indexOf('.'));
    version = userAgent;
    Idonix.BrowserSupportsCSSTransitions = false;
    Idonix.BrowserSupportsBorderRadii = !(parseFloat(version) < 9.0);
    Idonix.AnimationsLookBad = (parseFloat(version) < 9.0);
    Idonix.BrowserIsIE6 = (parseFloat(version) < 7.0);
    Idonix.BrowserIsIE7 = (parseFloat(version) < 8.0);
    Idonix.BrowserIsIE = true;
}

// Is this a version of chrome?
else if ($.browser.chrome) {
    $.browser.safari = false;
    Idonix.BrowserSupportsCSSTransitions = true;
    Idonix.BrowserSupportsBorderRadii = true;
    Idonix.BrowserIsChrome = true;
    Idonix.BrowserIsWebkit = true
}

// Is this a version of safari?
else if ($.browser.safari) {
    userAgent = userAgent.substring(userAgent.indexOf('safari/') + 7);
    userAgent = userAgent.substring(0, userAgent.indexOf('.'));
    version = userAgent;
    Idonix.BrowserSupportsCSSTransitions = !(parseFloat(version) < 5.0);
    Idonix.BrowserSupportsBorderRadii = !(parseFloat(version) < 5.0);
    Idonix.BrowserIsSafari = true;
    Idonix.BrowserIsWebkit = true
}

// Is this a version of Mozilla?
else if ($.browser.mozilla) {
    var userAgent = navigator.userAgent.toLowerCase();
    //Is it Firefox?
    if (navigator.userAgent.toLowerCase().indexOf('firefox') != -1) {
        userAgent = userAgent.substring(userAgent.indexOf('firefox/') + 8);
        userAgent = userAgent.substring(0, userAgent.indexOf(' ('));
        version = userAgent;
        Idonix.BrowserSupportsCSSTransitions = !(parseFloat(version) < 3.7);
        Idonix.BrowserSupportsBorderRadii = !(parseFloat(version) < 3.0);
        Idonix.BrowserIsFF = true;
    }
}

// If its anything else then we don't support it so assume not
else {
    Idonix.BrowserSupportsCSSTransitions = false;
    Idonix.BrowserSupportsBorderRadii = false;
}

//
// Animate an attribute to a given value using either javascript animations or css transitions if they are supported
//
Idonix.AgnosticAnimate = function (selector, attribute, value, speed) {

    if (Idonix.BrowserSupportsCSSTransitions) {
        $(selector).css(attribute, value);
    }
    else {
        var props = {};
        props[attribute] = value;
        $(selector).animate(props, { queue: false, duration: speed });
    }

}

//
// Get the correct ga tracking code
//
Idonix.GetTrackingCode = function (url) {
    if (url.substring(24, 30) == 'idonix' || url.substring(23, 29) == 'idonix') {
        return 'UA-22681957-2';
    }
    else {
        return 'UA-1301871-1';
    }
}

var decrementSlider = {};
var incrementSlider = {};
var moveSlider = {};
//
// build category sliders from raw json and add sortitems function to slider changed events
//
Idonix.AddCustomisation = function (categoryGroups, categories, categoriesJSON, customisationString, disabled, catWeightingsTable, sortItems, editUrl, isMobile) {

    // initialise customisations:
    var customisations = {};

    var customisationSections = customisationString.split(',');
    for (var index in customisationSections) {
        var weightingSections = customisationSections[index].split('=');
        customisations[weightingSections[0]] = weightingSections[1];
    }

    var catGroupTemplate = "";

    moveSlider = function (id, newValue) {
        //var theBlob = $("#blob_" + id);
        //theBlob.css("left", 70 * newValue);

        Idonix.AgnosticAnimate("#blob_" + id, "left", (70 * newValue + 1), 300);

        setTimeout(function () {
            onCatGroupWeightingChanged(id, newValue);
        }, 350);
    }

    // slider template
    if (isMobile) {
        catGroupTemplate = function (name, id, weighting) {
            return "<tr><td><div id='slidersLoading' style='display:none'>Loading...</div></td></tr>" +
                   "<tr class='categoryRow'>" +
                        "<td class='categoryNameCell'>" +
                            name + ":" +
                        "</td>" +
            //"<td style='vertical-align:middle'>" +
            //    "<a class='sliderMinusButton' href='javascript:decrementSlider(" + id + ");' />" +
            //"</td>" +
                        "<td class='categoryWeightingCell'>" +
            //"<div id='catGroupSlider_" + id + "' class='catGroupWeightingSlider'></div>" +
            //"<div id='catGroupWeighting_" + id + "'></div>" +
                            "<div style='position:relative;height:32px;width:170px'>" +
                                "<div id='blob_" + id + "' style='left:" + (70 * (Math.round(weighting * 2)) / 2 + 1) + "px;-webkit-transition:left .3s ease-in;transition:left .3s ease-in;border-radius:15px;background:#F58233;position:absolute;height:30px;width:30px;top:1px;z-index:1'></div>" +
                                "<a style='background:white;border:solid 2px #E1DDCE;border-radius:15px;position:absolute;height:28px;width:28px;left:0px'   href='javascript:moveSlider(" + id + ", 0);'/>" +
                                "<a style='background:white;border:solid 2px #E1DDCE;border-radius:15px;position:absolute;height:28px;width:28px;left:35px'  href='javascript:moveSlider(" + id + ", 0.5);'/>" +
                                "<a style='background:white;border:solid 2px #E1DDCE;border-radius:15px;position:absolute;height:28px;width:28px;left:70px'  href='javascript:moveSlider(" + id + ", 1);'/>" +
                                "<a style='background:white;border:solid 2px #E1DDCE;border-radius:15px;position:absolute;height:28px;width:28px;left:105px' href='javascript:moveSlider(" + id + ", 1.5);'/>" +
                                "<a style='background:white;border:solid 2px #E1DDCE;border-radius:15px;position:absolute;height:28px;width:28px;left:140px' href='javascript:moveSlider(" + id + ", 2);'/>" +
                            "</div>" +
                        "</td>" +
            //"<td style='vertical-align:middle'>" +
            //    "<a class='sliderPlusButton' href='javascript:incrementSlider(" + id + ");' />" +
            //"</td>" +
                    "</tr>" +
                    "<tr>" +
                        "<td></td>" +
                        "<td colspan=2>" +
                            "<div class='subCatsRow' id='subCats_" + id + "'>" +
                                "<table><tbody class='subCats'></tbody></table>" +
                            "</div>" +
                        "</td>" +
                    "</tr>";
        }
    } else {
        catGroupTemplate = function (name, id, weighting) {
            return "<tr class='categoryRow'>" +
                        "<td><a id='showSubCats_" + id + "' href='javascript:toggleSubCats(" + id + ");'>+</a></td>" +
                        "<td class='categoryNameCell'>" +
                            "<a href='javascript:toggleSubCats(" + id + ");'>" + name + ":</a>" +
                        "</td>" +
                        "<td class='categoryWeightingCell'>" +
                            "<div id='catGroupSlider_" + id + "' class='catGroupWeightingSlider'></div>" +
                        "</td>" +
                    "</tr>" +
                    "<tr>" +
                        "<td></td>" +
                        "<td colspan=2>" +
                            "<div class='subCatsRow' id='subCats_" + id + "'>" +
                                "<table><tbody class='subCats'></tbody></table>" +
                            "</div>" +
                        "</td>" +
                    "</tr>";
        }
    }

    // Cached categories
    var categoryElements = {};

    //var eventDelayTime = 1000;
    //var eventCount = 0;

    decrementSlider = function (id) {
        //$("#slidersLoading").show("blind", {}, 100);
        var theSlider = $("#catGroupWeighting_" + id);
        var currentValue = parseFloat(theSlider.html().toString());
        if (currentValue >= 0.25) {
            theSlider.html((currentValue - 0.25).toString());
            onCatGroupWeightingChanged(id, currentValue - 0.25);
        }
        //$("#slidersLoading").hide();
    }

    incrementSlider = function (id) {
        //$("#slidersLoading").show("blind", {}, 100);
        var theSlider = $("#catGroupWeighting_" + id);
        var currentValue = parseFloat(theSlider.html().toString());
        if (currentValue <= 1.75) {
            theSlider.html((currentValue + 0.25).toString());
            onCatGroupWeightingChanged(id, currentValue + 0.25);
        }
        //$("#slidersLoading").hide();
    }

    // Top-level group slider changed events
    var onCatGroupWeightingChanged = function (id, value) {
        setTimeout(function () {
            categoryGroups[id].weighting = value;
        }, 1);

        // set weightings for all categories in this category group
        for (var catIndex in categories) {
            if (categories[catIndex].groupId == id) {
                categories[catIndex].weighting = value;
                categoryElements[catIndex].slider("option", "value", value);
            }
        }

        //eventCount++;

        //setTimeout(function () {
        //    eventCount--;
        //    if (eventCount == 0) {
        sortItems();
        //    }
        //}, eventDelayTime);
    }

    // Individual Slider changed events
    var onCatWeightingChanged = function (categoryId, catGroupId, value) {
        categories[categoryId].weighting = value;

        // find average of all categories in this category group and set group slider
        var totalWeighting = 0;
        var numWeightings = 0;

        var subCategoryList = categoryGroups[catGroupId].Categories;

        for (var catIndex in subCategoryList) {
            if (subCategoryList[catIndex].groupId == catGroupId) {
                totalWeighting += parseFloat(subCategoryList[catIndex].weighting);
                numWeightings++;
            }
        }

        // rounding to ensure it is in a multiple of .25 
        var avgWeighting = (Math.round((totalWeighting / numWeightings) * 4) / 4);

        if (!isMobile) {
            categoryElements[catGroupId].slider("option", "value", avgWeighting);
        }

        sortItems();
    }

    for (var catGroupIndex in categoriesJSON.data) {

        // Cache category groups by id
        var categoryGroup = categoriesJSON.data[catGroupIndex];
        categoryGroup.weighting = customisations[categoryGroup.Id] == undefined ? 1 : customisations[categoryGroup.Id];
        categoryGroups[categoryGroup.Id] = categoryGroup;

        // Create the group element
        var groupTemplate = $(catGroupTemplate(categoryGroup.Name, categoryGroup.Id, categoryGroup.weighting));


        if (!isMobile) {
            // Setup the slider
            groupTemplate.find("#catGroupSlider_" + categoryGroup.Id).slider({
                min: 0, max: 2, step: 0.25,
                value: categoryGroup.weighting,
                slide: function (source, ui) {
                    var sliderDiv = $(ui.handle).parent();
                    var id = sliderDiv.attr("id").split("_")[1];
                    setTimeout(function () {
                        onCatGroupWeightingChanged(id, ui.value);
                    }, 1);
                },
                disabled: disabled
            });
        } else {
            groupTemplate.find("#catGroupWeighting_" + categoryGroup.Id).html(categoryGroup.weighting);
            onCatGroupWeightingChanged(categoryGroup.Id, categoryGroup.weighting);
        }

        var subCats = groupTemplate.find(".subCats");

        for (var catIndex in categoryGroup.Categories) {

            // Cache categories by id
            var category = categoryGroup.Categories[catIndex];
            category.groupId = categoryGroup.Id;
            category.weighting = customisations[category.Id] == undefined ? 1 : customisations[category.Id];
            categories[category.Id] = category;

            subCats.append("<tr class='categoryRow'><td class='categoryNameCell'><a class='fancyBox empty' id='catLink_" + category.Id + "' href=#popUpCat_" + category.Id + ">" + category.Name + ":</a><div style='display:none'><div style='width:400px;height:350px;overflow:scroll;' id='popUpCat_" + category.Id + "'>Loading...</div></div></td><td class='categoryWeightingCell'><div id='catSlider_" + category.Id + "_" + category.groupId + "' class='catWeightingSlider'></div></td></tr>")

            if (!isMobile) {
                // Setup the slider
                subCats.find("#catSlider_" + category.Id + "_" + category.groupId).slider({
                    min: 0, max: 2, step: 0.25,
                    value: category.weighting,
                    slide: function (source, ui) {
                        var sliderDiv = $(ui.handle).parent();
                        var id = sliderDiv.attr("id").split("_")[1];
                        var groupId = sliderDiv.attr("id").split("_")[2];
                        onCatWeightingChanged(id, groupId, ui.value);
                    },
                    disabled: disabled
                });
            } else {
                onCatWeightingChanged(category.Id, category.groupId, category.weighting);
            }
        }

        catWeightingsTable.append(groupTemplate);
    }

    $(".fancyBox").fancybox({
        'type': 'inline',
        'transitionIn': 'fade',
        'transitionOut': 'fade',
        'speedIn': 600,
        'speedOut': 300,
        'overlayShow': false,
        'overlayShow': true
    });

    $(".fancyBox").each(function () {
        $(this).click(function () {
            var id = $(this).attr("id").split('_')[1];
            var container = $("#popUpCat_" + id);
            if ($(this).hasClass("empty")) {
                var text;
                $.ajax({
                    url: '/DesktopModules/Idonix/Reports/Ajax.asmx/GetCategoryText',
                    data: "portalId=0&categoryId=" + id,
                    dataType: 'xml',
                    success: function (data) {
                        text = $(data).text();
                        if (text == "") {
                            container.html("<div>no information is available for this category</div>")
                        } else {
                            container.html("<div>" + text + "</div>");
                        }
                        if (editUrl != "" && editUrl != undefined) {
                            container.append("<div><a href='" + editUrl + "?categoryId=" + id + "&categoryName=" + escape(categories[id].Name) + "'>[Edit Text]</div>");
                        }
                    },
                    error: function (data, status, error) {
                        text = "couldn't find information, please refresh and try again.";
                        container.html(text);
                        alert(error);
                    }
                });
                $(this).removeClass("empty");
            }
        })
    });

    // Cache elements
    for (var catGroupIndex in categoryGroups) {
        var categoryGroup = categoryGroups[catGroupIndex];
        categoryElements[categoryGroup.Id] = $("#catGroupSlider_" + categoryGroup.Id);
        for (var catIndex in categoryGroup.Categories) {
            var category = categoryGroup.Categories[catIndex];
            categoryElements[category.Id] = $("#catSlider_" + category.Id + "_" + categoryGroup.Id);
        }
    }

    $(".subCatsRow").hide();
}
// this needs to be outside the scope of the addcustomisation function:
//
var toggleSubCats = function (id) {

    var subCats = $("#subCats_" + id);

    var showSubCats = $("#showSubCats_" + id);

    if (subCats.is(":hidden")) {
        showSubCats.html("-");
    }
    else {
        showSubCats.html("+");
    }

    subCats.removeClass("subCatsRow");
    $.each($(".subCatsRow"), function (index, element) {
        if ($(element).is(":visible")) {
            $(element).hide("blind", "", 500);
            $("#" + "showSubCats_" + element.id.split('_')[1]).html("+");
        }
    });
    subCats.addClass("subCatsRow");

    subCats.slideToggle(500, null);
}



//
// Add 'send brickbat' and 'send bouquet' buttons and set up fancybox to contain email form and add to button click events
//
Idonix.AddBrickbatsAndBouquets = function (root, companyId, companyInfo, userInfo, disabled) {

    var bbInfo = {};

    $.ajax({
        url: root + '/DesktopModules/Idonix/CompanyInfo/Ajax.asmx/GetBBInfo',
        dataType: 'string',
        type: "POST",
        success: function (data) {
            bbInfo = $.parseJSON($(data).text());

            var brickbatBouquetArea = $("#" + companyId + "brickbatbouquet");

            var bbAreaHTML = '<a id="' + companyId + 'brickbat" class="fancybox" href="#' + companyId + 'brickbatbox"><input type=Button class="StandardButton" value="Send Brickbat" /></a><a id="' + companyId + 'bouquet" class="fancybox" href="#' + companyId + 'bouquetbox"><input type=Button class="StandardButton" value="Send Bouquet" /></a>' +
                                     '<div style="display:none">' +
                                         '<div id="' + companyId + 'brickbatbox" style="width:1000px">' +
                                            '<div class="brickbatbouquetText" style="width:30%;float:left;padding:10px;">' + Idonix.ConstructBBText(bbInfo.brickbatBlurb, companyInfo, userInfo).replace(/\n/g, "<br/>") +
                                            '</div>' +
                                            '<div class="brickbatform" style="width:auto;float:left;padding:10px">' +
                                                '<table>' +
                                                '<tbody>' +
                                                '<tr><th>To:</th><td>' + companyInfo.CompanyName + '</td></tr>';

            if (companyInfo.EmailAddress != "") { bbAreaHTML = bbAreaHTML + '<tr><th>EMail:</th><td class="emailTo">' + companyInfo.EmailAddress + '</td></tr>' }
            else { bbAreaHTML = bbAreaHTML + '<tr><th>EMail:</th><td class="emailTo">none specified</td></tr>' }

            bbAreaHTML = bbAreaHTML + '<tr><th>Subject:</th><td><textarea class="emailSubject" style="width:500px" name="subject">' + Idonix.ConstructBBText(bbInfo.brickbatEmailSubject, companyInfo, userInfo) + '</textarea></td></tr>' +
                                                '<tr><th>Message:</th><td><textarea class="emailBody" style="width:500px;height:400px" name="message">' + Idonix.ConstructBBText(bbInfo.brickbatEmailBody, companyInfo, userInfo) + '</textarea></td></tr>' +
                                                '<tr><th>From:</th><td class="emailFrom">' + userInfo.Email + '</td></tr>' +
                                                '<tr><th></th><td><input ' + (disabled ? 'disabled=disabled' : '') + ' class="chkCCtoself" type=checkbox />CC this email to yourself</td></tr>' +
                                                '<tr><th></th><td><input ' + (disabled ? 'disabled=disabled' : '') + ' type=button value="Send" class="StandardButton" onClick="javascript: Idonix.SendBrickBat(\'' + root + '\', \'' + companyId + '\', \'' + bbInfo.ecraEmail + '\');"/>' + (disabled ? 'Please sign in to use this feature</td>' : '</td>') + '</tr>' +
                                                '</tbody>' +
                                                '</table>' +
                                            '</div>' +
                                         '</div>' +
                                    '</div>' +
                                    '<div style="display:none">' +
                                         '<div id="' + companyId + 'bouquetbox" style="width:1000px">' +
                                            '<div class="brickbatbouquetText" style="width:30%;float:left;padding:10px;">' + Idonix.ConstructBBText(bbInfo.bouquetBlurb, companyInfo, userInfo).replace(/\n/g, "<br/>") +
                                            '</div>' +
                                            '<div class="bouquetform" style="width:auto;float:left;padding:10px">' +
                                                '<table>' +
                                                '<tbody>' +
                                                '<tr><th>To:</th><td>' + companyInfo.CompanyName + '</td></tr>';

            if (companyInfo.EmailAddress != "") { bbAreaHTML = bbAreaHTML + '<tr><th>EMail:</th><td class="emailTo">' + companyInfo.EmailAddress + '</td></tr>' }
            else { bbAreaHTML = bbAreaHTML + '<tr><th>EMail:</th><td class="emailTo">none specified</td></tr>' }

            bbAreaHTML = bbAreaHTML + '<tr><th>Subject:</th><td><textarea class="emailSubject" style="width:500px" name="subject">' + Idonix.ConstructBBText(bbInfo.bouquetEmailSubject, companyInfo, userInfo) + '</textarea></td></tr>' +
                                                '<tr><th>Message:</th><td><textarea class="emailBody" style="width:500px;height:400px" name="message">' + Idonix.ConstructBBText(bbInfo.bouquetEmailBody, companyInfo, userInfo) + '</textarea></td></tr>' +
                                                '<tr><th>From:</th><td class="emailFrom">' + userInfo.Email + '</td></tr>' +
                                                '<tr><th></th><td><input ' + (disabled ? 'disabled=disabled' : '') + ' class="chkCCtoself" type=checkbox name="chkCCtoself"/>CC this email to yourself</td></tr>' +
                                                '<tr><th></th><td><input ' + (disabled ? 'disabled=disabled' : '') + ' type=button value="Send" class="StandardButton" onClick="javascript: Idonix.SendBouquet(\'' + root + '\', \'' + companyId + '\', \'' + bbInfo.ecraEmail + '\');"/>' + (disabled ? 'Please sign in to use this feature</td>' : '</td>') + '</tr>' +
                                                '</tbody>' +
                                                '</table>' +
                                            '</div>' +
                                         '</div>' +
                                     '</div>';

            brickbatBouquetArea.html(bbAreaHTML);

            $("#" + companyId + "brickbat").fancybox({
                'type': 'inline',
                'transitionIn': 'elastic',
                'transitionOut': 'elastic',
                'speedIn': 600,
                'speedOut': 300,
                'overlayShow': false,
                'overlayShow': true
            });
            $("#" + companyId + "bouquet").fancybox({
                'type': 'inline',
                'transitionIn': 'elastic',
                'transitionOut': 'elastic',
                'speedIn': 600,
                'speedOut': 300,
                'overlayShow': false,
                'overlayShow': true
            });

        }
    });
}

Idonix.SendBrickBat = function (root, companyId, ecraEmail) {
    var targetForm = $("#" + companyId + "brickbatbox");

    var emailTo = targetForm.find(".brickbatform .emailTo").text();
    var emailFrom = targetForm.find(".brickbatform .emailFrom").text();
    var emailSubject = targetForm.find(".brickbatform .emailSubject").attr("value");
    var emailBody = targetForm.find(".brickbatform .emailBody").attr("value");

    if (emailTo = 'none specified') { emailTo = ecraEmail; }

    var ccToSelf = targetForm.find(".brickbatform .chkCCtoself").attr('checked');

    $.ajax({
        url: root + '/DesktopModules/Idonix/ScoreDetail/Ajax.asmx/SendEmail',
        data: '{ "companyId": "' + escape(companyId) + '", "fromAddress": "' + escape(emailFrom) + '", "toAddress": "' + escape(emailTo) + '", "subject": "' + escape(emailSubject) + '", "body": "' + escape(emailBody) + '", "ccToSelf": "' + ccToSelf + '", "ecraAddress": "' + escape(ecraEmail) + '" }',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: "POST",
        success: function (data) {
            alert("Email Sent!");
        },
        error: function () {
            alert("An error occurred!");
        }
    });
}

Idonix.SendBouquet = function (root, companyId, ecraEmail) {
    var targetForm = $("#" + companyId + "bouquetbox");

    var emailTo = targetForm.find(".bouquetform .emailTo").text();
    var emailFrom = targetForm.find(".bouquetform .emailFrom").text();
    var emailSubject = targetForm.find(".bouquetform .emailSubject").attr("value");
    var emailBody = targetForm.find(".bouquetform .emailBody").attr("value");

    if (emailTo = 'none specified') { emailTo = ecraEmail; }

    var ccToSelf = targetForm.find(".bouquetform .chkCCtoself").attr('checked');

    $.ajax({
        url: root + '/DesktopModules/Idonix/ScoreDetail/Ajax.asmx/SendEmail',
        data: '{ "companyId": "' + escape(companyId) + '", "fromAddress": "' + escape(emailFrom) + '", "toAddress": "' + escape(emailTo) + '", "subject": "' + escape(emailSubject) + '", "body": "' + escape(emailBody) + '", "ccToSelf": "' + ccToSelf + '", "ecraAddress": "' + escape(ecraEmail) + '" }',
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: "POST",
        success: function (data) {
            alert("Email Sent!");
        },
        error: function () {
            alert("An error occurred!");
        }
    });
}

Idonix.ConstructBBText = function (message, companyInfo, userInfo) {

    message = unescape(message.replace(/\+/g," "));

    message = message.replace("{CompanyName}", companyInfo.CompanyName);
    message = message.replace("{UserName}", userInfo.Name)

    var cats = "";
    for (var catIndex in companyInfo.CategoryScores) {
        cats += companyInfo.CategoryScores[catIndex].CategoryName + "\n";
    }

    message = message.replace("{Categories}", cats);
    return message;
}
