How to Implement autosave for every 15 mins if cart is modified

How to Implement autosave for every 15 mins if cart is modified

I have below jquery, where cart will be saved on a click of 'Save' and default session timeout is 90 minutes. But if cart is modified I want cart to be autosaved for every 15 minutes. if cart is not modified then after 90 minutes session is kicking out the user which is good. User can enter the cart using key board or number pad

var _currentInputMode = 'K';
var _sBgColorSelected = "#FFF6D3";
var _sBgColorUnSelected = "#FFFFF7";
var _dragStartCell;
var _dragEndCell;
var _dragStart = 0;
var _dragEnd = 0;
var _isDragging = false;
var _isCartModified = false;

$(document).ready(function () {

    // Prompt user before leaving the page if cart is modified.
    window.onbeforeunload = function () {
        if (_isCartModified) {
            return (ORDER_ENTRY_PAGE_UNLOAD_ERROR);
        }
    }

    window.setInterval(AutoSaveHandler, 60000); // this has to run for every 15 mins only when cart is //modified

    $('.btnAddToCart').click(buttonSaveHandler);
    $('.buttonNumberPad').click(buttonNumberPadHandler);
    $('.buttonKeyboard').click(buttonKeyboardHandler);

    // NumberPad related
    $('.calcbutton').click(buttonNumberPadCalcHandler);
    $('.calcbuttonClear').click(buttonNumberPadCalcClearHandler);
    $('.calcbuttonEnter').click(buttonNumberPadCalcEnterHandler);
    $('#dialogNumberPad').css('overflow', 'hidden');
    $("#dialogNumberPad").dialog(
            {
                autoOpen: false,
                modal: false,
                resizable: false,
                width: 225,
                close: function (event, ui) {
                    setInputTypeKeyboard();
                }
            }
        );

    $("#divWkTable").on("mouseup", mouseupHandlerDivWkTable);

    $(".wktableinputbox").on("change", wkchangeHandler);
    $(".wktableinputbox").keydown(function (event) {
        debugger;
        // Allow: backspace, delete, tab, escape, and enter
        if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
        // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
        // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
            // let it happen, don't do anything
            return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                event.preventDefault();
            }
        }
    });

    // Disable paste to avoid junk input by paste
    $('input.wktableinputbox').bind('paste', function (e) {
        e.preventDefault();
    });

    $(".calcText").keydown(function (event) {        
        // Allow: backspace, delete, tab, escape, and enter
        if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
        // Allow: Ctrl+A
                (event.keyCode == 65 && event.ctrlKey === true) ||
        // Allow: home, end, left, right
                (event.keyCode >= 35 && event.keyCode <= 39)) {
            // let it happen, don't do anything
            if (event.keyCode == 13) {
                buttonNumberPadCalcEnterHandler();
            }
            return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                event.preventDefault();
            }
        }
    });

    setAddToCartText();
    setTotalLabelsVisibility();
    setFocusToFirstWorksheetInput();
});

function setTotalLabelsVisibility() {
    var partCategoryID = parseInt($("#__PartCategoryID").val(), 10);
    if (isNaN(partCategoryID)) partCategoryID = 0;

    if (partCategoryID != 11001 && partCategoryID != 11004) {
        $(".lblSubjectMath").hide();
        $(".lblTotalValueMath").hide();
        $(".lblSubjectFrench").hide();
        $(".lblTotalValueFrench").hide();
        $(".lblSubjectSuffix").hide();
    }

    var maxWkAllowedCheck = parseInt($("#__MaxWkAllowedCheck").val(), 10);
    if (maxWkAllowedCheck == 0) {
        $(".lblMaxWkAllowedCaption").hide();
    }

}

function setFocusToFirstWorksheetInput() {
    $(".wktableinputbox").first().focus();
}

function nodeClickWK(partCategoryID) {    
    location.href = "order-wk.aspx?categoryid=" + partCategoryID + "&inputmode=" + _currentInputMode;
}

