﻿var customerOrderHistory = null;

$(document).ready(function() {
    var account = AjaxManager.Customer.getAccount();

    if (account === null) {
        document.location = "/Home/Signin.aspx";
        return;
    }

    showAccountWelcomeMessage();
    showAccountProfileControl(account);
    showAccountServiceProvided();

    showAccountProfileControl.subscribe(AjaxManager.Customer.onAccountUpdated);
    showAccountOrderHistoryControl.subscribe(AjaxManager.Customer.onGetOrderHistory);
    showAccountScheduledServicesControl.subscribe(AjaxManager.Customer.onGetOrderHistory);
    showAccountProfileDeleteButtons.subscribe(AjaxManager.Customer.onGetOrderHistory);

    if ($.cookie(SESSION_GUID, 'isReschedule') !== null) {
        showRescheduleConfirmation.subscribe(AjaxManager.Customer.onGetOrderHistory);
        $.cookie(SESSION_GUID, 'isReschedule', null);
    }

    if ($.cookie(SESSION_GUID, 'hasRecentOrderUpdate') !== null) {
        $('#pending_orders_note').show();
    }

    AjaxManager.Customer.getOrderHistory();
});

function showAccountWelcomeMessage() {
    if (document.referrer.match(/CreateAccount/i)) {
        $('#my_account_created_message').show();
    } else {
        if (document.referrer.match(/Signin/i)) {
            $('#existing_account_message h1').eq(0).text('Welcome Back!');
        }
        $('#existing_account_message').show();
    }
}

function showAccountCleanGuaranteeControl() {
    $('#my_account_clean_guarantees').show();
}

// My Profile Control //
function showAccountProfileControl(account) {
    $('#addAddressButton').bind('click', function() {
        document.location = '/Home/MyAccount/EditProfile.aspx?mode=addaddress';
        return false;
    });

    var accountDetails = buildAccountDetails(account);
    $('#account_details').empty().append(accountDetails);

    var addressBook = buildAccountAddressBook(account);
    $('#account_addressBook').empty().append(addressBook);

    $('#my_account_profile').show();
    resizeSidebar();
}

function showAccountProfileDeleteButtons() {
    $('.jq_actionButton').show();
}

function buildAccountDetails(account) {
    var detailsHtml = "<div class='account_details'>"
    detailsHtml += "<p>";
    detailsHtml += "<span>";
    detailsHtml += "<a class='jq_actionButton' style='display: none;' href='/Home/MyAccount/EditProfile.aspx'>Edit</a>";
    detailsHtml += "</span>";
    detailsHtml += buildAddressLineItem(account.Name, 'Name');
    detailsHtml += buildAddressLineItem(account.EmailAddress, 'Email');
    detailsHtml += '</div>';

    return detailsHtml;
}

function buildAccountAddressBook(account) {
    var addressHtml = "<div class='addressBook'>"
    for (var i = 0; i < account.AddressBook.length; i++) {
        var address = account.AddressBook[i];
        addressHtml += getAddressHTML(address, account.EmailAddress, (i + 1));
    }

    addressHtml += "</div>"

    return addressHtml;
}

function getAddressHTML(address, emailAddress, index) {
    if (address === null) {
        return '';
    }

    var addressHtml = "<div class='address_block'>";
    addressHtml += "<p>";
    addressHtml += "<span>";

    if (!address.isGuaranteedCustomer) {
        addressHtml += "<a href='#' class='jq_actionButton' style='display: none;' onclick='showEditConfirmation(" + address.AddressID + "); return false;'>Edit</a>";
        addressHtml += "<a href='#' class='jq_actionButton' style='display: none;' onclick='showDeleteConfirmation(" + address.AddressID + "); return false;'>Delete</a>";
    } else {
        addressHtml += "<a href='#' class='jq_actionButton' style='display: none;color:#00CD3F;font-style:italic;text-decoration:none;cursor:help;' " +
	               "onclick='return false;' title='This address is currently associated with an active guarantee'>Guaranteed</a>";
    }

    addressHtml += "</span>";
    addressHtml += buildAddressLineItem('<strong>' + address.FirstName + ' ' + address.LastName + '</strong>');
    addressHtml += "</p>";
    addressHtml += buildAddressLineItem(common.formatPhone(address.PhoneNumberOne), 'Phone');
    addressHtml += buildAddressLineItem(address.AddressLineOne + ' ' + address.AddressLineTwo);
    addressHtml += buildAddressLineItem(address.City + ', ' + address.State + ' ' + address.Zip);

    addressHtml += "</div>"

    return addressHtml;
}

