﻿//#region variables

var exportAjaxErrorOccurred = false;
var exportRefreshLock = false;
var urlPrefix = "";
var exportPollingTimeMS = 10000;

//#endregion

//#region jQuery ready function

/* ===================================================
== The jQuery ready function. 
====================================================== */

$(document).ready(function () {
    // Grab the focus input if available.
    var focusInput = $('.focus-input');

    if (focusInput.length > 0) {
        // If it is available, focus it.
        focusInput.focus();

        // And add a keypress to it for the standard button.
        focusInput.bind('keypress', function (e) {
            if (e.keyCode == 13) {
                $('#btnGenerateReport').click();
            }
        });
    }
});

//#endregion

//#region Termology functions

/* ===================================================
== Termology functions.
====================================================== */

var TERMOLOGY =
{
    setUrlPrefix: function (siteUrlPrefix) {
        urlPrefix = siteUrlPrefix;
    },

    setExportPollingTimeMSPrefix: function (pollingMS) {
        exportPollingTimeMS = parseInt(pollingMS);
    },

    getReport: function (url) {
        var start = $("#Start");
        start.val(1);

        return TERMOLOGY.getStandardResponse(url);
    },

    getPage: function (url, pageNumber) {
        var numRows = $("#NumRows");
        var start = $("#Start");
        start.val(((pageNumber - 1) * parseInt(numRows.val())) + 1);

        return TERMOLOGY.getStandardResponse(url, { paging: true });
    },

    setPageSize: function (url, pageSize) {
        var numRows = $("#NumRows");
        numRows.val(pageSize);

        return TERMOLOGY.getStandardResponse(url, { paging: true });
    },

    getStandardResponse: function (url, options) {
        if ($("form").valid()) {
            var startDate = new Date();

            var spinner = $("#spinner");

            if (spinner.css("display") == "none") {
                spinner.show();

                var report = $("#report");
                var timeTaken = $("#timeTaken");
                var box = $(report.find(".box-body"));

                timeTaken.text("");

                if (options == undefined) {
                    timeTaken.text("");
                    report.empty();
                    report.hide();
                }
                else if (options.paging == true) {
                    box.animate({ opacity: 0.5 }, 100);
                }

                $.ajax({
                    type: "POST",
                    url: url,
                    data: $("form").formSerialize(),
                    success: function (data) {
                        var template = null;
                        var showHeader = undefined;

                        if (data.Status != "fail") {
                            template = $("#standardResponseTemplate");
                            showHeader = $("#btnShowHeader").hasClass("toggle-on");
                        }
                        else {
                            template = $("#errorResponseTemplate");
                        }

                        var reportNodes = $(template).tmpl(data, { url: url.replace("/GetResults", ""), ShowHeader: showHeader });

                        if (options == undefined) {
                            report.append(reportNodes).fadeIn();
                        }
                        else if (options.paging == true) {
                            box.empty();
                            var newBox = $(reportNodes.find(".box-body"));
                            box.append(newBox.children()).fadeIn();
                            box.animate({ opacity: 1 }, 100);
                        }

                        spinner.hide();

                        var endDate = new Date();
                        var timeDiff = new Date(endDate - startDate);

                        timeTaken.text("Request took " + TERMOLOGY.padZeros(timeDiff.getHours()) + ":" + TERMOLOGY.padZeros(timeDiff.getMinutes()) + ":" + TERMOLOGY.padZeros(timeDiff.getSeconds()) + "." + timeDiff.getMilliseconds());

                        TERMOLOGY.refreshImages();
                    },
                    error: function (msg, textStatus, errorThrown) {
                        ALERTS.setError("An error has occurred whilst trying to get results:\r\n\r\nError Message: " + msg.responseText + ", " + textStatus + ", " + errorThrown);
                    }
                });
            }

            return false;
        }
    },

    refreshImages: function () {
        var userGroupImage = $("#imgUserGroupUsed");
        TERMOLOGY.refreshImage(userGroupImage);

        var userSystemImage = $("#imgSystemUsed");

        if (userSystemImage != undefined) {
            TERMOLOGY.refreshImage(userSystemImage);
        }
    },

    refreshImage: function (image) {
        if (image.attr("original-src") == undefined) {
            image.attr("original-src", image.attr("src"));
        }

        image.attr('src', image.attr('original-src') + '?' + TERMOLOGY.guid());
    },

    guid: function () {
        var S4 = function () {
            return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
        };
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    },

    getUsersInGroup: function (userGroupId) {
        var template = $("#usersInGroupTemplate");
        var usersInGroupsDiv = $("#usersInGroups");
        var url = urlPrefix + "/UserGroup/ShowUsersInGroup"
        var postData = "userGroupId=" + userGroupId;

        $.ajax({
            type: "POST",
            url: url,
            data: postData,
            success: function (data) {
                usersInGroupsDiv.empty();
                var userTableRows = $(template).tmpl(data);
                usersInGroupsDiv.append(userTableRows);
                usersInGroupsDiv.utilities({ CalledMethod: "positionAlongside", Control: $("#userGroups"), Side: "right" });
            },
            error: function (msg, textStatus, errorThrown) {
                ALERTS.setError("An error has occurred whilst trying to get users in a group:\r\n\r\nError Message: " + msg.responseText + ", " + textStatus + ", " + errorThrown);
            }
        });
    },

    requestExport: function (url, totalNumResults) {
        if ($("form").valid()) {
            var focusField = $(".focus-input");
            var period = $("#Period");
            var date = $("#Date");
            var type = $(".navigation li.selected a").text();

            var focusValue = function () {
                if ($(".focus-input").get(0).tagName == "SELECT") {
                    return $(".focus-input option:selected").text();
                }

                return focusField.val();
            }

            var postData = focusField.attr("id") + "=" + focusField.val()
			+ "&Period=" + period.val()
			+ "&Date=" + $.datepicker.formatDate("yy-mm-dd", $("#Date").datepicker("getDate"))
			+ "&Start=1"
			+ "&NumRows=" + totalNumResults
            + "&RequestValue=" + focusValue();

            var requestObj = {
                url: url,
                postData: postData
            };

            TERMOLOGY.submitExport(requestObj);
        }

    },

    requestExportRerun: function (auditId, url) {
        var exportItem = $("#audit" + auditId);

        // Because we needto build the url prefix from scratch, remove any existing prefix.
        if (url.indexOf(urlPrefix) != -1) {
            url = url.replace(urlPrefix, "");
        }

        var requestValue = exportItem.find("td[data-requestvalue]").attr("data-requestvalue");
        var period = exportItem.find("td[data-period]").attr("data-period");
        var date = new Date();
        var type = exportItem.find("td[data-type]").attr("data-type");

        var requestType = function (type) {
            if (type == "Website Search Terms") {
                return "Domain";
            }
            if (type == "Industry") {
                return "IndustryId";
            }
            else {
                return "SearchTerm";
            }
        }

        var exportPrefix = function () {
            if (type == "Website Search Terms") {
                return "/WebsiteSearchTerms";
            }
            if (type == "Industry") {
                return "/IndustrySearchTerms";
            }
            if (type == "Search Term Downstream") {
                return "/SearchTermDownstream";
            }
            if (type == "Search Term Variations") {
                return "/SearchTermVariations";
            }
            if (type == "Keyword Variations") {
                return "/KeywordVariations";
            }
            else {
                return "";
            }
        }

        // Note: 50000 is used for NumRows as it's the maximum that Hitwise allows.
        var postData = requestType(type) + "=" + requestValue
			+ "&Period=" + period
			+ "&Date=" + TERMOLOGY.getDateString(date)
			+ "&Start=1"
			+ "&NumRows=50000"
            + "&RequestValue=" + requestValue;

        var requestObj = {
            url: urlPrefix + exportPrefix() + url,
            postData: postData
        };

        TERMOLOGY.submitExport(requestObj);
    },

    submitExport: function (obj) {
        var template = $("#exportResponseTemplate");

        $.ajax({
            type: "POST",
            url: obj.url,
            data: obj.postData,
            success: function (data) {
                if (data.Status != "fail") {
                    TERMOLOGY.convertDates(data);
                    var reportListItem = $(template).tmpl(data, { url: urlPrefix });
                    reportListItem.hide();

                    $("#exports").prepend(reportListItem);
                    reportListItem.slideDown();
                }
                else {
                    var item = $(document.createElement("li"));
                    item.text(data.Error);
                    item.hide();

                    $("#exports").prepend(item);
                    item.slideDown();
                }

                TERMOLOGY.refreshImages();
            },
            error: function (msg, textStatus, errorThrown) {
                ALERTS.setError("An error has occurred whilst trying to submit an export:\r\n\r\nError Message: " + msg.responseText + ", " + textStatus + ", " + errorThrown);
            }
        });

        return false;
    },

    getExports: function () {
        if (!exportAjaxErrorOccurred && !exportRefreshLock) {
            exportRefreshLock = true;

            $.ajax({
                type: "POST",
                url: urlPrefix + "/Export/GetExports",
                success: function (data) {
                    exportRefreshLock = false;

                    var exportBody = $("#exportBody");
                    var exports = $("#exports");
                    var firstLoad = false;

                    if (exportBody.find("ul").length == 0) {
                        exportBody.empty();
                        exports = $(document.createElement("ul"));
                        exports.attr("id", "exports");
                        exportBody.append(exports);
                        firstLoad = true;
                    }

                    var template = $("#exportResponseTemplate");

                    if (data.Status != "fail") {
                        if (firstLoad) {
                            for (var i = 0; i < data.length; i++) {
                                TERMOLOGY.convertDates(data[i]);
                                var reportListItem = $(template).tmpl(data[i], { url: urlPrefix });

                                exports.append(reportListItem);
                            }
                        }
                        else {
                            for (var i = 0; i < data.length; i++) {
                                var li = $("#audit" + data[i].AuditId);

                                TERMOLOGY.convertDates(data[i]);

                                if (li.attr("data-updated-time") != data[i].UpdatedDateTime) {
                                    if (data[i].HasResponse || data[i].Description.indexOf("Error") != -1) {
                                        li.attr("data-updated-time", data[i].UpdatedDateTime);
                                        var reportListItem = $(template).tmpl(data[i], { url: urlPrefix });
                                        li.replaceWith(reportListItem);
                                    }
                                }
                            }
                        }
                    }
                    else {
                        // TODO
                    }
                },
                error: function (msg, textStatus, errorThrown) {
                    exportRefreshLock = false;
                    exportAjaxErrorOccurred = true;
                    $("#exportErrors").show();
                    ALERTS.setError("An error has occurred whilst trying to refresh exports:\r\n\r\nError Message: " + msg.responseText + ", " + textStatus + ", " + errorThrown);
                }
            });
        }
    },

    convertDates: function (audit) {
        var createdDate = new Date(audit.CreatedDateTime.substr(audit.CreatedDateTime.indexOf("(") + 1, 13) - 0);
        audit.CreatedDateTime = TERMOLOGY.getDateString(createdDate, false);
        var updatedDate = new Date(audit.UpdatedDateTime.substr(audit.UpdatedDateTime.indexOf("(") + 1, 13) - 0);
        audit.UpdatedDateTime = TERMOLOGY.getDateString(updatedDate, false);
    },

    padZeros: function (number) {
        if (number < 10) {
            return "0" + number;
        }
        else {
            return number;
        }
    },

    expandCollapse: function (image) {
        var img = $(image);
        var box = $($(img.parent()).siblings());

        if (img.attr("src").indexOf("collapse.png") != -1) {
            box.slideUp();
            img.attr("src", urlPrefix + "/Content/Images/expand.png");
        }
        else {
            box.slideDown();
            img.attr("src", urlPrefix + "/Content/Images/collapse.png");
        }
    },

    toExcel: function (image, url, totalNumResults) {
        var img = $(image);

        var focusField = $(".focus-input");
        var period = $("#Period");
        var date = $("#Date");

        var postData = focusField.attr("id") + "=" + focusField.val()
			+ "&Period=" + period.val()
			+ "&Date=" + $.datepicker.formatDate("yy-mm-dd", $("#Date").datepicker("getDate"))
			+ "&Start=1"
			+ "&NumRows=" + totalNumResults;

        $.download(url, postData);
    },

    showHideReportHeader: function (button) {
        var btn = $(button);

        if (btn.hasClass("toggle-on")) {
            btn.removeClass("toggle-on");
            $("#headerInformation").hide();
        }
        else {
            $("#headerInformation").show();
            btn.addClass("toggle-on");
        }
    },

    getDateString: function (date) {
        var days = date.getDate();
        if (days < 10) {
            days = "0" + days;
        }

        var month = date.getMonth() + 1;
        if (month < 10) {
            month = "0" + month;
        }

        var year = date.getFullYear();

        var hours = date.getHours();
        if (hours < 10) {
            hours = "0" + hours;
        }

        var minutes = date.getMinutes();
        if (minutes < 10) {
            minutes = "0" + minutes;
        }

        var seconds = date.getSeconds();
        if (seconds < 10) {
            seconds = "0" + seconds;
        }

        var dateString = days + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds;

        return dateString;
    }
};