function wkchangeHandler(event) {
    //console.log("wkchangeHandler");
    //console.log($(this).attr('id'));
    calculateSubTotal(this.parentElement.parentElement);
    calculateTotal();
}

function buttonNumberPadHandler() {
    setInputTypeMouse();
}

function buttonKeyboardHandler() {
    setInputTypeKeyboard();
}

function setInputTypeMouse() {
    _currentInputMode = 'M';
    setInputTypeA();
    attachTableMouseEvents();
    $('.buttonNumberPad').hide();
    $("#dialogNumberPad").dialog("open");
}

function setInputTypeKeyboard() {
    _currentInputMode = 'K';
    $('.buttonNumberPad').show();
    $("#dialogNumberPad").dialog("close");
    $("#tblData td").removeClass('selected');
    detachTableMouseEvent();
    setInputTypeA();
}

function attachTableMouseEvents() {

    $("#tblData td").on("mouseup", mouseupHandler);
    $("#tblData td").on("mousedown", mousedownHandler);
    //$(window).on("mouseup", mouseupHandler);

}

function detachTableMouseEvent() {

    //$("#tblData").off();
    $("#tblData td").off("mouseup", mouseupHandler);
    $("#tblData td").off("mousedown", mousedownHandler);
    $("#tblData td").not('.wktablefirstcol').not('.wktablecolsubtotal').not('.wktablecolsubtotalfifthrow').not('.wktableheaderlevelcol').not('.wktableheadercol').not('.wktableheadersubtotalcol').off("mousemove", mousemoveHandler);

    //$(window).off("mouseup", mouseupHandler);

}

function mousedownHandler(e) {

    var allCells = $("#tblData td");
    _dragStart = allCells.index($(this));
    _dragStartCell = this;
    //console.log("mousedown - _dragStart: " + _dragStart.toString());

    _isDragging = true;

    if (typeof e.preventDefault != 'undefined') { e.preventDefault(); }
    document.documentElement.onselectstart = function () { return false; };

    $("#tblData td").not('.wktablefirstcol').not('.wktablecolsubtotal').not('.wktablecolsubtotalfifthrow').not('.wktableheaderlevelcol').not('.wktableheadercol').not('.wktableheadersubtotalcol').on("mousemove", mousemoveHandler);
}

function mousemoveHandler(e) {
    if (_isDragging) {
        var allCells = $("#tblData td");
        _dragEnd = allCells.index($(this));
        _dragEndCell = this;

        selectRange();
    }
}

function mouseupHandler(e) {

    var allCells = $("#tblData td");
    _dragEnd = allCells.index($(this));
    _dragEndCell = this;

    _isDragging = false;
    if (_dragEnd != 0) {
        selectRange();
    }

    document.documentElement.onselectstart = function () { return true; };

    $("#tblData td").not('.wktablefirstcol').not('.wktablecolsubtotal').not('.wktablecolsubtotalfifthrow').not('.wktableheaderlevelcol').not('.wktableheadercol').not('.wktableheadersubtotalcol').off("mousemove", mousemoveHandler);
}

function mouseupHandlerDivWkTable(e) {
    e.stopPropagation();
    if (_isDragging) {
        _isDragging = false;
        selectRange();
    }
}