function showEditConfirmation(addressID) {
    $('#edit_choice_link').attr('href', "/Home/MyAccount/EditProfile.aspx?aid=" + addressID + "&mode=editaddress");

    $('#edit_confirmation_popup').dialog({
        modal: true,
        resizable: false,
        minHeight: 100
    });

    return false;
}

function showDeleteConfirmation(addressID) {
    $('#delete_address_link').bind('click', function() {
        deleteAddress(addressID);
        $(this).unbind('click');
        return false;
    });

    $('#delete_confirmation_popup').dialog({
        modal: true,
        resizable: false,
        minHeight: 100
    });

    return false;
}

function closeEditConfirmation() {
    $('#edit_confirmation_popup').dialog('destroy');
    return false;
}

function closeDeleteConfirmation() {
    $('#delete_confirmation_popup').dialog('destroy');
    return false;
}

function buildAddressLineItem(value, caption) {
    if (value === null || value.length === 0) {
        return '';
    }
    if (caption) {
        caption = "<strong>" + caption + ": </strong>";
    } else {
        caption = '';
    }

    return "<p class='address_line'>" + caption + value + "</p>";
}

function deleteAddress(addressID) {
    var account = AjaxManager.Customer.getAccount();

    var address = account.getAddressByID(addressID);
    address.IsActive = false;

    closeDeleteConfirmation();
    AjaxManager.Customer.updateAccount(account);
    setTimeout(function() {
        showAccountProfileDeleteButtons();
    }, 1000);

    return false;
}

function showAccountServiceProvided() {
    $('#my_account_services_provided').show();
}

function hasOrderHistory(orderHistory) {
    var historyCount = 0;

    if (orderHistory === undefined || orderHistory === null) { //|| orderHistory.length === 0){
        return false;
    }

    for (var i in orderHistory) {
        if (orderHistory[i].Status !== 'O') {
            historyCount++;
        }
    }

    if (historyCount > 0) {
        return true;
    }
}

function hasOpenOrders(orderHistory) {
    var historyCount = 0;

    if (orderHistory === undefined || orderHistory === null) { //|| orderHistory.length === 0){
        return false;
    }

    for (var i in orderHistory) {
        if (orderHistory[i].Status === 'O') {
            historyCount++;
        }
    }

    if (historyCount > 0) {
        return true;
    }

}

// Schedule Services Control
function showAccountScheduledServicesControl(orderHistory) {
    var hasServices = false;
    customerOrderHistory = orderHistory;
    if (hasOpenOrders(orderHistory)) {
        var account = AjaxManager.Customer.getAccount();
        hasServices = buildCustomerScheduledServices(account, orderHistory);
    }
    else {
        $('#scheduled_service_body').empty();
    }
    $('#scheduled_service_container').show();

    if (!(hasServices)) {
        $('#no_visits_scheduled').show();
    }

    $('#scheduled_services_wait').hide();
    resizeSidebar();
}