//#endregion

//#region Termology Admin functions

var TERMOLOGYADMIN =
{
    showHideRequestColumns: function (button) {
        var btn = $(button);
        var showHideCols = $(".can-hide");

        if (btn.hasClass("toggle-on")) {
            btn.removeClass("toggle-on");
            showHideCols.hide();
        }
        else {
            btn.addClass("toggle-on");
            showHideCols.show();
        }
    }
};

//#endregion

//#region Additional jQuery functions

/* ===================================================
== Additional jQuery functions
====================================================== */

// Added this to jQuery
jQuery.download = function (url, data, method) {
	//url and data options required
	if (url && data) {
		//data can be string of parameters or array/object
		data = typeof data == 'string' ? data : jQuery.param(data);
		//split params into form inputs
		var inputs = '';
		jQuery.each(data.split('&'), function () {
			var pair = this.split('=');
			inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
		});
		//send request
		jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
		.appendTo('body').submit().remove();
	};
};

//#endregion

//#region Alerts

/* ===================================================
== Alerts for termology.
====================================================== */

var ALERTS =
{
	setError: function (message) {
		this.hideAll();
		document.getElementById('error-text').innerHTML = message;
		$('#error').fadeIn('slow');
		setTimeout(function () {
			$('#error').fadeOut('slow');
		}, 5000);
	},

	setWarning: function (message) {
		this.hideAll();
		document.getElementById('warning-text').innerHTML = message;
		$('#warning').fadeIn('slow');
		setTimeout(function () {
			$('#warning').fadeOut('slow');
		}, 5000);
	},

	setConfirmation: function (message) {
		this.hideAll();
		document.getElementById('confirmation-text').innerHTML = message;
		$('#confirmation').fadeIn('slow');
		setTimeout(function () {
			$('#confirmation').fadeOut('slow');
		}, 5000);
	},

	hide: function (elementId) {
		$(elementId).fadeOut('slow');
	},

	hideAll: function () {
		$('#error').fadeOut('fast');
		$('#warning').fadeOut('fast');
		$('#confirmation').fadeOut('fast');
	}
}

//#endregion