function selectRange() {

    //console.log("selectRange...");

    $("#tblData td").removeClass('selected');
    if (typeof _dragStartCell != 'undefined' && typeof _dragEndCell != 'undefined') {

        //console.log(_dragEndCell);
        var rowIndexStart = _dragStartCell.parentElement.rowIndex;
        var rowIndexEnd = _dragEndCell.parentElement.rowIndex;
        var colIndexStart = _dragStartCell.cellIndex;
        var colIndexEnd = _dragEndCell.cellIndex;

        var rowFilterGt = -1;
        var rowFilterLt = -1;
        if (rowIndexStart > rowIndexEnd) {
            if (rowIndexEnd - 1 < 0) {
                rowFilterGt = 0;
                rowFilterLt = (rowIndexStart - rowIndexEnd);
            }
            else {
                rowFilterGt = rowIndexEnd - 1;
                rowFilterLt = (rowIndexStart - rowIndexEnd) + 1;
            }
        }
        else {
            rowFilterGt = rowIndexStart - 1;
            rowFilterLt = (rowIndexEnd - rowIndexStart) + 1;
        }

        var colFilterGt = -1;
        var colFilterLt = -1;
        if (colIndexStart > colIndexEnd) {
            if (colIndexEnd - 1 < 0) {
                colFilterGt = 0;
                colFilterLt = (colIndexStart - colIndexEnd);
            }
            else {
                colFilterGt = colIndexEnd - 1;
                colFilterLt = (colIndexStart - colIndexEnd) + 1;
            }
        }
        else {
            colFilterGt = colIndexStart - 1;
            colFilterLt = (colIndexEnd - colIndexStart) + 1;
        }

        var rowFilter = "#tblData tr:gt(" + rowFilterGt.toString() + "):lt(" + rowFilterLt.toString() + ")";
        var colFilter = "td:gt(" + colFilterGt.toString() + "):lt(" + colFilterLt.toString() + ")";

        $(rowFilter).each(function (index) {
            $(this).children(colFilter).not('.wktablefirstcol').not('.wktablecolsubtotal').not('.wktablecolsubtotalfifthrow').not('.wktableheaderlevelcol').not('.wktableheadercol').not('.wktableheadersubtotalcol').addClass('selected');
        });
    }
}

function setInputTypeA() {

    var rowCount = $('#tblData tr').not('.wktableheaderrow').not('.wktableheaderrow').length;
    //alert(rowCount);

    if (rowCount > 0) {
        if (_currentInputMode == 'K') {
            $(".wktabledivqty").each(function (index) {
                //console.log(index + ": " + $(this).attr('id') + " = " + $(this).text());

                var txtID = $(this).attr('id').replace('divQty', '#txtQty');
                var divVal = $.trim($(this).text());

                if ($.isNumeric(divVal)) {
                    $(txtID).val(divVal)
                }
                $(this).hide();
                $(txtID).css('display', 'block');
            });
        }
        else {
            $(".wktableinputbox").each(function (index) {
                //console.log(index + ": " + $(this).attr('id') + " = " + $(this).val());

                var divID = $(this).attr('id').replace('txtQty', '#divQty');
                var txtVal = $.trim($(this).val());

                if ($.isNumeric(txtVal)) {
                    $(divID).text(txtVal)
                }
                $(this).hide();
                $(divID).css('display', 'block');
            });
        }
    }
}

function buttonNumberPadCalcHandler() {
    var sNumber = $('#txtKeyPad').val().replace(' ', '');
    if (sNumber.length == 0 || $.isNumeric(sNumber)) {
        if (sNumber.length < 5) {
            sNumber += $(this).val();
            $('#txtKeyPad').val(sNumber);
        }
    }
}

function buttonNumberPadCalcClearHandler() {
    $('#txtKeyPad').val('')
}

function buttonNumberPadCalcEnterHandler() {
    // Get the value entered in the txt box
    var num = $('#txtKeyPad').val();
    setWkTableCellValues(num);
}

function setWkTableCellValues(num) {

    var wkValue = parseInt(num, 10);

    //<td class="wktabledatafifthcol" id="tdQtyWK-EM-7A-041"><div class="wktabledivqty" id="divQtyWK-EM-7A-041" style="display:none">&nbsp;</div><input type="text" id="txtQtyWK-EM-7A-041" name="txtQtyWK-EM-7A-041" class="wktableinputbox" value="" maxlength="5" size="1" style="display:block" /></td>
    if ($.isNumeric(wkValue)) {
        var txtVal = wkValue > 0 ? wkValue.toString() : "";

        var rowArray = [];

        $("#tblData td.selected").each(function (index) {
            $(this).children(".wktabledivqty").text(txtVal);
            $(this).children(".wktableinputbox").val(txtVal);

            // Add row to array
            var trId = $(this.parentElement).attr('id');
            if ($.inArray("#" + trId, rowArray) == -1) {
                rowArray.push("#" + trId);
            }
        });

        var subTotal = 0;
        $.each(rowArray, function (index, value) {
            var tr = $(value);
            calculateSubTotal(tr);
        });

        calculateTotal();
    }
}