function buildCustomerScheduledServices(account, orderHistory) {
    var hasServices = false;
    var html = '';
    var sortedOrders = orderHistory.sort(sortOrdersByScheduleDateDesc);
    var rescheduleOrderNumber = null;
    var rescheduleTimeSlot = null;
    if ($.cookie(SESSION_GUID, 'rescheduleTimeSlot') != null) {
        rescheduleOrderNumber = $.cookie(SESSION_GUID, 'rescheduleTimeSlot').split('|')[0];
        rescheduleTimeSlot = $.cookie(SESSION_GUID, 'rescheduleTimeSlot').split('|')[1];
    }

    for (var i = 0; i < sortedOrders.length; i++) {
        var order = sortedOrders[i];
        if (order.Status === 'O') {
            html += "<div class='scheduled_service_item'>";

            var orderShortDate = getShortScheduleDate(order.ScheduleDate);
            html += "<p><strong>Order Date: </strong>" + orderShortDate + "</p>";

            var arrivalWindow = null;
            if (rescheduleOrderNumber == order.OrderNumber) {
                arrivalWindow = rescheduleTimeSlot;
            }
            else {
                arrivalWindow = order.PMTimeSlotDescription;
            }

            html += "<p><strong>Arrival Window: </strong>" + arrivalWindow + "</p>";

            html += getScheduledServicesTableHeader();
            html += getScheduledServicesRows(order);

            html += '</table>';
            html += getScheduledServicesActions(order);
            html += '</div>';
            hasServices = true;
        }
    }
    $.cookie(SESSION_GUID, 'rescheduleTimeSlot', null)
    $('#scheduled_service_body').empty().append(html);
    return hasServices;
}

function sortOrdersByScheduleDateDesc(a, b) {
    var aDate = a.ScheduleDate;
    var bDate = b.ScheduleDate;
    if (aDate == bDate) {
        //make an attempt to sort different orders on the same date
        //there's no standardization across operations for time slot descriptions, so this is the best we can do
        var aTime = a.PMTimeSlotDescription.replace(".", "").toUpperCase();
        var bTime = b.PMTimeSlotDescription.replace(".", "").toUpperCase();
        if (aTime.indexOf("AM") >= 0 && bTime.indexOf("PM") >= 0) {
            return 1;
        }
        else if (aTime.indexOf("PM") >= 0 && bTime.indexOf("AM") >= 0) {
            return -1;
        }
        else {
            return 0;
        }
    }
    else {
        return ((aDate > bDate) ? -1 : ((aDate < bDate) ? 1 : 0));
    }
}

function getScheduledServicesTableHeader() {
    var tableHeader = "<table class='scheduled_services'>";
    tableHeader += "<colgroup><col width='120px'/><col width=*/></colgroup>";
    tableHeader += "<th align='left'>Service(s)</th>";
    tableHeader += "<th align='left'>Areas/Rooms</th>";
    tableHeader += "</tr>"

    return tableHeader;
}

function getScheduledServicesRows(order) {
    var serviceBreakDown = getServiceBreakDown(order);

    var rowsHtml = '';
    for (var service in serviceBreakDown) {
        rowsHtml += '<tr>';
        rowsHtml += "<td>" + service + "</td>";
        rowsHtml += "<td>" + serviceBreakDown[service] + "</td>";
        rowsHtml += '</tr>';
    }
    return rowsHtml;
}

//joe added to check if order is air duct
function getOrderType(order)
{
   for (var i in order.Details)
   {
       if (order.Details[i].ServiceID == 13 ||
           order.Details[i].ServiceID == 14 ||
           order.Details[i].ServiceID == 15 ||
           order.Details[i].ServiceID == 8)  return "DC";            
   }
   return "REG";
}

function isAirduct(order)
{
   if (getOrderType(order) == "DC") 
        return true;
   else
        return false;
}



function getScheduledServicesActions(order) {
    var scheduleDate = new Date(parseInt(order.ScheduleDate.replace(/\D/g, ''), 10));
    var html = "<div>";

   
    var otype = 0;
    if (isAirduct(order))
       oType = 2;
    else
       oType = 0;
    
    if (order.IsReschedulable) {
        html += "<span onclick=rescheduleOrder(" + order.OrderNumber + "," + order.CustomerID + "," + order.IsPortableJob + ",'" + order.PMCompanyCD + "','" + oType + "'); return false;>RESCHEDULE</span>";
    }
    if (order.IsCancelable) {
        html += "<span onclick=confirmCancelOrder(" + order.OrderNumber + "," + order.CustomerID + "," + scheduleDate.getTime() + ",'" + order.PMCompanyCD + "','" + oType + "'); return false;>CANCEL</span>";
    }

    html += "</div>";
    return html;
}