function calculateSubTotal(tr) {
    var subTotal = 0;
    var qty = 0;
    $(tr).children("td").not('.wktablefirstcol').not('.wktablecolsubtotal').not('.wktablecolsubtotalfifthrow').not('.wktableheaderlevelcol').not('.wktableheadercol').not('.wktableheadersubtotalcol').each(function (index) {
        var wkValue = parseInt($(this).children(".wktableinputbox").val(), 10);
        subTotal += wkValue || 0;
    });

    $(tr).children("td.wktablecolsubtotalfifthrow, td.wktablecolsubtotal").children("label").text(subTotal > 0 ? subTotal.toString() : "");

    return subTotal;
}

function calculateTotal() {
    var total = 0;
    var subTotal = 0;
    $('#tblData tr').not('.wktableheaderrow').not('.wktableheaderrow').each(function (index) {
        subTotal = parseInt($(this).children("td.wktablecolsubtotalfifthrow, td.wktablecolsubtotal").children("label").text(), 10);
        if (!isNaN(subTotal)) {
            total += subTotal;
        }
    });
    setTotalText(total);
    _isCartModified = true;
    return total;
}

function setTotalText(total) {
    if (!isNaN(total)) {
        $("#__WkTotal").val(total.toString());

        // VJ: Commented this line
        //$(".lblTotalValue").text(total > 0 ? total.toString() : "");

        // VJ: Added all the following lines
        var partCategoryID = parseInt($("#__PartCategoryID").val(), 10);
        if (isNaN(partCategoryID)) partCategoryID = 0;

        if (partCategoryID != 11001 && partCategoryID != 11004) {
            $(".lblTotalValue").text(total > 0 ? total.toString() : "");
        }
        else {
            var totalSubject2 = parseInt($("#__WkTotalSubject2").val(), 10);
            if (isNaN(totalSubject2)) totalSubject2 = 0;

            var totalMathFrench = total + totalSubject2;

            if (partCategoryID == 11001) {
                $(".lblTotalValueMath").text(total > 0 ? total.toString() : "");
            }
            else {
                $(".lblTotalValueFrench").text(total > 0 ? total.toString() : "");
            }
            $(".lblTotalValue").text(totalMathFrench > 0 ? totalMathFrench.toString() : "");
        }
    }
}

function setAddToCartText() {
    var wkTotal = parseInt($("#__WkTotal").val(), 10);
    if (isNaN(wkTotal)) wkTotal = 0;
    if (wkTotal > 0) {
        $(".btnAddToCart").text(ORDER_ENTRY_SAVE_CHANGES);
    }
    else {
        $(".btnAddToCart").text(ORDER_ENTRY_ADD_TO_CART);
    }
}

function validateWkTotal() {
    var bReturnValue = true;
    var maxWkAllowedCheck = parseInt($("#__MaxWkAllowedCheck").val(), 10);
    if (maxWkAllowedCheck != 0) {
        var wkLimitDetails = getWkLimitDetails();

        if (wkLimitDetails.maxWkAllowedGrace >= 0) {
            if (wkLimitDetails.wkTotal > wkLimitDetails.maxWkAllowedGrace) {
                alert(ORDER_ENTRY_WK_COUNT_ERROR1);
                bReturnValue = false;
            }
        }
    }
    return bReturnValue;
}

function getWkLimitDetails() {
    var wkTotal = parseInt($("#__WkTotal").val(), 10);
    if (isNaN(wkTotal)) wkTotal = 0;

    var wkTotalSubject2 = parseInt($("#__WkTotalSubject2").val(), 10);
    if (isNaN(wkTotalSubject2)) wkTotalSubject2 = 0;

    var maxWkAllowed = parseInt($("#__MaxWkAllowed").val(), 10);
    if (isNaN(maxWkAllowed)) maxWkAllowed = 0;

    var maxWkAllowedGrace = parseInt($("#__MaxWkAllowedGrace").val(), 10);
    if (isNaN(maxWkAllowedGrace)) maxWkAllowedGrace = 0;

    var wkLimitDetails = {
        maxWkAllowed: maxWkAllowed,
        maxWkAllowedGrace: maxWkAllowedGrace,
        wkTotal: wkTotal + wkTotalSubject2
    }
    return wkLimitDetails;
}

function buttonSaveHandler() {
    //alert("buttonSaveHandler...");

    var isWkTotalValid = validateWkTotal();

    if (!isWkTotalValid) {
        return;
    }

    var arCartItems = new Array();
    $(".wktableinputbox").each(function (index) {
        //console.log(index + ": " + $(this).attr('id') + " = " + $(this).val());

        var partID = $(this).attr('id').replace('txtQty', '');
        var partNumber = $(this).attr('name').replace('txtQty', '');
        var txtVal = $.trim($(this).val());

        if ($.isNumeric(txtVal)) {
            var qty = parseInt(txtVal, 10)

            if (qty > 0) {
                arCartItems.push({
                    "PartID": partID,
                    "Qty": qty
                });

            }
        }
    });

    var partCategoryID = parseInt($("#__PartCategoryID").val(), 10);
    if (isNaN(partCategoryID)) partCategoryID = 0;

    if (arCartItems.length > 0) {
        var params = {
            partCategoryID: partCategoryID,
            lstCartItem: arCartItems
        };

        var beforeSaveCartItemCount = parseInt($(".headerCartItemCount").val(), 10);

        callWebService('SaveCartItems', params, false, true, ajaxFailureHandlerCartSave, function (data) {
            var msg = "";
            if (data == null) {
                alert(ORDER_ENTRY_SAVE_FAIL);
            }
            else {
                alert(beforeSaveCartItemCount == 0 ? ORDER_ENTRY_SAVE_CART_DURATION_ALERT : ORDER_ENTRY_SAVE_SUCCESS);
                _isCartModified = false;
                $("#__WkTotalLastSaved").val($("#__WkTotal").val())
                $(".headerCartItemCount").val(data.ItemCount);

                setAddToCartText();
            }
        });
    }
    else {
        var wkTotalLastSaved = parseInt($("#__WkTotalLastSaved").val(), 10);
        if (isNaN(wkTotalLastSaved)) wkTotalLastSaved = 0;
        if (wkTotalLastSaved > 0) {
            if (partCategoryID > 0) {
                var params = {
                    partCategoryID: $("#__PartCategoryID").val()
                };

                callWebService('DeleteCartItemsByPartCategory', params, false, true, ajaxFailureHandlerCartSave, function (data) {
                    var msg = "";
                    if (data == null) {
                        alert(ORDER_ENTRY_SAVE_FAIL);
                    }
                    else {
                        alert(ORDER_ENTRY_SAVE_SUCCESS);
                        _isCartModified = false;
                        $("#__WkTotalLastSaved").val($("#__WkTotal").val())
                        $(".headerCartItemCount").val(data.ItemCount);

                        setAddToCartText();
                    }
                });
            }
        }
        else {
            alert(ORDER_ENTRY_SHOPPING_CART_EMPTY);
        }
    }
}

ajaxFailureHandlerCartSave = function (xhr, status, error) {
    if (xhr != null) {
        var r = jQuery.parseJSON(xhr.responseText);
        var n = r.Message.localeCompare("Thread was being aborted.");
        _isCartModified = false;

        if (n != 0)
            alert(r.Message);
        else
            alert("Session expired, your un-saved work will not be saved, Please re-login.");                    
        
        window.location.assign("login.aspx")
    }
}