function rescheduleOrder(orderNumber, customerID, isPortable, companyCode, OrderType) {
    var customer = getSelectedCustomerInfo(customerID);
    if (customer != null) {
        $.cookie(SESSION_GUID, 'rescheduleCustomerInfo', JSON.stringify(customer), { async: false });
        $.cookie(SESSION_GUID, 'rescheduleOrderNumber', orderNumber, { async: false });
        $.cookie(SESSION_GUID, 'rescheduleIsPortable', JSON.stringify(isPortable), { async: false });
        $.cookie(SESSION_GUID, 'rescheduleCompanyCode', JSON.stringify(companyCode), { async: false });
        $.cookie(SESSION_GUID, 'rescheduleOrderType', OrderType, { async: false });
        location.href = "/Home/Schedule.aspx";
    }
}

function getSelectedCustomerInfo(customerID) {
    var selectedCustomer = null;
    var customer_request = {
        customerID: customerID
    };

    $.ajax({
        url: '/Service.asmx/GetCustomerByCustomerID',
        type: 'POST',
        async: false,
        datatype: 'json',
        timeout: 10000,
        data: JSON.stringify(customer_request),
        contentType: 'application/json; charset=utf-8',
        success: function(res) {
            selectedCustomer = JSON.parse(res);
        },
        error: error_response
    });
    return selectedCustomer;
}

function confirmCancelOrder(orderNumber, customerID, scheduleDate, companyCode) {
    var today = new Date();
    var one_day = 1000 * 60 * 60 * 24;
    var dateDiff = Math.ceil((scheduleDate - today.getTime()) / one_day);

    

    $('#cancel_service_yes').unbind();
    $('#cancel_service_yes').bind('click', function() {
        $('#visit_cancel_confirmation').hide();
        var customer = getSelectedCustomerInfo(customerID);
        if (customer != null) {
            openSaveQuoteDialog(customerID,customer.OperationID, orderNumber,companyCode);          
        }
        
    });

    $('#cancel_service_no').bind('click', hideCancelServiceDialog);
    $('#close_cancel_service_dialog').bind('click', hideCancelServiceDialog);

    $('#cancel_service_dialog').dialog({
        modal: true,
        resizable: false,
        width: 310,
        height: 185,
        minHeight: 70
    });
    
}

function openSaveQuoteDialog(customerID, operationID, orderNumber, companyCode) {
    $('#close_save_quote_dialog').bind('click', function() {hideSaveQuoteDialog();  hideCancelServiceDialog(); cancelOrder(orderNumber, operationID, companyCode)} );
    $('#save_quote_no').bind('click', function() {hideSaveQuoteDialog(); cancelOrder(orderNumber, operationID, companyCode); hideCancelServiceDialog();});
    $('#save_quote_yes').bind('click', function() {
        hideSaveQuoteDialog();
        saveQuote(customerID, orderNumber);
        cancelOrder(orderNumber, operationID, companyCode); 
        hideCancelServiceDialog;           
        $('#close_save_quote_confirmation').unbind();
        $('#close_save_quote_confirmation').bind('click', hideSaveQuoteConfirmDialog);
    });
    $('#save_quote_dialog').dialog({
        modal: true,
        resizable: false,
        width: 310,
        height: 185,
        minHeight: 70
    });
}