function AutoSaveHandler() {
    alert("AutoSaveHandler...");

    var isWkTotalValid = validateWkTotal();

    if (!isWkTotalValid) {
        return;
    }

    var arCartItems = new Array();
    $(".wktableinputbox").each(function (index) {
        //console.log(index + ": " + $(this).attr('id') + " = " + $(this).val());

        var partID = $(this).attr('id').replace('txtQty', '');
        var partNumber = $(this).attr('name').replace('txtQty', '');
        var txtVal = $.trim($(this).val());

        if ($.isNumeric(txtVal)) {
            var qty = parseInt(txtVal, 10)

            if (qty > 0) {
                arCartItems.push({
                    "PartID": partID,
                    "Qty": qty
                });

            }
        }
    });

    var partCategoryID = parseInt($("#__PartCategoryID").val(), 10);
    if (isNaN(partCategoryID)) partCategoryID = 0;

    if (arCartItems.length > 0) {
        var params = {
            partCategoryID: partCategoryID,
            lstCartItem: arCartItems
        };

        var beforeSaveCartItemCount = parseInt($(".headerCartItemCount").val(), 10);

        callWebService('SaveCartItems', params, false, true, ajaxFailureHandlerCartSave, function (data) {
            var msg = "";
            if (data == null) {
                alert(ORDER_ENTRY_SAVE_FAIL);
            }
            else {
                //alert(beforeSaveCartItemCount == 0 ? ORDER_ENTRY_SAVE_CART_DURATION_ALERT : ORDER_ENTRY_SAVE_SUCCESS);

                if (beforeSaveCartItemCount == 0) {
                    alert(ORDER_ENTRY_SAVE_CART_DURATION_ALERT);
                }

                var currentDate = new Date();
                var day = currentDate.getDate();
                var month = currentDate.getMonth() + 1;
                var year = currentDate.getFullYear();

                var currentTime = new Date()
                var hours = currentTime.getHours()
                var minutes = currentTime.getMinutes()

                if (minutes < 10)
                    minutes = "0" + minutes
                                    
                $(".btnautosavetimestamp").text("Last auto-saved: " + day + "/" + month + "/" + year + " " + hours + ":" + minutes);

                _isCartModified = false;
                $("#__WkTotalLastSaved").val($("#__WkTotal").val())
                $(".headerCartItemCount").val(data.ItemCount);

                setAddToCartText();
            }
        });
    }
    else {
        var wkTotalLastSaved = parseInt($("#__WkTotalLastSaved").val(), 10);
        if (isNaN(wkTotalLastSaved)) wkTotalLastSaved = 0;
        if (wkTotalLastSaved > 0) {
            if (partCategoryID > 0) {
                var params = {
                    partCategoryID: $("#__PartCategoryID").val()
                };

                callWebService('DeleteCartItemsByPartCategory', params, false, true, ajaxFailureHandlerCartSave, function (data) {
                    var msg = "";
                    if (data == null) {
                        alert(ORDER_ENTRY_SAVE_FAIL);
                    }
                    else {
                      //  alert(ORDER_ENTRY_SAVE_SUCCESS);
                        _isCartModified = false;
                        
                        $("#__WkTotalLastSaved").val($("#__WkTotal").val())
                        $(".headerCartItemCount").val(data.ItemCount);

                        setAddToCartText();
                    }
                });
            }
        }
        else {
            alert(ORDER_ENTRY_SHOPPING_CART_EMPTY);
        }
    }
}

ajaxFailureHandlerCartSave = function (xhr, status, error) {
    if (xhr != null) {
        var r = jQuery.parseJSON(xhr.responseText);
        var n = r.Message.localeCompare("Thread was being aborted.");
        _isCartModified = false;

        if (n != 0)
            alert(r.Message);
        else
            alert("Session expired, your un-saved work will not be saved, Please re-login.");

        window.location.assign("login.aspx")
    }
}