function saveQuote(customerID, orderNumber) {
    var account = AjaxManager.Customer.getAccount();
    var customer = getSelectedCustomerInfo(customerID);
    var territory = GetTerritoryByZipAndOperationId(customer);
    for (var i = 0; i < customerOrderHistory.length; i++) {
        if (customerOrderHistory[i].OrderNumber == orderNumber) {
            var orderDetails = customerOrderHistory[i].OrderDetailInfo;
        }
    }

    var save_quote_request = JSON.stringify({
        EmailAddress: account.EmailAddress,
        Order: { Territory: territory, OrderDetails: orderDetails }
    });

    $.ajax({
        url: '/Service.asmx/SaveQuote',
        type: 'POST',
        datatype: 'json',
        timeout: 10000,
        data: save_quote_request,
        contentType: 'application/json; charset=utf-8',
        success: function(res) {
            save_quote_response = JSON.parse(res);
            $('#save_quote_confirmation').dialog({
                modal: true,
                resizable: false,
                width: 310,
                minHeight: 70,
                height: 120
            });

            if (save_quote_response) {
                $('#save_quote_confirmation_text').text("Your selected items have been saved. To view your saved information at a later time, click the View Saved Quote link.");
            } else {
                $('#save_quote_confirmation_text').text("There was an error saving your order information.");
            }
        },
        error: error_response
    });
}

function GetOrderDetailsByOrderNumber(orderNumber) {
    var orderDetails = null;
    var order_request = {
        orderNumber: orderNumber
    };
    $.ajax({
        url: '/Service.asmx/GetOrderDetails',
        type: 'POST',
        async: false,
        datatype: 'json',
        timeout: 10000,
        data: JSON.stringify(order_request),
        contentType: 'application/json; charset=utf-8',
        success: function(res) {
            orderDetails = JSON.parse(res);
        },
        error: error_response
    });



    return orderDetails;
}

function GetTerritoryByZipAndOperationId(customer) {
    var selectedTerritory = null;
    var territory_request = {
        zipCode: customer.Zip,
        operationId: customer.OperationID
    };

    $.ajax({
        url: '/Service.asmx/GetTerritoryByZipAndOperationId',
        type: 'POST',
        async: false,
        datatype: 'json',
        timeout: 10000,
        data: JSON.stringify(territory_request),
        contentType: 'application/json; charset=utf-8',
        success: function(res) {
            selectedTerritory = JSON.parse(res);
        },
        error: error_response
    });
    return selectedTerritory;
}

function hideSaveQuoteDialog() {
    $('#save_quote_dialog').dialog('destroy');
}

function hideSaveQuoteConfirmDialog() {
    $('#save_quote_confirmation').dialog('destroy');
}

function hideCancelServiceDialog() {
    $('#cancel_service_dialog').dialog('destroy');
}

function hideUnableToCancelDialog() {
    $('#unable_to_cancel_dialog').dialog('destroy');
}

function cancelOrder(orderNumber, operationId, companyCode) {
    var cancel_request = {
        OperationId: operationId,
        OrderNumber: orderNumber,
        AccountInfo: AjaxManager.Customer.getAccount(),
        CompanyCode: companyCode
    };

    $.ajax({
        url: '/Service.asmx/CancelOrder',
        type: 'POST',
        async: true,
        datatype: 'json',
        timeout: 10000,
        data: JSON.stringify(cancel_request),
        contentType: 'application/json; charset=utf-8',
        success: function(res) {
            hideCancelServiceDialog();
            $.cookie(SESSION_GUID, 'hasRecentOrderUpdate', null);
            $('#pending_orders_note').show();
            $('#scheduled_service_container').hide();
            $('#scheduled_services_wait').show();
            showCancelConfirmation.subscribe(AjaxManager.Customer.onGetOrderHistory);
            AjaxManager.Customer.getOrderHistory();
        },
        error: error_response
    });
}

function showCancelConfirmation() {
    $('#schedule_message_text').text("Your service visit has been cancelled.");
    $('#schedule_message_text').show();
}

function showRescheduleConfirmation() {
    $('#schedule_message_text').text("Thank you! Your service visit has been rescheduled.");
    $('#schedule_message_text').show();
}

// Order History Control //
function showAccountOrderHistoryControl(orderHistory) {
    if (hasOrderHistory(orderHistory)) {
        $('#my_account_order_history p').eq(1).show();
        $('#history_disclaimer').show();
        var account = AjaxManager.Customer.getAccount();
        buildCustomersOrderHistory(account, orderHistory);
    } else {
        $('#my_account_order_history p').eq(0).show();
    }

    $('#order_history_wait').hide();
    resizeSidebar();
}

function buildCustomersOrderHistory(account, orderHistory) {
    var html = '';
    var previousCustomerID = 0;

    for (var i = 0; i < orderHistory.length; i++) {
        var order = orderHistory[i];
        if (order.Status === 'H') {
            if (previousCustomerID !== order.CustomerID) {

                //close previous address section
                if (previousCustomerID > 0) {
                    html += '</table>';
                    html += '</div>';
                }

                //start new address section
                var address = account.getAddressByID(order.CustomerID);
                html += "<div class='xsection_divider'>";
                html += '<div><strong>Service Address:</strong></div>';
                html += '<div>' + address.AddressLineOne + ' ' + address.City + ', ' + address.State + ' ' + address.Zip + '</div>';

                html += getOrderHistoryTableHeader();

                previousCustomerID = order.CustomerID;
            }

            html += getOrderHistoryRows(order, (i + 1));
        }
    }

    $('#order_history_container').append(html);
    $('#order_history_container table td.id_row:first').removeClass('order_start');
    $('#order_history_container').show();
}

function getOrderHistoryTableHeader() {
    var tableHeader = "<table class='order_history'>";
    tableHeader += "<colgroup><col width='90px'/><col width='100px'/><col width='\*'/></colgroup>";
    tableHeader += "<tr>";
    tableHeader += "<th>&nbsp;</th>";
    tableHeader += "<th align='left'>Service(s)</th>";
    tableHeader += "<th align='left'>Areas/Rooms</th>";
    tableHeader += "</tr>"

    return tableHeader;
}

function getOrderHistoryRows(order, orderCount) {

    var serviceBreakDown = getServiceBreakDown(order);

    var orderShortDate = getShortScheduleDate(order.ScheduleDate);

    var rowsHtml = '';
    rowsHtml += '<tr>';
    rowsHtml += "<td class='order_start id_row' align='left' rowspan=row_span_holder><div><strong>ORDER " + orderCount + "</strong></div><div>" + orderShortDate + "</div></td>";

    var rowCount = 0;
    for (var service in serviceBreakDown) {
        rowCount++;

        var tdClass = '';
        if (rowCount > 1) {
            rowsHtml += '<tr>';
        } else {
            tdClass = 'order_start';
        }

        rowsHtml += "<td class='" + tdClass + "'>" + service + "</td>";
        rowsHtml += "<td class='" + tdClass + "'>" + serviceBreakDown[service] + "</td>";
        rowsHtml += '</tr>';
    }

    if (rowCount === 0) {
        rowsHtml += '<td></td><td></td></tr>'
    } else {
        rowsHtml = rowsHtml.replace(/row_span_holder/g, rowCount);
    }
    return rowsHtml;
}

function getServiceBreakDown(order) {
    var orderDetails = order.OrderDetailInfo;
    var serviceBreakDown = {};

    for (var i = 0; i < orderDetails.length; i++) {
        var qty = (orderDetails[i].Quantity > 1) ? ' (' + orderDetails[i].Quantity + ')' : '';
        var split = (serviceBreakDown[orderDetails[i].ServiceDescription] === undefined) ? '' : ', ';
        var areaEntry = split + orderDetails[i].AreaDescription + qty;
        if (serviceBreakDown[orderDetails[i].ServiceDescription] === undefined) {
            serviceBreakDown[orderDetails[i].ServiceDescription] = areaEntry;
        } else {
            serviceBreakDown[orderDetails[i].ServiceDescription] += areaEntry;
        }
    }

    return serviceBreakDown;
}

function getShortScheduleDate(scheduleDate) {
    var scheduleDate = new Date(parseInt(scheduleDate.replace(/\D/g, ''), 10));
    return scheduleDate.toShortDateString();
}
