// document level 
var pfItem = [];
var pfOptCount = 0;
var pfDepth = 0;
var pfCurrentItemID = '';
var pfCurrentItemWindow = '';
var pfNextAction = '';
var pfOrderMethod = '';
var pfAddressChanged = false;
var pfFoundError = false;
var pfOrderStatusMap;
var pfOrderStatusMarker;
var pfOrderStatusStart;
var pfOrderStatusEnd;
var pfTipDollarStart;
var pfTipPercentStart;
var pfHotelID;
var pfNeedRoom = false;
var phCartHeight = 0;
var pfAddressListCount = 0;
var pfValidAddress = false;
var pfNeedItem = '';
var pfAlertAction = function () { };
var pfCartData = [];
var pfCartWarn5 = false;
var pfCartTimer;
var pfCartTimeLeft = 0;
var pfFixedHeaderHeight = 125;
var pfSpecialFormData = '';
var pfNeedCVV2Code = false;
var pfPaymentLabelToEdit;
var pfAddressEmpty = false;
var pfAddressConfirmed = false;
var remoteFrameHeight = 0;



$(window).resize(function () {
    var yy = $("#pfMainContent").height();
    var bodypad = parseInt($('body').css('padding-top'));
    var xx = $(window).height() - bodypad - parseInt($("#pfMainHeader").css("height")) - parseInt($("#pfMainFooter").css("height"));
    if (yy < xx) {
        $("#pfMainContent").css('min-height', xx + 'px');
        try { $("#iFrameWrapper").css('height', xx + 'px'); } catch (err) { }
    }


    try { if (yy < (xx - 50)) { $("#pfMainContainer").css('min-height', (xx - 50) + 'px'); } } catch (err) { }
    try { shoppingCart.style.position = 'inherit'; pushMyCart(); } catch (err) { }

    try {
    } catch (err) {
        alert("resize:Error:" + err)
    }

})
$(window).resize();

function establishTopPosition() {
    var shoppingCartAisle = document.getElementById('shoppingCartAisle');
    var y = 0;
    while (shoppingCartAisle != null) {
        y += shoppingCartAisle.offsetTop
        shoppingCartAisle = shoppingCartAisle.offsetParent;
    }
    return y;
}
function pushMyCart() {
    return false;
    var shoppingCart = document.getElementById('shoppingCart');

    if ($(window).width() < 992) {
        shoppingCart.style.position = 'inherit';
        $('#shoppingCart').width($('#cartW').width());
        return false;
    }

    var topPos = establishTopPosition();

    if (document.documentElement.scrollTop > topPos || self.pageYOffset > topPos) {
        if (pfCartHeight > 0) { shoppingCart.style.top = (0 - pfCartHeight) + 'px'; }
        else { shoppingCart.style.top = 0; }
        shoppingCart.style.position = 'fixed';
        $('#shoppingCart').width($('#cartW').width());
    } else {
        shoppingCart.style.position = 'inherit';
        pfCartHeight = GetTotalH('#shoppingCart') - $(window).height();
        if (pfCartHeight < 0) { pfCartHeight = 0 }
        $('#shoppingCart').width($('#cartW').width());
    }
}


function CheckNullVal(x) {
    if (isNaN(parseInt(x, 10)) == true) { return 0 } else { return parseInt(x, 10) }
}
function CheckNullReal(x) {
    try {
        var z;
        if (isNaN(x) == true) {
            z = x.replace('$', '');
        } else {
            z = x;
        }
        if (isNaN(Number(z)) == true) { return 0 } else { return Number(z) }
    } catch (err) {
        alert("CheckReal:" + err);
        return 0;
    }
}
function CheckNullDollar(x) {
    try {
        return x.toFixed(2);
    } catch (err) {
        alert("CheckDollar:" + err);
        return '0.00';
    }
}

function GetTotalH(x) {
    var totalHeight = 0;
    $(x).children().each(function () {
        totalHeight += $(this).outerHeight(true); // true = include margins
    });
    return totalHeight;
}

function mobileShowMenu() {
    $('#cartW').addClass('hidden-xs');
    $('#menuWhole').removeClass('hidden-xs');
    $('.panel-collapse').collapse('hide');
    $('html,body').animate({ scrollTop: $('#menuSection').offset().top - GetTotalH('#pfMainHeader') }, 200); return false;
}
function mobileShowCart() {
    $('#cartW').removeClass('hidden-xs');
    $('#menuWhole').addClass('hidden-xs');
    $('html,body').animate({ scrollTop: $('#cartW').offset().top - GetTotalH('#pfMainHeader') }, 200);
}


function pfLookForError(x) {
    if (x.ERROR != '') { pfAlert("Oops!", jsonError.ERROR); }
}

function pfPost(pfEntry) {
    $.ajax({
        type: "POST", url: pfUrl, dataType: 'json', data: pfEntry.data,
        success: function (data) { if (data.ERROR != '' && data.ERROR != 'OK') { var a; var b = data.ERROR; var c = JSON.parse('{ }'); c.responseText = JSON.stringify(data); pfEntry.error(c, a, b); } else { pfEntry.success(data); } },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
    });


}

function pfSendData(pfEntry) {
    $.ajax({
        type: "POST", url: pfUrl, dataType: 'json', data: pfEntry.data,
        success: function (data) { pfEntry.success(data); },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); pfEntry.success(jsonError); }
    });


}

// OBSOLETE
function pfGeocodeAddressZip(targetAddress, targetZip) {
    var targetData = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent($(targetAddress).val() + ' ' + $(targetZip).val());
    $.ajax({ type: "GET", url: targetData, dataType: 'json', success: function (data) { var A = {}; A['OPERATION'] = 'PROCESSGOOGLE'; A['DATA'] = data; pfProcessGoogle(A); } });
}

// OBSOLETE
function pfGeocode(targetAddress) {
    var targetData = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent($(targetAddress).val());
    $.ajax({ type: "GET", url: targetData, dataType: 'json', success: function (data) { var A = {}; A['OPERATION'] = 'PROCESSGOOGLE'; A['DATA'] = data; pfProcessGoogle(A); } });
}

function pfSearch(elementId) {
    try {
        var data = {};
        data.OPERATION = "ProcessSearch";
        data.SEARCHTARGET = $(elementId).val();
        pfPost({
            data: JSON.stringify(data),
            success: function (data) {
                location.href = '/Restaurants';
            },
            error: function (request, status, error) {
                var jsonError = jQuery.parseJSON(request.responseText);
                pfAlert("Oops!", jsonError.ERROR);
            }
        });
    } catch (err) {
        alert("ERROR: pfSearch: " + err);
    }
}


function pfSearchRest(elementId) {
    try {
        var data = {};
        data.OPERATION = "ProcessSearchRest";
        data.SEARCHTARGET = $(elementId).val();
        pfPost({
            data: JSON.stringify(data),
            success: function (data) {
                RestaurantList = data.RESTAURANTLIST;
                PopulateRestaurantList();
            },
            error: function (request, status, error) {
                var jsonError = jQuery.parseJSON(request.responseText);
                pfAlert("Oops!", jsonError.ERROR);
            }
        });
    } catch (err) {
        alert("ERROR: pfSearchRest: " + err);
    }
}


// OBSOLETE
function pfSaveAddress() {
    var rawData = $("#pfStreet").val() + ', ' + $("#pfCity").val() + ', ' + $("#pfState").val() + ' ' + $("#pfZip").val();
    var targetData = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(rawData);
    $.ajax({
        type: "GET", url: targetData, dataType: 'json',
        success: function (data) {
            var A = {}; A['OPERATION'] = 'PROCESSGOOGLE';
            A['DATA'] = data;
            A['ADDRESSDATA'] = $('#pfAddressForm').serializeArray();
            pfProcessGoogle(A);
        }
    });
}

// OBSOLETE
function pfProcessGoogle(A) {
    $.ajax({
        type: "POST", url: pfUrl, dataType: 'json', data: JSON.stringify(A),
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert(jsonError.ERROR);
        },
        success: function (data) {
            if (data.ERROR == 'ZIPCODE') {
                location.href = '/Restaurants';
            }
            else if (data.ERROR == 'LIST') {
                var x = data.ADDRESS;
                pfPopulateAddressList(x);
                $('#pfModalAddress').modal();
                $("#pfAddressListHeader1").css("display", "none");
                $("#pfAddressListHeader2").css("display", "block");
                $("#pfNewAddressSection").hide();
            }
            else if (data.ERROR != '') {
                var x = data.ADDRESS;
                pfProcessErrorList(x);
                $('#pfModalAddress').modal();
            }
            else {
                if (pfNextAction == 'DATETIME') {
                    pfNextAction = 'ORDER';
                    $('#pfModalAddress').modal('hide');
                    $('#DateValue').html(data.DATEOPTIONLIST);
                    $('#TimeValue').html(data.TIMEOPTIONLIST);
                    pfEditDateTime(false);
                }
                else if (pfCurrentPage == 'ORDERPAGE') { location.href = '/MyOrder'; }
                else if (pfCurrentPage == 'CHECKOUT') { location.href = '/CheckOut'; }
                else { location.href = '/Restaurants'; }
            }
        }
    });

}

// OBSOLETE??????
function pfSaveZipOrAddress(DataForm) {


    var formData = JSON.stringify($(DataForm).serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: formData,
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            if (jsonError.ERROR == 'ZIPCODE') {
                location.href = '/Restaurants';
            }
            else if (jsonError.ERROR == 'LIST') {
                var x = jsonError.ADDRESS;
                pfPopulateAddressList(x);
                $('#pfModalAddress').modal();
                $("#pfAddressListHeader1").css("display", "none");
                $("#pfAddressListHeader2").css("display", "block");
                $("#pfNewAddressSection").hide();
            }
            else {
                var x = jsonError.ADDRESS;
                pfProcessErrorList(x);
                $('#pfModalAddress').modal();
            }
        },
        success: function (data) {
            location.href = '/Restaurants';
        }
    });
}

function pfAdminLogin() {

    var formData = JSON.stringify($("#AdminLoginForm").serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData, error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); },
        success: function (data) {
            if (data.ERROR == '' || data.ERROR == 'OK') { window.location = '/Admin'; } else { pfAlert("Admin Login", data.ERROR); }
        }
    });
}


function PostJSONData(FormName) {

    var formData = JSON.stringify($(FormName).serializeArray());
    $.ajax({
        type: "POST",
        url: pfUrl,
        dataType: 'json',
        data: formData,
        success: function (data) {
            //pfLookForError(data);
            if (data.REDIRECT != '') { pfAlertAction = function () { location.href = ' / ' } }
            pfAlert(data.HEADLINE, data.MESSAGE);
        }
    });
}

function pfRecordReferral() {
    var formData = JSON.stringify($("#ReferCustomerForm").serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            if (jsonError.ERROR == 'LIST') { alert("S"); pfProcessErrorList(jsonError); alert("T"); } else { pfAlert("Oops!", jsonError.ERROR); }
        },
        success: function (data) {
            var x = data.REFERRAL;
            if (data.MESSAGE == 'ERROR') {
                pfProcessErrorList(data.ERRORLIST);
            } else if (x.MESSAGE == 'LOGIN') {
                $("#referResult").html('Thank you for your referral!');
                $("#referOK").hide(); $("#referLOGIN").show(); $("#pfReferWindow1").hide(); $("#pfReferWindow2").show();
            } else if (x.MESSAGE == 'OK') {
                $("#referResult").html('Thank you for your referral!');
                $("#referOK").show(); $("#referLOGIN").hide(); $("#pfReferWindow1").hide(); $("#pfReferWindow2").show();
            } else {
                $("#referResult").html(x.MESSAGE);
                $("#referOK").show(); $("#referLOGIN").hide(); $("#pfReferWindow1").hide(); $("#pfReferWindow2").show();
            }
        }
    });
}

function pfForgotPassword() {

    var formData = JSON.stringify($("#ForgotPasswordForm").serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); },
        success: function (data) {
            if (data.ERROR == '' || data.ERROR == 'OK') { $('#pfPasswordWindow1').hide(); $('#pfPasswordWindow2').show(); } else { pfAlert("Reset Password", data.ERROR); }
        }
    });
}

function pfExpressPIN() {
    var formData = {};
    formData.OPERATION = "EXPRESSPIN";
    formData.PIN = $("#expPIN").val();
    pfAppleSpinOn('Saving');
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: JSON.stringify(formData),
        error: function (request, status, error) { pfAppleSpinOff(); var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); },
        success: function (data) {
            if (data.ERROR == '' || data.ERROR == 'OK') { pfAppleSpinOff(); pfPopulateExpressOrderList(data); } else { pfAppleSpinOff();; pfAlert("Oops!", data.ERROR); }
        }
    });
}

function pfPopulateExpressOrderList(data) {

    $("#pfExpressOrderList").html('');
    var x = [];
    x.push('<table>')
    $.each(data.EXPRESSORDERLIST, function (id, option) {
        x.push('<tr><td style="vertical-align: top;"><div class="form-group"><a class="btn btn-xs btn-success" href="/JoinExpressOrder?OrderToken=' + option.ORDERTOKEN + '">PLACE ORDER</a>&nbsp;&nbsp;</div></td>')
        x.push('<td><div class="form-group">&nbsp;Order for <b>' + option.LOCALDATE + '</b> at <b>' + option.LOCALTIME + '</b> from <b>' + option.RESTAURANTS + '</b>');
        x.push('</div></td></tr>')
    });
    $("#pfExpressOrderList").append(x.join(''));


}

function pfRemoveAddress(AddressToken) {
    var formData = "{'OPERATION':'REMOVEADDRESS','ADDRESSTOKEN':'" + AddressToken + "'}";
    $.ajax({ type: "POST", url: pfUrl, dataType: 'json', data: formData }); $("#" + AddressToken).remove();
}

function pfRemoveCard(CardToken) {
    var formData = "{'OPERATION':'REMOVECARD','CARDTOKEN':'" + CardToken + "'}";
    $.ajax({ type: "POST", url: pfUrl, dataType: 'json', data: formData }); $("#" + CardToken).remove();
}

function pfEmailOrder(OrderToken) {
    var formData = "{'OPERATION':'EMAILORDER','ORDERTOKEN':'" + OrderToken + "'}";
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData, success: pfAlert("Email Order", "The order has been emailed to you"),
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
    });
}

function pfSelectArea() {
    var formData = JSON.stringify($("#AreaForm").serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData, success: function (data) {
            if (data.ERROR != '') { $("#pfAreaSelectError").html(data.ERROR); $("#pfAreaSelectError").show(); } else { window.location = '/Restaurants' }
        },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
    });
}

function pfSaveAccountInfo() {
    try {
        var formData = JSON.stringify($("#AccountForm").serializeArray());
        pfPost({
            type: "POST", url: pfUrl, dataType: 'json', data: formData, success: function (data) {
                if (data.ERROR != '') { alert(data.ERROR); } else { window.location = '/MyAccount' }
            },
            error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
        });

    } catch (err) {
        alert("pfSaveAccountInfo:Error:" + err);
    }
}

function pfCheckFreeItemList(data) {
    if (data.FREEITEMS.length > 0) {

        $("#pfFreeItemList").html('');
        var x = [];

        $.each(data.FREEITEMS, function (id, option) {
            x.push('<option value="' + option.MENUITEMTOKEN + '">' + option.ITEMNAME + '</option>');
        });
        $("#pfFreeItemList").append(x.join(''));
        $("#pfFreeItems").modal();
    }
}
function pfChooseFreeItem() {
    //alert("You chose: " + $("#pfFreeItemList").val());
    $("#pfFreeItems").modal('hide');
    pfEditItem($("#pfFreeItemList").val(), $("#pfFreeItemList").val(), '')
    //pfEditItem('EDIT','I{1E46DC9D-1D15-4AD5-8D57-D95DBAFE9B53}');

}

function pfPopulateAccountAddressList(data) {
    // first, clear div out
    $("#pfAddressList").html('');
    $("#pfNewAddressSection").hide();
    var x = [];

    // then load div with information
    $.each(data.ADDRESSTOKENLIST, function (id, option) {
        x.push('<div class="col-xs-offset-1 col-xs-10"><div class="form-group">');
        if (option.PREFERRED == true) {
            x.push('<button class="btn btn-success btn-xs" onClick="pfSelectAccountAddress(\'' + option.ADDRESSTOKEN + '\'); return false;">Choose</button>&nbsp;' + option.ADDRESSLINE + '<br /></div></div>');
        } else {
            x.push('<button class="btn btn-default btn-xs" onClick="pfSelectAccountAdress(\'' + option.ADDRESSTOKEN + '\'); return false;">Choose</button>&nbsp;' + option.ADDRESSLINE + '<br /></div></div>');
        }
    });
    $("#pfAddressList").append(x.join(''));
    $('#pfModalAddress').modal();

}

function pfSelectAccountAddress(AddressToken) {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: '{"OPERATION":"SELECTACCOUNTADDRESS","ADDRESSTOKEN":"' + AddressToken + '"}', success: window.location = '/MyAccount',
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfalert('Oops!', 'ERROR: ' + jsonError.ERROR); $('#pfModalAddress').modal('hide'); }
    });
}


function pfIssueReward(pfPrizeToken) {
    $("#PrizeName").html($("#" + pfPrizeToken + "PrizeName").html());
    $("#DeliveryName").html($("#" + pfPrizeToken + "DeliveryName").html());
    $("#DeliveryAddress1").html($("#" + pfPrizeToken + "DeliveryAddress1").html());
    $("#DeliveryAddress2").html($("#" + pfPrizeToken + "DeliveryAddress2").html());
    $("#PrizePoints").html($("#" + pfPrizeToken + "Points").html());
    $("#PrizeMessage").html("Please allow 10 business days for delivery").html();
    $("#PrizeToken").html(pfPrizeToken);
    $('#pfIssueReward').modal({ show: true, backdrop: 'static' })

}

function pfRedeemReward() {
    var formData = '{ "OPERATION" : "REWARDREDEEM" , "PRIZETOKEN" : "' + $("#PrizeToken").html() + '" }';
    $("#RedeemRewardButton").hide();
    pfPost({
        type: "POST", url: pfUrl, dataType: "json", data: formData
        , success: function (data) {
            $('#pfIssueReward').modal('hide'); pfAlert(data.HEADLINE, data.MESSAGE);
            $("#RewardBalance").html(data.REWARDBALANCE);
        }
        , error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); $('#pfIssueReward').modal('hide'); pfAlert("Reward Program", "ERROR: " + jsonError.ERROR); }
    });


}

function pfRewardHistory() {
    var formData = '{ "OPERATION" : "REWARDHISTORY" }';
    pfPost({
        type: "POST", url: pfUrl, dataType: "json", data: formData
        , success: function (data) {
            $("#RewardHistory").html(''); var x = [];
            $.each(data.REWARDHISTORY, function (id, option) {
                if (option.SPENT == true) {
                    x.push('<tr><td>' + option.DATE + '</td><td class="red">' + option.DESCRIPTION + '</td><td class="text-right red">' + option.AMOUNT + '</td><td class="text-right">' + option.BALANCE + '&nbsp;</td></tr>');
                } else {
                    x.push('<tr><td>' + option.DATE + '</td><td>' + option.DESCRIPTION + '</td><td class="text-right">' + option.AMOUNT + '</td><td class="text-right">' + option.BALANCE + '&nbsp;</td></tr>');
                }
            });
            $("#RewardHistory").append(x.join(''));
            $('#pfRewardHistory').modal({ show: true })
        }
        , error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Reward Program", "ERROR: " + jsonError.ERROR); }
    });

}

function pfEnroll() {
    var formData = '{ "OPERATION" : "REWARDENROLL" }'
    pfPost({ type: "POST", url: pfUrl, dataType: 'json', data: formData, success: pfAlert("Reward Program", "Thank you for enrolling!"), error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfalert("Reward Program", "ERROR: " + jsonError.ERROR); } });
}


function CheckNull(x) {
    if (typeof x == 'undefined') { return ''; }
    if (x == null) { return ''; }
    else { return x; }
}


function pfAddItem(ID) { pfEditItem(ID, ID, ''); }

function LoadMenu() {
    pfAppleSpinOn("Loading");
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: '{"OPERATION":"MENU"}',
        success: function (data) {
            PopulateMenu(data); pfPopulateCart(data);
            if (pfNeedItem != '') { pfEditItem(pfNeedItem, pfNeedItem, ''); }
        },
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            if (jsonError.REDIRECT != '') { window.location = "/Restaurants" } else { $('#pfModalAddress').modal('hide'); pfAlert("Oops!", jsonError.ERROR); }
        },

    });
}

//
//
// 
// ******************************** GROUP FUNCTIONS  ***********************************************
//
//
//





function pfShowError(x) { var jsonError = jQuery.parseJSON(x.responseText); alert('ERROR: ' + jsonError.ERROR) }



function pfPopulateOptionTimeList(data) {
    var x = [];
    $.each(data, function (id, option) {
        if (option.SELECTED == true) { x.push('<option selected value="' + option.TIMEVALUE + '">' + option.TIMEFORMAT + '</option>'); }
        else { x.push('<option value="' + option.TIMEVALUE + '">' + option.TIMEFORMAT + '</option>'); }
    });
    return x.join('');
}

function pfPopulateOptionDateList(data) {
    var x = [];
    $.each(data, function (id, option) {
        if (option.SELECTED == true) { x.push('<option selected value="' + option.DATEVALUE + '">' + option.DATEFORMAT + '</option>'); }
        else { x.push('<option value="' + option.DATEVALUE + '">' + option.DATEFORMAT + '</option>'); }
    });
    return x.join('');
}




function pfPopulateGroupSettings(data) {

    alert("OOOOO");
}





function pfChangeArea() {
    var formData = '{"OPERATION":"CLEARAREA"}';
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: formData,
        error: function (request, status, error) {
            location.reload(true);
        },
        success: function (data) {
            location.reload(true);
        }
    });

}

function pfViewOrder(OrderToken) {
    var formData = '{ "OPERATION" : "VIEWORDER" , "ORDERTOKEN" : "' + OrderToken + '" }';
    pfPost({
        type: "POST", url: pfUrl, dataType: "json", data: formData
        , success: function (data) {
            $("#pfViewOldOrderID").html(data.ORDERID);
            $("#pfViewOldOrderBody").html(data.ORDERBODY);
            if (data.ALLOWDUPLICATE == true) { $("#pfViewOldOrderDuplicate").html("<button class='btn btn-success' onclick='pfDuplicateOrder(\"" + data.ORDERTOKEN + "\"); return false;'>Order Again Now</button>&nbsp;&nbsp;"); }
            $('#pfViewOldOrder').modal({ show: true })
        }
        , error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("View Order", "ERROR: " + jsonError.ERROR); }
    });

}

function pfDuplicateOrder(OrderToken) {
    var formData = '{ "OPERATION" : "DUPLICATEORDER" , "ORDERTOKEN" : "' + OrderToken + '" }';
    pfPost({
        type: "POST", url: pfUrl, dataType: "json", data: formData
        , success: function (data) { location.href = '/MyOrder'; }
        , error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); $('#pfViewOldOrderDuplicate').html(jsonError.ERROR + '&nbsp;&nbsp;'); }
    });

}

function pfSaveHotel(action) {
    pfAppleSpinOn('Saving');
    if (action == 'LEAVE') { var formData = '{"OPERATION":"LEAVEHOTEL"}'; } else { var formData = JSON.stringify($('#pfHotelForm').serializeArray()); }
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: formData,
        error: function (request, status, error) {
            pfAppleSpinOff();
            $('#pfModalHotel').modal('hide');
            var jsonError = jQuery.parseJSON(request.responseText);
            var zzz = jsonError.ERROR;
            if (zzz.search('Your') > -1) {
                pfAlertAction = function () { pfOpenLogin(); }
            } else {
                pfAlertAction = function () { pfEditAddress(); };
            }
            pfAlert('Hotel Info Error', jsonError.ERROR);
        },
        success: function (data) {
            pfAppleSpinOff();
            $('#pfModalHotel').modal('hide');
            if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); }
            else if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }
        }
    });
}





function pfPopulateAddressList(data) {
    // first, clear div out
    pfAddressListCount = 0;
    $("#pfAddressList").html('');
    var x = [];

    // then load div with information
    $("#pfEnterNewAddress").css("display", "none");
    $.each(data.ADDRESSLIST, function (id, option) {
        pfAddressListCount++;
        $("#pfEnterNewAddress").css("display", "block");
        x.push('<div class="col-xs-offset-1 col-xs-10"><div class="form-group">');
        if (option.PREFERRED == true) {
            x.push('<button class="btn btn-success btn-xs" onClick="pfSelectAddress(\'' + option.ADDRESSTOKEN + '\'); return false;">Choose</button>&nbsp;' + option.ADDRESSLINE + '<br /></div></div>');
        } else {
            x.push('<button class="btn btn-default btn-xs" onClick="pfSelectAddress(\'' + option.ADDRESSTOKEN + '\'); return false;">Choose</button>&nbsp;' + option.ADDRESSLINE + '<br /></div></div>');
        }
    });
    $("#pfAddressList").append(x.join(''));

}


function pfSelectAddress(AddressToken) {
    $('#pfModalAddress').modal('hide');
    pfAppleSpinOn('Saving Address');
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"SELECTADDRESS","ADDRESSTOKEN":"' + AddressToken + '"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('ERROR: ' + jsonError.ERROR);
            pfAppleSpinOff();
        },
        success: function (data) {
            pfAppleSpinOff();
            if (pfCurrentPage == 'ORDERPAGE') {
                pfPopulateCart(data);
                if (pfNeedItem != '') { pfEditItem(pfNeedItem, pfNeedItem, ''); }
            }
            else if (pfCurrentPage == 'CHECKOUT') {
                pfPopulateCartCheckOut(data);
                pfAddressConfirmed = true;
                var cad = data.CURRENTSETTINGS;
                alert(cad.CURRENTADDRESSLINE);
                $("#AddressTextLine").val(cad.CURRENTADDRESSLINE)
            }
            else if (pfCurrentPage == 'STARTORDER') { location.href = '/StartOrder'; }
            else if (pfCurrentPage == 'EXPRESS') { location.href = '/ExpressOrders'; }
            else { location.href = '/Restaurants'; }
        }
    });

}

function pfAlert(aTitle, aMessage) {
    $("#modAlertTitle").html(aTitle);
    $("#modAlertMessage").html(aMessage);
    $("#pfModalAlert").modal();
}
function pfAlertClose() {
    var pfActionToTake = pfAlertAction;
    pfAlertAction = function () { };
    $("#pfModalAlert").modal('hide');
    pfActionToTake();
}

function pfConfirm(title, message, yesFn, noFn) {

    var confirmBox = $("#pfModalYesNo");
    confirmBox.find(".pfTitle").text(title);
    confirmBox.find(".pfMessage").text(message);
    confirmBox.find(".pfYes,.pfNo").unbind().click(function () { confirmBox.modal('hide'); });
    confirmBox.find(".pfYes").click(yesFn);
    confirmBox.find(".pfNo").click(noFn);
    confirmBox.modal('show');

}


function pfTestAl(m) { alert(m); }

function pfInfo(aTitle, aMessage) {
    try {
        $("#modInfoTitle").html(aTitle);
        $("#modInfoMessage").html(aMessage);
        $("#pfModalInfo").modal();
    } catch (err) {
        alert("pfInfo:Error:" + err)
    }
}


function pfChangeOrder(OrderToken) {
    var formData = '{ "OPERATION" : "CHANGEORDER" , "ORDERTOKEN" : "' + OrderToken + '" }';
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData, error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); alert('ERROR: ' + jsonError.ERROR); },
        success: window.location = "/MyOrder"
    });
}


function pfChangeOrderType(NewOrderType) {
    var formData = '{ "OPERATION" : "CHANGEORDERTYPE" , "NEWORDERTYPE" : "' + NewOrderType + '" }';
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: formData,
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('ERROR: ' + jsonError.ERROR);
        },
        success: function (data) {
            var x = data.NEXTACTION;
            window.location = "/MyOrder";
        }
    });
}

function pfEditDateTime(TimeOnly) {
    $('#pfModalDateTime').modal();
    pfChangeDateTime(TimeOnly);
}


function pfChangeDateTime(TimeOnly) {

    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"LOADDATETIME","NEWDATE":"' + $('#DateValue').val() + '"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('ERROR: ' + jsonError.ERROR);
            $('#pfModalDateTime').modal('hide');
        },
        success: function (data) {
            if (TimeOnly == false) { $('#DateValue').html(data.DATEOPTIONLIST); };
            $('#TimeValue').html(data.TIMEOPTIONLIST);
        }
    });
}

function pfSaveDateTime() {
    var formData = JSON.stringify($('#pfDateTimeForm').serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: formData,
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('ERROR: ' + jsonError.ERROR);
        },
        success: function (data) {
            $('#pfModalDateTime').modal('hide');
            if (pfCurrentPage == 'RESTAURANTS') { window.location = '/Restaurants'; }
            if (pfNextAction == 'ORDER') { window.location = '/MyOrder'; }
            if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); LoadMenu(); }
            if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }
        }
    });

}


function pfApplyCoupon() {
    pfAppleSpinOn('Applying');
    var formData = JSON.stringify($('#CouponForm').serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        success: function (data) { pfAppleSpinOff(); pfPaymentToEdit = 0; pfPopulateCartCheckOut(data); },
        error: function (request, status, error) { pfAppleSpinOff(); var jsonError = jQuery.parseJSON(request.responseText); pfAlert("OOPS!", jsonError.ERROR); return false; }
    });

}

function RegisterCustomer(FormName) {
    grecaptcha.execute('6Le1qeoUAAAAAEGTK8Ko7LSNgL3ounDBM8t14g_Q', { action: 'register' }).then(function (token) {
        //alert("A");
        RegisterCustomer2(FormName, token);
    });

}

function RegisterCustomer2(FormName, token) {

    $("#retoken").val(token);

    var formData = JSON.stringify($('#RegistrationForm').serializeArray());
    $.ajax({
        type: "POST",
        url: pfUrl,
        dataType: 'json',
        data: formData,
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); $("#RegistrationResult").html(jsonError.ERROR); },
        success: function (data) {
            if (CheckNull(data.REDIRECT) != '') { window.location.replace(data.REDIRECT); }
            document.getElementById("RegistrationResult").innerHTML = CheckNull(data.ERROR);
        }
    });
}


function pfUpdatePayment(FullCheckOut) {
    if (pfNeedCVV2Code == true && CheckNullVal($("#pmtOldCardCVV2").val()) < 1) {
        pfAlert("Oops!", "Please enter the Security Code for your credit card.");
        return false;
    }

    if (FullCheckOut == true) { $("#DoCheckOut").val('YES'); } else { $("#DoCheckOut").val(''); }

    if (FullCheckOut == true && pfAddressConfirmed != true && pfBypassConfirmAddress != true) {
        $('#ConfirmAddressModal').modal(); return false;
    }

    pfAppleSpinOn('Saving');
    $("#btnCheckOut").hide();

    grecaptcha.execute('6Le1qeoUAAAAAEGTK8Ko7LSNgL3ounDBM8t14g_Q', { action: 'login' }).then(function (token) {
        //alert("A");
        pfUpdatePayment2(FullCheckOut, token);
    });



}

function pfUpdatePayment2(FullCheckOut, token) {



    $("#retoken").val(token);

    var formData = JSON.stringify($('#paymentForm').serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        success: function (data) {
            pfAppleSpinOff();
            if (FullCheckOut == true && data.NEWORDERTOKEN != undefined) {
                $("#ConfirmOrderToken").val(data.NEWORDERTOKEN); $("#ConfirmForm").submit();
            } else {
                $("#btnCheckOut").show();
                pfPopulateCartCheckOut(data);
            }
        },
        error: function (request, status, error) {
            pfAppleSpinOff();
            $("#btnCheckOut").show();
            var jsonError = jQuery.parseJSON(request.responseText);
            var PaymentError = jsonError;
            if (PaymentError.ERRORTEXT != undefined) {
                pfAlert("OOPS!", PaymentError.ERRORTEXT);
            } else if (jsonError.ERROR != '') {
                pfCartData = jsonError;
                pfAlertAction = function () { pfPopulateCartCheckOut(pfCartData); if (pfNeedRoom == true) { pfEditAddress(); } };
                pfAlert("Houston, we have a problem!", jsonError.ERROR);
            } else {
                pfAlert("Houston, we have a problem!", "Internal Error")
            }
            return false;
        }
    });

}


function pfGetCartSummary(OrderToken) {
    pfAppleSpinOn('Loading');
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: '{"OPERATION":"GETCARTSUMMARY","ORDERTOKEN":"' + OrderToken + '"}', success: function (data) {
            pfPopulateCartSummary(data); pfAppleSpinOff();
        },
        error: function (request, status, error) { pfAppleSpinOff(); var jsonError = jQuery.parseJSON(request.responseText); alert('ERROR: ' + jsonError.ERROR); $('#pfModalDateTime').modal('hide'); }
    });
}


function pfItemSubmit() {

    if (pfItemValidate(false)) {
        var formData = JSON.stringify($('#ItemForm').serializeArray());
        pfPost({
            type: "POST", url: pfUrl, dataType: 'json', data: formData,
            success: function (data) {
                pfCancelEditItem();
                if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); }
                if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }

            },
            error: function (request, status, error) {
                var jsonError = jQuery.parseJSON(request.responseText);
                alert("Error:" + jsonError.ERROR);
            },
        });
    }
    return false;
}

function pfOpenLogin() {
    $('#pfModalLogin').modal();
}

function equalHeight(group) {
    var tallest = 0;
    group.each(function () {
        var thisHeight = $(this).height();
        if (thisHeight > tallest) {
            tallest = thisHeight;
        }
    });
    group.each(function () { $(this).height(tallest); });
}

$(document).ready(function () {
    equalHeight($(".thumbnail"));
});


function pfLoginCustomer(LoginFormName) {

    var formData = JSON.stringify($(LoginFormName).serializeArray());
    pfPost({
        type: "POST",
        url: pfUrl,
        dataType: 'json',
        data: formData,
        success: function (data) {
            if (pfCurrentPage == 'ORDERPAGE') { location.href = '/MyOrder'; }
            else if (pfCurrentPage == 'CHECKOUT') { location.href = '/CheckOut'; }
            else if (data.REDIRECT != '') { location.href = data.REDIRECT; }
            else { location.href = '/StartOrder'; }
        },
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            var x = jsonError.LOGIN
            if (CheckNull(x.PASSWORDMESSAGE) != '') {
                $('#pfLoginPasswordHelp').html(x.PASSWORDMESSAGE);
                $('#pfLoginPasswordError').addClass('glyphicon-remove');
                $('#pfLoginPasswordGroup').addClass('has-error');
                $('#pfLoginPasswordGroup').addClass('has-feedback');
            }
            else {
                $('#pfLoginPasswordHelp').html('');
                $('#pfLoginPasswordError').removeClass('glyphicon-remove');
                $('#pfLoginPasswordGroup').removeClass('has-error');
                $('#pfLoginPasswordGroup').addClass('has-feedback');
            }
            if (CheckNull(x.EMAILMESSAGE) != '') {
                $('#pfLoginEmailHelp').html(x.EMAILMESSAGE);
                $('#pfLoginEmailError').addClass('glyphicon-remove');
                $('#pfLoginEmailGroup').addClass('has-error');
                $('#pfLoginEmailGroup').addClass('has-feedback');
            }
            else {
                $('#pfLoginEmailHelp').html('');
                $('#pfLoginEmailError').removeClass('glyphicon-remove');
                $('#pfLoginEmailGroup').removeClass('has-error');
                $('#pfLoginEmailGroup').addClass('has-feedback');
            }
        },
    });
}
function pfLoginCustomerAlt(LoginFormName, ErrorFieldName) {
    var formData = JSON.stringify($(LoginFormName).serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        success: function (data) {
            if (pfCurrentPage == 'ORDERPAGE') { location.href = '/MyOrder'; }
            else if (pfCurrentPage == 'CHECKOUT') { location.href = '/CheckOut'; }
            else if (pfCurrentPage == 'RESTMAN') { location.href = '/Manage'; }
            else if (data.REDIRECT != '') { location.href = data.REDIRECT; }
            else { location.href = '/StartOrder'; }
        },
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            var x = jsonError.LOGIN
            $(ErrorFieldName).html(CheckNull(x.PASSWORDMESSAGE) + '<br>' + CheckNull(x.EMAILMESSAGE));
        },
    });
}

function pfLoginCustomerRegisterNew(LoginFormName) {
    var formData = JSON.stringify($(LoginFormName).serializeArray());
    $.ajax({
        type: "POST", url: pfUrl, dataType: 'json', data: formData, success: function (data) {
            if (CheckNull(data.LOGIN.PASSWORDMESSAGE) != '') { $('#regLoginPasswordHelp').html(data.LOGIN.PASSWORDMESSAGE); }
            else if (CheckNull(data.LOGIN.EMAILMESSAGE) != '') { $('#regLoginEmailHelp').html(data.LOGIN.EMAILMESSAGE); }
            else if (pfCurrentPage == 'ORDERPAGE') { location.href = '/MyOrder'; }
            else if (pfCurrentPage == 'CHECKOUT') { location.href = '/CheckOut'; }
            else if (data.REDIRECT != '') { location.href = data.REDIRECT; }
            else { location.href = '/StartOrder'; }
        }, error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); alert(jsonError.ERROR); },
    });
}

function pfProcessErrorList(data) {
    pfFoundError = false;
    $.each(data.ERRORLIST, function (id, option) {
        if (option.SUCCESS == true) { pfRemoveError(option.FIELDNAME); } else { pfApplyError(option.FIELDNAME, option.MESSAGE); pfFoundError = true; }
    }
    );
}

function pfApplyError(FieldName, Message) {
    $('#' + FieldName + 'Help').html(Message);
    $('#' + FieldName + 'Error').addClass('glyphicon-remove');
    $('#' + FieldName + 'Group').addClass('has-error');
    $('#' + FieldName + 'Group').addClass('has-feedback');
}
function pfRemoveError(FieldName) {
    $('#' + FieldName + 'Help').html('');
    $('#' + FieldName + 'Error').removeClass('glyphicon-remove');
    $('#' + FieldName + 'Group').removeClass('has-error');
    $('#' + FieldName + 'Group').addClass('has-feedback');
}

function pfLoadOrderStatus() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"ORDERSTATUS","ORDERTOKEN":"' + pfOrderStatusToken + '"}',
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); alert('GET CART ERROR: ' + jsonError.ERROR); },
        success: function (data) {
            var x = data.ORDERSTATUS;
            $("#pfDriverMessageOrderToken").val(pfOrderStatusToken);
            $("#sOrderPlacedTime").html(x.ORDERPLACEDTIME); $("#sOrderPlacedMethod").html(x.ORDERPLACEMETHOD); $("#sOrderSentStatus").html(x.ORDERSENTSTATUS); $("#sOrderSentTime").html(x.ORDERSENTTIME);
            $("#sOrderSentConfirmed").html(x.ORDERSENTCONFIRMED); $("#sDriverStatus").html(x.DRIVERSTATUS); $("#sDriverTime").html(x.DRIVERTIME); $("#sDriverName").html(x.DRIVERNAME);
            $("#sDriverName1").html(x.DRIVERNAME); $("#pfModalDriverMessageTitle").html("Send message to " + x.DRIVERNAME); $("#sFinalStatus").html(x.FINALSTATUS); $("#sFinalTime").html(x.FINALTIME);
            $("#sFinalMessage").html(x.FINALMESSAGE); $("#sDriverBio").html(x.DRIVERBIO);
            if (x.FINALACTIVE == true) { $("#sFinal").addClass('red'); } else { $("#sFinal").removeClass('red'); }
            if (x.DRIVERACTIVE == true) { $("#sDriver").addClass('red'); } else { $("#sDriver").removeClass('red'); }
            if (x.ORDERSENTACTIVE == true) { $("#sRestaurant").addClass('red'); } else { $("#sRestaurant").removeClass('red'); }
            if (x.ORDERPLACEDACTIVE == true) { $("#sOrder").addClass('red'); } else { $("#sOrder").removeClass('red'); }
            if (x.DRIVERIMAGE != '') { $("#sDriverImage").html("<img class='responsive img-circle' src='" + x.DRIVERIMAGE + "' /><br />"); } else { $("#sDriverImage").html(''); }
            if (x.DRIVERMESSAGELINK == true) { $("#sDriverMessage").show(); $("#sDriverMessage").html("Send " + x.DRIVERNAME + " a message"); } else { $("#sDriverMessage").hide(); }
            pfOrderStatusStart = x.STARTADDRESS; pfOrderStatusEnd = x.ENDADDRESS; pfInitializeMap();
        }
    });
}

function pfSendDriverMessageText() {
    if ($("#DriverMessageText").val().length > 100) { alert("Messages cannot exceed 100 characters in length."); return false; }
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: JSON.stringify($('#DriverMessageForm').serializeArray()),
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); alert('Driver Message Error: ' + jsonError.ERROR); },
        success: function (data) { pfAlert('Send Driver Message', data.MESSAGE); }
    });
}

function pfSubmitSurvey() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: JSON.stringify($('#SurveyForm').serializeArray()),
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert('Survey Error', jsonError.ERROR); },
        success: function (data) { $("#pfMainSurvey").hide(); $("#pfSurveyResult").show(); $(window).resize(); }
    });
}



function pfStar(idno, x) {
    $("#pfStar" + idno + "_1").removeClass('ratingboxPoor'); $("#pfStar" + idno + "_2").removeClass('ratingboxPoor'); $("#pfStar" + idno + "_3").removeClass('ratingboxPoor'); $("#pfStar" + idno + "_4").removeClass('ratingboxPoor'); $("#pfStar" + idno + "_5").removeClass('ratingboxPoor');
    $("#pfStar" + idno + "_1").removeClass('ratingboxOK'); $("#pfStar" + idno + "_2").removeClass('ratingboxOK'); $("#pfStar" + idno + "_3").removeClass('ratingboxOK'); $("#pfStar" + idno + "_4").removeClass('ratingboxOK'); $("#pfStar" + idno + "_5").removeClass('ratingboxOK');
    $("#pfStar" + idno + "_1").removeClass('ratingboxGood'); $("#pfStar" + idno + "_2").removeClass('ratingboxGood'); $("#pfStar" + idno + "_3").removeClass('ratingboxGood'); $("#pfStar" + idno + "_4").removeClass('ratingboxGood'); $("#pfStar" + idno + "_5").removeClass('ratingboxGood');
    if (x == 1) {
        $("#pfStar" + idno + "_1").addClass('ratingboxPoor');
        $("#pfStar" + idno + "_Desc").html('Horrible.  Never Again!');
    } else if (x == 2) {
        $("#pfStar" + idno + "_1").addClass('ratingboxPoor'); $("#pfStar" + idno + "_2").addClass('ratingboxPoor');
        $("#pfStar" + idno + "_Desc").html('Nothing to write home about!');
    } else if (x == 3) {
        $("#pfStar" + idno + "_1").addClass('ratingboxOK'); $("#pfStar" + idno + "_2").addClass('ratingboxOK'); $("#pfStar" + idno + "_3").addClass('ratingboxOK');
        $("#pfStar" + idno + "_Desc").html('What I expected.');
    } else if (x == 4) {
        $("#pfStar" + idno + "_1").addClass('ratingboxOK'); $("#pfStar" + idno + "_2").addClass('ratingboxOK'); $("#pfStar" + idno + "_3").addClass('ratingboxOK'); $("#pfStar" + idno + "_4").addClass('ratingboxOK');
        $("#pfStar" + idno + "_Desc").html('Pretty Good!');
    } else {
        $("#pfStar" + idno + "_1").addClass('ratingboxGood'); $("#pfStar" + idno + "_2").addClass('ratingboxGood'); $("#pfStar" + idno + "_3").addClass('ratingboxGood'); $("#pfStar" + idno + "_4").addClass('ratingboxGood'); $("#pfStar" + idno + "_5").addClass('ratingboxGood');
        $("#pfStar" + idno + "_Desc").html('Kudos! Above and Beyond!');
    }
    $("#Rating" + idno).val(x);
}
function pfSubmitReview() {
    for (i = 1; i <= pfStarCount; i++) {
        if ($("#Rating" + i).val() == 0) { pfAlert('Submit Review', 'Please select a star rating'); return false; }
    }

    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: JSON.stringify($('#ReviewForm').serializeArray()),
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert('Review Error:', jsonError.ERROR); },
        success: function (data) {
            var x = data.REVIEW;
            if (x.RESULT == 'OK') {
                var z = 'Thank you for submitting your review!';
                if (x.BONUSPOINTS > 0) { z = z + '<br /> <br .>You have been awarded ' + x.BONUSPOINTS + ' Bonus Reward Points!'; }
                if (x.COMMENTSUBMITTED == true) { z = z + '<br> <br>Your rating has been applied to the restaurant, and your comments will be posted after approval by our staff.'; }
                $("#pfReviewResultMessage").html(z);
            } else { $("#pfReviewResultMessage").html(x.RESULT); }
            $("#pfReviewPanel").hide(); $("#pfReviewResult").show(); $(window).resize();
        }
    });
}

function pfStarClear() {
    $("#pfStar1").removeClass('ratingboxPoor'); $("#pfStar2").removeClass('ratingboxPoor'); $("#pfStar3").removeClass('ratingboxPoor'); $("#pfStar4").removeClass('ratingboxPoor'); $("#pfStar5").removeClass('ratingboxPoor');
    $("#pfStar1").removeClass('ratingboxOK'); $("#pfStar2").removeClass('ratingboxOK'); $("#pfStar3").removeClass('ratingboxOK'); $("#pfStar4").removeClass('ratingboxOK'); $("#pfStar5").removeClass('ratingboxOK');
    $("#pfStar1").removeClass('ratingboxGood'); $("#pfStar2").removeClass('ratingboxOK'); $("#pfStar3").removeClass('ratingboxOK'); $("#pfStar4").removeClass('ratingboxOK'); $("#pfStar5").removeClass('ratingboxOK');
}

function pfInitializeMap() {
    var myOptions = {
        //center: new google.maps.LatLng(41.850033, -87.6500523),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    var pfOrderStatusMap = new google.maps.Map(document.getElementById("map-canvas"), myOptions);

    var h = $("#pfMainContent").height() - 350;
    $('#map-canvas').css('height', h);

    var directionsDisplay = new google.maps.DirectionsRenderer();// also, constructor can get "DirectionsRendererOptions" object
    directionsDisplay.setMap(pfOrderStatusMap); // map should be already initialized.

    var request = { origin: pfOrderStatusStart, destination: pfOrderStatusEnd, travelMode: google.maps.TravelMode.DRIVING };
    var directionsService = new google.maps.DirectionsService();
    directionsService.route(request, function (response, status) { if (status == google.maps.DirectionsStatus.OK) { directionsDisplay.setDirections(response); } });

    //directionsDisplay.setPanel(document.getElementById("directionsPanel"));

    //var markers = [
    //       ['London Eye, London', 51.503454, -0.119562],
    //       ['Palace of Westminster, London', 51.499633, -0.124755]
    //];

    // markers & place each one on the map  
    //for (i = 0; i < markers.length; i++) {
    //    var position = new google.maps.LatLng(markers[i][1], markers[i][2]);
    //    bounds.extend(position);
    //    marker = new google.maps.Marker({
    //        position: position,
    //        map: map,
    //        title: markers[i][0]
    //    });

    // Automatically center the map fitting all markers on the screen
    // map.fitBounds(bounds);
    //}


}

function addMark(lat1, lon1, desc) {
    var p1 = new google.maps.LatLng(lat1, lon1);
    marker = new google.maps.Marker({ position: p1, map: map, title: desc });
    marker.setMap(map);
}

function calcRoute() {


    var request = {
        origin: start,
        destination: end,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
    };
    directionsService.route(request, function (response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
            //directionsDisplay.setDirections(response);
        }
    });

}



function pfGetCart() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"GETCART"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('GET CART ERROR: ' + jsonError.ERROR);
            pfClosePop();
        },
        success: function (data) { pfPopulateCart(data); }
    });

}

function pfGetCartGift() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"GETCART"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('GET CART ERROR: ' + jsonError.ERROR);
        },
        success: function (data) { pfPopulateGiftCart(data); }
    });

}


function pfMakeDelivery() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"MAKEDELIVERY"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('ERROR: ' + jsonError.ERROR);
        },
        success: function (data) {
            if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); }
            if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }
        }
    });

}

function pfMakeTakeOut() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"MAKETAKEOUT"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('ERROR: ' + jsonError.ERROR);
        },
        success: function (data) {
            if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); }
            if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }
        }
    });

}


function pfPopulateCart(alldata) {
    var data = alldata.CART;
    var cartNotEmpty = false;
    pfHotelID = data.HOTELID;
    pfOrderMethod = data.ORDERMETHOD;
    pfValidAddress = data.OKADDRESS;
    if (data.ADDRESSLINE1 == '') { pfAddressEmpty = true } else { pfAddressEmpty = false; }

    $("#cartAd").html('');
    if (data.TICKLERSHOW == true && data.TICKLERIMAGE != '' && data.TICKLERLINK != '') {
        var x = [];
        x.push('<div class="text-center"><a href="' + data.TICKLERLINK + '"><img src="' + data.TICKLERIMAGE + '" class="img img-responsive" style="width: 100%;" /></a></div><br />');
        $("#cartAd").append(x.join(''));
    } else if (data.TICKLERSHOW == true && data.TICKLERIMAGE != '') {
        var x = [];
        x.push('<div class="text-center"><img src="' + data.TICKLERIMAGE + '" class="img img-responsive" style="width: 100%;" /></div><br />');
        $("#cartAd").append(x.join(''));
    }

    if (data.OKASAP != true) {
        // $('#cartDateTimeText').html('Please select a date/time for your order.');
    } else {
        // $('#cartDateTimeText').html(data.SCHEDULEDTEXT);
    }
    if (data.HOTELID > 0) {
        var xx = '';
        if (data.HOTELROOM != '') { xx = "ROOM # " + data.HOTELROOM; } else { xx = '<a href="#" onClick="pfEditAddress(); return false;">Click to Enter Room Number</a>'; }
        $("#cartAddressText").html('<b>' + data.HOTELNAME + '</b><br />' + data.ADDRESSLINE1 + '<br />' + data.ADDRESSLINE2 + '<br />' + xx);
    }
    else if (data.ADDRESSLINE1 == '') {
        //$('#cartAddressText').html('<a href="#" onClick="pfEditAddress(); return false;" style="color:red;">Delivery may not be available to your location, and prices are estimated until you enter your address.  Click here to enter your address.</a>');
    }
    else {
        // $('#cartAddressText').html(data.ADDRESSLINE1 + ', ' + data.ADDRESSLINE2);
    }



    $("#itemTable").html('');
    $("#cartHeaderTotal").html('$ ' + data.GRANDTOTAL);
    $("#cartHeaderTotalM").html('$ ' + data.GRANDTOTAL);
    $("#cartCustomerName").html(data.CUSTOMERNAME);
    $("#cartPhone").html(data.PHONE);
    $("#cartFoodTotal").html(data.FOODTOTAL);
    $("#cartDeliveryFee").html(data.DELIVERYFEE);
    $("#cartPackingFee").html(data.PACKINGFEE);
    $("#cartFuelSurcharge").html(data.FUELSURCHARGE);
    $("#cartOrderTotal").html(data.ORDERTOTAL);
    $("#cartSalesTax").html(data.SALESTAX);
    $("#cartConvFee").html(data.CONVFEE);
    $("#cartDiscounts").html(data.DISCOUNTS);
    $("#cartCreditsUsed").html(data.CREDITSUSED);
    $("#cartGrandTotal").html(data.GRANDTOTAL);
    $("#cartDriverTip").html(data.DRIVERTIP);
    $("#cartPaidByCompany").html(data.ADMINSHARE);
    $("#cartMemberDue").html(data.MEMBERDUE);
    $("#cartMemberDueTitle").html("Your Share:");
    $("#lineOverLimit").hide();
    $("#tipDollar").val(data.DRIVERTIPFLAT);
    $("#tipPercent").val(data.DRIVERTIPPERCENT);
    if (data.TIPADD10 == true) { $("#tipAdd10").show(); } else { $("#tipAdd10").hide(); }
    if (data.TIPADD12 == true) { $("#tipAdd12").show(); } else { $("#tipAdd12").hide(); }
    if (data.TIPADD15 == true) { $("#tipAdd15").show(); } else { $("#tipAdd15").hide(); }
    if (data.TIPADD18 == true) { $("#tipAdd18").show(); } else { $("#tipAdd18").hide(); }
    if (data.TIPADD20 == true) { $("#tipAdd20").show(); } else { $("#tipAdd20").hide(); }
    if (data.TIPADD25 == true) { $("#tipAdd25").show(); } else { $("#tipAdd25").hide(); }
    if (data.ALLOWNOTIP == true) { $("#tipNoTip").show(); } else { $("#tipNoTip").hide(); }



    if (data.DELIVERYFEE == '0.00') { $("#lineDeliveryFee").hide(); } else { $("#lineDeliveryFee").show(); }
    if (data.FUELSURCHARGE != '0.00') { $("#lineFuelSurcharge").show(); } else { $("#lineFuelSurcharge").hide(); }
    if (data.PACKINGFEE != '0.00') { $("#linePackingFee").show(); } else { $("#linePackingFee").hide(); }
    if (data.CONVFEE != '0.00') { $("#lineConvFee").show(); } else { $("#lineConvFee").hide(); }
    if (data.DISCOUNTS != '0.00') { $("#lineDiscounts").show(); } else { $("#lineDiscounts").hide(); }
    if (data.CREDITSUSED != '0.00') { $("#lineCreditsUsed").show(); } else { $("#lineCreditsUsed").hide(); }
    if (data.ADMINSHARE != '0.00') { $("#linePaidByCompany").show(); } else { $("#linePaidByCompany").hide(); }
    if (data.OVERLIMIT === true) {
        $("#cartMemberDueTitle").html("Overlimit By:");
        $("#lineMemberDue").show();
        $("#lineOverLimit").show();
    } else if (data.MEMBERDUE != '0.00') { $("#lineMemberDue").show(); } else { $("#lineMemberDue").hide(); }

    //if (pfOrderMethod == 'GroupOrder' || pfOrderMethod == 'ExpressOrder') {
    //    var EditText = '&nbsp;&nbsp;';
    //    $('#cartAddressTextEdit').html('');
    //    $('#cartDateTimeTextEdit').html('');
    //} else {
    //    var EditText = '&nbsp;&nbsp;<div class="pull-right"><a href="#" onclick="pfEditDateTime(false); return false;"><span class="glyphicon glyphicon-edit"></span></a></div>';
    //    $('#cartAddressTextEdit').html('<a href="#" onclick="pfEditAddress(); return false;"><i class="fa fa-pencil"></i></a>');
    //    $('#cartDateTimeTextEdit').html('<a href="#" onclick="pfEditDateTime(false); return false;"><i class="fa fa-pencil"></i></a>');
    // }


    if (data.TIPPAIDBYCOMPANY === true) {
        $("#TipPaidByCompany").show();
        $("#TipPaidByCompanyModal").show();
        $("#TipButton").html('Additional ' + pfTipTitle);
    } else {
        $("#TipPaidByCompany").hide();
        $("#TipPaidByCompanyModal").hide();
        $("#TipButton").html(pfTipTitle);
    }

    if (data.PICKUPDELIVERYTEXT == 'delivery') {
        $("#cartDeliveryIcon").html('<h4><span class="linkred"><i class="fa fa-circle"></i>&nbsp;&nbsp;Deliver&nbsp;&nbsp;<i class="fa fa-car"></i></span></h4>');
        if (data.HASTAKEOUT == true) {
            $("#cartPickupIcon").html('<h4><a href="#" class="linkgray" onClick="pfMakeTakeOut(); return false;"><i class="fa fa-circle-o"></i>&nbsp;&nbsp;Pickup&nbsp;&nbsp;<i class="fa fa-road"></i></a></h4>');
        } else { $("#cartPickupIcon").html(''); }
        $("#lineDriverTip").show();
        $("#lineGrandTotal").show();
        //$("#cartAddressWarning").hide();
        //if (data.OKADDRESS == false && data.ADDRESSLINE1 == '') { $("#cartEnterAddress").show(); $("#cartAddressInfo").hide(); }
        //else {
        //    $("#cartEnterAddress").hide(); $("#cartAddressInfo").show();
        //    if (data.OKADDRESS == false) { $("#cartAddressWarning").show(); }
        //}
    }
    else {
        $("#cartPickupIcon").html('<h4><span class="linkred"><i class="fa fa-circle"></i>&nbsp;&nbsp;Pickup&nbsp;&nbsp;<i class="fa fa-road"></i></span></h4>');
        if (data.HASDELIVERY == true) {
            $("#cartDeliveryIcon").html('<h4><a href="#" class="linkgray" onClick="pfMakeDelivery(); return false;"><i class="fa fa-circle-o"></i>&nbsp;&nbsp;Deliver&nbsp;&nbsp;<i class="fa fa-car"></i></a></h4>');
        } else { $("#cartDeliveryIcon").html(''); }
        //$("#cartDateTime").append('Pickup ' + data.SCHEDULEDDATE + ' at ' + data.SCHEDULEDTIME + '.' + EditText);
        $("#lineDriverTip").hide();
        $("#lineGrandTotal").hide();
        $("#cartAddressInfo").hide();
    }

    if (data.HASDELIVERY == false || data.HASTAKEOUT == false) {
        $("#cartPickupIcon").html('');
        $("#cartDeliveryIcon").html('');
    }


    var pfItem = [];
    var cartRestCount = 0;
    $.each(data.RESTAURANTS, function (id, option) {
        cartRestCount++;
        pfItem.push('<tr class="bg-info"><td colspan="2" class="panel-heading2 accordion-toggle" data-toggle="collapse" data-parent="#itemTable" ');
        pfItem.push('data-target="#cartRest' + cartRestCount + '" id="cartRestHead' + cartRestCount + '">');
        pfItem.push('<b><span class="glyphicon glyphicon-cutlery"></span>&nbsp;' + option.RESTAURANTNAME + '</b></td></tr>');
        pfItem.push('<tr id="cartRest' + cartRestCount + '"><td colspan="2"><table class="table table-condensed" style="background: #f7f7f7; margin-bottom: 0;">');

        $.each(option.ITEMS, function (id, option) {
            cartNotEmpty = true;
            pfItem.push('<tr><td valign="top" colspan="2" style="border:0;"><div class="row">');
            pfItem.push('<div class="col-xs-7">');
            pfItem.push('<a class="" href="#" onClick="pfEditItem(\'EDIT\',\'EDIT\',\'' + option.LOCATOR + '\'); return false;"><i class="fa fa-edit" title="Edit Item"></i></a>&nbsp;');
            pfItem.push('<a class="" href="#" onClick="pfDeleteItem(\'' + option.LOCATOR + '\'); return false;"><i class="fa fa-trash" title="Remove Item"></i></a>&nbsp;');
            pfItem.push('<b>' + option.ITEMNAME + '</b></div>');
            pfItem.push('<div class="col-xs-5 text-right">(' + option.QTY + ')&nbsp;$' + option.PRICE + '</b>&nbsp;');
            pfItem.push('</div ></div > ');
            if (CheckNull(option.MODIFIERINFORMATION) != '') { pfItem.push('<div class="small">' + option.MODIFIERINFORMATION + '</div>'); }
            pfItem.push('</td></tr>');
        });
        pfItem.push('</table></td></tr>');
    });

    var HeaderShown = false;
    $.each(data.COUPONS, function (id, option) {
        if (HeaderShown == false) {
            cartRestCount++;
            pfItem.push('<tr class="bg-info"><td colspan="2" class="panel-heading2 accordion-toggle" data-toggle="collapse" data-parent="#itemTable" ');
            pfItem.push('data-target="#cartRest' + cartRestCount + '" id="cartRestHead' + cartRestCount + '">');
            pfItem.push('<b><i class="fa fa-dollar"></i>&nbsp;Coupons Applied</b></td></tr>');
            pfItem.push('<tr id="cartRest' + cartRestCount + '"><td colspan="2"><table class="table table-condensed" style="background: #f7f7f7;">');
            HeaderShown = true;
        }

        pfItem.push('<tr><td valign="top" colspan="2" style="border:0;"><div class="row">');
        pfItem.push('<div class="col-xs-8"><b>' + option.COUPONNAME + '</b></div><div class="col-xs-4 text-right">');
        pfItem.push('<b> $' + option.PRICE + '</b>&nbsp;');
        pfItem.push('<a class="glyphicon glyphicon-remove text-danger" href="#" onClick="pfDeleteItem(\'' + option.LOCATOR + '\'); return false;"></a>');
        pfItem.push('</div ></div > ');



        pfItem.push('</td></tr>');

    });
    if (HeaderShown == true) { pfItem.push('</table></td></tr>'); }


    if (cartRestCount == 0) { pfItem.push('<tr><td colspan="2" class="text-center"><h4>Your cart is empty!</h4></td></tr>'); $("#cartDateAddHeader").show(); $("#cartOrderType").hide(); $("#cartSpacer1").show(); }
    else { $("#cartDateAddHeader").show(); $("#cartOrderType").show(); $("#cartSpacer1").hide(); }
    pfItem.push('</tbody>');
    $("#itemTable").append(pfItem.join(''));

    $("#cartWarning").html('');
    //$("#cartAddressWarning").hide();
    //$("#cartDateTimeWarning").hide();

    if (data.OKCHECKOUTSCREEN == '') {
        $("#opCheckoutButton").html('<a class="btn btn-success" href="/Checkout">CHECKOUT</a>');
        $("#opCheckoutButtonM").html('<a class="btn btn-success btn-xs" href="/Checkout">CHECKOUT</a>');
    }
    else {
        $("#opCheckoutButton").html('<button class="btn btn-default" onclick="' + data.OKCHECKOUTACTION + '; return false;">CHECKOUT</button>');
        $("#opCheckoutButtonM").html('<button class="btn btn-default btn-xs" onclick="' + data.OKCHECKOUTACTION + '; return false;">CHECKOUT</button>');
        $("#cartWarning").append('<tr><td><i class="fa fa-exclamation-triangle pfWarning"></i></td><td>' + data.OKCHECKOUTSCREEN + '</td></tr>');

    }

    if (data.OKADDRESS == true) {
        $("#CartDetails").show();
        $("#CartNoDetails").hide();
    } else {
        $("#CartDetails").hide();
        $("#CartNoDetails").show();
    }

    // VirtualZoneID ZoneID
    if (data.EXISTINGORDER == true) {
        $("#pfMyOrder").html('Editing Order #' + data.ORDERNUMBER);
        $("#CancelOrder").hide();
        $("#CancelChanges").show();
    } else {
        $("#CancelOrder").show();
        $("#CancelChanges").hide();
        if (pfOrderMethod == 'GroupOrder') {
            $("#pfMyOrder").html('Group Order (Member)');
            $("#pfDeliverPickupSection").hide();
            //$("#pfEditAddressIcon").hide();
            if (data.ISGROUPADMIN == true) { $("#pfIsGroupAdmin").show(); } else { $("#pfIsGroupAdmin").hide(); }
        } else if (pfOrderMethod == 'ExpressOrder') {
            $("#pfMyOrder").html('Express Order');
            $("#pfDeliverPickupSection").hide();
            //$("#pfEditAddressIcon").hide();
            if (data.ISGROUPADMIN == true) { $("#pfIsGroupAdmin").show(); } else { $("#pfIsGroupAdmin").hide(); }
        } else {
            $("#pfMyOrder").html('My Order');
            $("#pfDeliverPickupSection").show();
            //$("#pfEditAddressIcon").show();
        }
    }



    try {
        clearInterval(pfCartTimer);
    }
    catch (err) { }

    if (data.TIMELEFT > 0 && pfCartWarn5 == false) {
        pfCartTimeLeft = data.TIMELEFT * 60;
        pfCartTimer = setInterval(pfShowGroupAlert, 10000);
    } else {
        $("#cartWarnDateTime").html('');
    }

    pfPopulateSettings(alldata.CURRENTSETTINGS);

    pfAppleSpinOff();

    if (data.OKASAP != true) {
        // pfEditDateTime(false)
    }
    else if (data.NEEDDATETIME == true) {
        // pfEditDateTime(false)
    }
    else { pfCheckFreeItemList(data); }
    return true;

}

function pfConfirmAddressChange(flag) {
    $('#ConfirmAddressModal').modal('hide');
    if (flag == false) {
        pfEditAddress();
    } else {
        var formData = JSON.stringify($('#ConfirmAddressForm').serializeArray());
        pfPost({
            type: "POST", url: pfUrl, dataType: 'json', data: formData,
            success: function (data) {
                //$('#ConfirmAddressModal').modal('hide');
                pfAddressConfirmed = true;
                pfUpdatePayment(true);
            },
            error: function (request, status, error) {
                pfAppleSpinOff();
                var jsonError = jQuery.parseJSON(request.responseText);
                var PaymentError = jsonError;
                if (PaymentError.ERRORTEXT != undefined) {
                    pfAlert("OOPS!", PaymentError.ERRORTEXT);
                } else {
                    pfAlert("Houston, we have a problem!", "Internal Error")
                }
                return false;
            }
        });
    }
}


function pfPopulateGiftCart(alldata) {
    var CheckOutOK = false;
    var data = alldata.CART;
    $("#itemTable").html('');
    $("#cartHeaderTotal").html('$ ' + data.GRANDTOTAL);
    $("#cartFoodTotal").html(data.FOODTOTAL);
    $("#cartDeliveryFee").html(data.DELIVERYFEE);
    $("#cartPackingFee").html(data.PACKINGFEE);
    $("#cartFuelSurcharge").html(data.FUELSURCHARGE);
    $("#cartOrderTotal").html(data.ORDERTOTAL);
    $("#cartSalesTax").html(data.SALESTAX);
    $("#cartConvFee").html(data.CONVFEE);
    $("#cartDiscounts").html(data.DISCOUNTS);
    $("#cartGrandTotal").html(data.GRANDTOTAL);
    $("#cartDriverTip").html(data.DRIVERTIP);


    if (data.DELIVERYFEE == '0.00' && data.PICKUPDELIVERYTEXT != 'delivery') { $("#lineDeliveryFee").hide(); } else { $("#lineDeliveryFee").show(); }
    if (data.FUELSURCHARGE != '0.00') { $("#lineFuelSurcharge").show(); } else { $("#lineFuelSurcharge").hide(); }
    if (data.PACKINGFEE != '0.00') { $("#linePackingFee").show(); } else { $("#linePackingFee").hide(); }
    if (data.CONVFEE != '0.00') { $("#lineConvFee").show(); } else { $("#lineConvFee").hide(); }
    if (data.DISCOUNTS != '0.00') { $("#lineDiscounts").show(); } else { $("#lineDiscounts").hide(); }


    if (data.PICKUPDELIVERYTEXT == 'delivery') {
        $("#lineDriverTip").show();
        $("#lineGrandTotal").show();
        $("#cartAddressWarning").hide();
    }
    else {
        $("#lineDriverTip").hide();
        $("#lineGrandTotal").hide();
    }

    var pfItem = [];
    var cartRestCount = 0;
    $.each(data.RESTAURANTS, function (id, option) {
        cartRestCount++;
        pfItem.push('<tr class="bg-info"><td colspan="2" class="panel-heading2 accordion-toggle" data-toggle="collapse" data-parent="#itemTable" ');
        pfItem.push('data-target="#cartRest' + cartRestCount + '" id="cartRestHead' + cartRestCount + '">');
        pfItem.push('<b><span class="glyphicon glyphicon-cutlery"></span>&nbsp; ' + option.RESTAURANTNAME + '</b></td></tr>');
        pfItem.push('<tr id="cartRest' + cartRestCount + '"><td colspan="2"><table class="table table-condensed" style="background: #f7f7f7;">');

        $.each(option.ITEMS, function (id, option) {
            CheckOutOK = true;
            pfItem.push('<tr><td valign="top" colspan="2" style="border:0;"><div class="row">');
            pfItem.push('<div class="col-xs-8"><b>' + option.ITEMNAME + '</b></div><div class="col-xs-4 text-right">');
            pfItem.push('<b>(' + option.QTY + ') $' + option.PRICE + '</b>&nbsp;<a class="glyphicon glyphicon-remove text-danger" href="#" ');
            pfItem.push('onClick="pfDeleteItem(\'' + option.LOCATOR + '\'); return false;"></a></div></div>');
            if (CheckNull(option.DETAILS) != '') { pfItem.push('<span class="small">' + option.DETAILS + '</span>'); }
            pfItem.push('</td></tr>');
        });
        pfItem.push('</table></td></tr>');
    });
    if (cartRestCount == 0) { pfItem.push('<tr><td colspan="2" class="text-center"><h4>Your cart is empty!</h4></td></tr>'); }
    pfItem.push('</tbody>');
    $("#itemTable").append(pfItem.join(''));

    $("#cartWarning").html('');
    if (CheckOutOK == true) { $("#opCheckoutButton").html('<a class="btn btn-success" href="/Checkout">CHECKOUT</a>'); }
    return true;

}




function pfEditItem(WindowID, ID, Locator) {


    // Removed by Scott 3/14/2019
    //if (pfValidAddress == false && pfAddressEmpty == true) {
    pfNeedItem = ID;
    //    pfEditAddress();
    //    return false;
    //}




    document.getElementById('MenuOptionWell-EDIT').innerHTML = "Loading ... Please Hold.";
    //window.scrollTo(0, getElementPosition("orderpage-menu-item-" + WindowID).top - pfFixedHeaderHeight);
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"GETMENUITEM","MENUITEMTOKEN":"' + ID + '","LOCATOR":"' + Locator + '"}',
        success: function (data) {
            if (data.ACTION == 'LOGIN') {
                pfOpenLogin();
            } else if (data.ACTION == 'ADDRESS') {
                pfEditAddress();
            } else {
                pfNeedItem = ''; // Ensure we don't get caught in an endless loop
                $('#EditItemModal').modal('show');
                pfPopulateItem(data.MENUITEM, 'EDIT', ID);
            }
        },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); document.getElementById('MenuOptionWell-EDIT').innerHTML = jsonError.ERROR; }
    });
}

/*
function pfEditItem(WindowID, ID, Locator) {


    if (pfCurrentItemWindow != '') { $('#' + pfCurrentItemWindow).collapse('hide') }

    if (pfValidAddress == false && pfAddressEmpty == true) { pfNeedItem = ID; pfEditAddress(); return false; }

    pfCurrentItemWindow = 'MenuOption-' + WindowID;
    $('#' + pfCurrentItemWindow).collapse('show')
    document.getElementById('MenuOptionWell-' + WindowID).innerHTML = "Loading ... Please Hold.";
    window.scrollTo(0, getElementPosition("orderpage-menu-item-" + WindowID).top - pfFixedHeaderHeight);
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"GETMENUITEM","MENUITEMTOKEN":"' + ID + '","LOCATOR":"' + Locator + '"}',
        success: function (data) { pfPopulateItem(data.MENUITEM, WindowID, ID); },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); document.getElementById('MenuOptionWell-' + WindowID).innerHTML = jsonError.ERROR; }
    });
}
*/

function pfDeleteItem(OrderToken) {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"DELETEITEM","LOCATOR":"' + OrderToken + '"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('GET CART ERROR: ' + jsonError.ERROR);
            pfClosePop();
        },
        success: function (data) {
            if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); }
            if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }
        }
    });

}

function pfDriverTip() {
    pfTipDollarStart = $("#tipDollar").val();
    pfTipPercentStart = $("#tipPercent").val();
    $('#pfModalTip').modal('show');
}
function pfDriverTipCancel() {
    $('#pfModalTip').modal('hide');
    $("#tipDollar").val(pfTipDollarStart);
    $("#tipPercent").val(pfTipPercentStart);
}
function pfNoTip() {
    $("#tipDollar").val('-1');
    $("#tipPercent").val('-1');
    pfChangeTip();
}

function pfChangeTip() {
    var formData = JSON.stringify($('#TipForm').serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('GET CART ERROR: ' + jsonError.ERROR);
            pfClosePop();
        },
        success: function (data) {
            if (pfCurrentPage == 'ORDERPAGE') { pfPopulateCart(data); }
            if (pfCurrentPage == 'CHECKOUT') { pfPopulateCartCheckOut(data); }
        }
    });
    $('#pfModalTip').modal('hide');
}

function pfCancelEditItem() {
    $('#EditItemModal').modal('hide');
    //if (pfCurrentItemWindow != '') { $('#' + pfCurrentItemWindow).collapse('hide'); pfCurrentItemWindow = ''; }
    //else {  $('#MenuOptionWell-EDIT').collapse('hide'); $('#MenuOptionWell-EDIT').html('');  }
}



function pfGetCartCheckOut() {
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: '{"OPERATION":"GETCART"}',
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            alert('GET CART ERROR: ' + jsonError.ERROR);
            pfClosePop();
        },
        success: function (data) { pfPopulateCartCheckOut(data); if (pfNeedRoom == true) { pfAppleSpinOff(); pfEditAddress(); } }
    });

}

function getElementPosition(elemID) {
    var offsetTrail = document.getElementById(elemID); var offsetTop = 0;
    while (offsetTrail) { offsetTop += offsetTrail.offsetTop; offsetTrail = offsetTrail.offsetParent; }
    if (navigator.userAgent.indexOf('Mac') != -1 && typeof document.body.leftMargin != 'undefined') { offsetTop += document.body.topMargin; }
    return { top: offsetTop };
}


function pfPopulateCartCheckOut(alldata) {

    pfOpenPaymentID = '';
    var data = alldata.CART;
    pfHotelID = data.HOTELID;
    pfOrderMethod = data.ORDERMETHOD;
    pfValidAddress = data.OKADDRESS;

    $("#cartHeaderTotal").html('$ ' + data.GRANDTOTAL);
    $("#cartCustomerName").html(data.CUSTOMERNAME);
    $("#cartPhone").html(data.PHONE);
    if (data.HOTELID > 0) {
        $("#cartAddressLine1").html(data.HOTELNAME);
        $("#cartAddressLine2").html(data.ADDRESSLINE1 + "<br>" + data.ADDRESSLINE2 + "<br>");
        if (data.HOTELROOM != '') { $("#cartAddressLine3").html("ROOM # " + data.HOTELROOM); } else { pfNeedRoom = true; $("#cartAddressLine3").html('<a href="#" onClick="pfEditAddress(); return false;">Click to Enter Room Number</a>'); }
    }
    else {
        $("#cartAddressLine1").html(data.ADDRESSLINE1);
        $("#cartAddressLine2").html(data.ADDRESSLINE2);
        $("#cartAddressLine3").html('');
    }
    $("#cartDate").html(data.SCHEDULEDDATE);
    $("#cartTime").html('at ' + data.SCHEDULEDTIME);
    $("#driverInstructions").html(data.DRIVERINSTRUCTIONS);
    $("#restaurantInstructions").html(data.RESTAURANTINSTRUCTIONS);
    $("#attendanceCount").val(data.ATTENDANCECOUNT);
    $("#po").val(data.PO);
    $("#tipDollar").val(data.DRIVERTIPFLAT);
    $("#tipPercent").val(data.DRIVERTIPPERCENT);
    if (data.TIPADD10 == true) { $("#tipAdd10").show(); } else { $("#tipAdd10").hide(); }
    if (data.TIPADD12 == true) { $("#tipAdd12").show(); } else { $("#tipAdd12").hide(); }
    if (data.TIPADD15 == true) { $("#tipAdd15").show(); } else { $("#tipAdd15").hide(); }
    if (data.TIPADD18 == true) { $("#tipAdd18").show(); } else { $("#tipAdd18").hide(); }
    if (data.TIPADD20 == true) { $("#tipAdd20").show(); } else { $("#tipAdd20").hide(); }
    if (data.TIPADD25 == true) { $("#tipAdd25").show(); } else { $("#tipAdd25").hide(); }
    if (data.ALLOWNOTIP == true) { $("#tipNoTip").show(); } else { $("#tipNoTip").hide(); }

    if (pfOrderMethod == 'GiftCardOrder') {
        $("#cartTime").html('');
        $("#cartOrderType").html('Gift Card Order');
        $("#cartOrderType2").html('');
    } else if (pfOrderMethod == 'GroupOrder') {
        $("#cartOrderType").html('Group Order');
        $("#cartOrderType2").html('Deliver');
    } else if (data.PICKUPDELIVERYTEXT == 'delivery') {
        $("#cartOrderType").html('Delivery Order');
        $("#cartOrderType2").html('Deliver');
    }
    else {
        $("#cartOrderType").html('Takeout Order');
        $("#cartOrderType2").html('Pick up');
    }

    if (data.EXISTINGORDER == true) {
        $("#pfMyOrder").html('Editing Order #' + data.ORDERNUMBER);
        $("#CancelOrder").hide();
        $("#CancelChanges").show();
    } else {
        $("#pfMyOrder").html('Order CheckOut');
        $("#CancelOrder").show();
        $("#CancelChanges").hide();
    }


    var pfItem = [];
    var cartRestCount = 0;
    var pfPaymentToEdit = '';
    pfItem.push('<tr class="bg-info"><td colspan="3" class="panel-heading text-center"><h4 class="panel-title"><b>Order Detail</b></h4></td></tr>');

    $.each(data.RESTAURANTS, function (id, option) {
        cartRestCount++;
        pfItem.push('<tr class=""><td colspan="2" class="lead border-bottom">');
        pfItem.push('<b><span class="glyphicon glyphicon-cutlery"></span>&nbsp;' + option.RESTAURANTNAME + '</b></td></tr>');

        $.each(option.ITEMS, function (id, option) {
            pfItem.push('<tr class=""><td>');
            pfItem.push('<a href="/MyOrder" onclick="pfDeleteItem(\'' + option.LOCATOR + '\'); return false;"><i class="fa fa-trash" title="Remove Item"></i></a>&nbsp;&nbsp;');
            if (option.ITEMNAME == 'Gift Card') {
                pfItem.push('&nbsp;&nbsp;');
            } else {
                pfItem.push('<a href="/MyOrder" onClick="pfEditItem(\'EDIT\',\'EDIT\',\'' + option.LOCATOR + '\'); return false;"><i title="Edit Item" class="fa fa-edit"></i></a>');
            }
            pfItem.push('&nbsp;&nbsp;<b>' + option.ITEMNAME + '</b>');
            if (CheckNull(option.MODIFIERINFORMATION) != '') { pfItem.push('<span class="small"><br />' + option.MODIFIERINFORMATION + '</span>'); }
            pfItem.push('</td><td style="vertical-align: top; text-align: right; min-width: 175px !important;"> (' + option.QTY + ') <b>$ ' + option.PRICE + '</b>&nbsp;');
            pfItem.push('</td></tr>');
        });
    });

    var HeaderShown = false;
    $.each(data.COUPONS, function (id, option) {
        if (HeaderShown == false) {
            cartRestCount++;
            pfItem.push('<tr class="bg-info"><td colspan="2" class="panel-heading text-center"><h4 class="panel-title"><b>Coupons Applied</b></h4></td></tr>');
            HeaderShown = true;
        }

        pfItem.push('<tr class=""><td><b>' + option.COUPONNAME + '</b>');
        pfItem.push('</td><td style="vertical-align: top; text-align: right; min-width: 200px !important;"> <b>$ ' + option.PRICE + '</b>&nbsp;');
        pfItem.push('&nbsp;&nbsp;<a href="#" onclick="pfDeleteItem(\'' + option.LOCATOR + '\'); return false;"><i class="fa fa-trash" title="Remove Coupon"></i></a>&nbsp;');
        pfItem.push('&nbsp;&nbsp;<a href="#" onclick="return false;"><span class="glyphicon glyphicon-none"></span></a></td></tr>');
    });


    if (data.FOODTOTAL != '0.00') {
        pfItem.push('<tr class="border-top"><td style="text-align: right;">Sub-Total:</td><td style="text-align: right; font-weight: bold;">$ ');
        pfItem.push(data.FOODTOTAL + '&nbsp;</td></tr>');
    }

    if (data.DELIVERYFEE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Delivery Fee:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.DELIVERYFEE + '&nbsp;</td></tr>');
    }

    if (data.CONVFEE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Conv. Fee:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.CONVFEE + '&nbsp;</td></tr>');
    }

    if (data.DISCOUNTS != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; color:red;">Coupons:</td><td style="text-align: right; border-top: 0; font-weight: bold; color: red;">$ ');
        pfItem.push(data.DISCOUNTS + '&nbsp;</td></tr>');
    }

    pfItem.push('<tr><td style="text-align: right; border-top: 0;">Sales Tax:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
    pfItem.push(data.SALESTAX + '&nbsp;</td></tr>');

    if (data.CREDITSUSED != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; color:red;">Credits Applied:</td><td style="text-align: right; border-top: 0; font-weight: bold; color: red;">$ ');
        pfItem.push(data.CREDITSUSED + '&nbsp;</td></tr>');
    }

    if (data.DRIVERTIP != '0.00' || data.ORDERMETHOD == 'Delivery' || data.ORDERMETHOD == 'GroupOrder') {
        var pfDriverTipText = pfTipTitle;
        if (data.TIPPAIDBYCOMPANY === true) {
            pfItem.push('<tr><td style="text-align:right; color:red; border-top: 0;">' + data.TIPMESSAGE + '</td></tr>');
            pfDriverTipText = 'Additional ' + pfTipTitle;
            $("#TipPaidByCompanyModal").show();
        } else {
            $("#TipPaidByCompanyModal").hide();
        }

        pfItem.push('<tr><td style="text-align: right; border-top: 0;"><button id="TipButton" class="btn btn-xs btn-success" onClick="pfDriverTip(); return false;">' + pfDriverTipText + '</button></td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.DRIVERTIP + '&nbsp;</td></tr>');
    }




    pfItem.push('<tr><td style="text-align: right; border-top: 0;">Grand Total:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
    pfItem.push(data.GRANDTOTAL + '&nbsp;</td></tr>');

    if (data.ADMINSHARE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; color:red;">Paid by your company:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.ADMINSHARE + '&nbsp;</td></tr>');
    }

    if (data.MEMBERDUE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Your Share:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.MEMBERDUE + '&nbsp;</td></tr>');
    }


    pfItem.push('<tr class="bg-info"><td colspan="2" class="panel-heading text-center"><h4 class="panel-title"><b>Payment Information</b></h4></td></tr>');

    $("#cartItems").html('');
    $("#cartItems").append(pfItem.join(''));

    var pfItem = [];
    var pCount = 0;
    var xcvv = '';

    pfCloseNewCard();

    pfClosePayment();

    $.each(data.PAYMENTS, function (id, option) {
        pCount++;
        var ShowNewPayment = false;
        if (option.VALID != true) { pfPaymentToEdit = option.LOCATOR; pfPaymentLabelToEdit = option.AMOUNT; }
        if (parseInt(option.AMOUNT, 10) > 0) {
            pfItem.push('<tr id="payment' + pCount + '"><td style="text-align: right; border-top: 0;">');
            pfItem.push('<a href="#" onclick="return false;"><i class="fa fa-trash" title="Remove Payment"></i></a>');
            pfItem.push('&nbsp;&nbsp;<a href="#" onclick="pfOpenPayment(\'' + option.LOCATOR + '\',\'' + option.AMOUNT + '\'); return false;"><i class="fa fa-edit" title="Edit Payment"></i></a>&nbsp;&nbsp;');
            pfItem.push(option.DESCRIPTION + '</td>');
            pfItem.push('<td style="text-align: right; border-top: 0; font-weight: bold;"><span style="color: red;">$ ' + option.AMOUNT + '</span></td></tr>');
        }
    });

    $("#cartPmts").html('');
    $("#cartPmts").append(pfItem.join(''));

    if (pfPaymentToEdit != '') { pfOpenPayment(pfPaymentToEdit, pfPaymentLabelToEdit); }

    if (pfOrderMethod == 'GroupOrder') {
        $("#chkPORow").hide();
        $("#chkInstRow").hide();
        $("#chkEditAddress").hide();
        $("#chkEditDateTime").hide();
        $("#chkNoCoupon").hide();
        $("#chkCoupon").show();
    } else if (pfOrderMethod == 'GiftCardOrder') {
        $("#chkPORow").hide();
        $("#chkInstRow").hide();
        $("#chkEditAddress").hide();
        $("#chkEditDateTime").hide();
        $("#chkNoCoupon").show();
        $("#chkCoupon").hide();

    } else {
        $("#chkPORow").show();
        $("#chkInstRow").show();
        $("#chkEditAddress").show();
        $("#chkEditDateTime").hide();
        $("#chkNoCoupon").hide();
        $("#chkCoupon").show();
    }


    if (data.TIMELEFT > 0 && pfCartWarn5 == false) {
        try {
            clearInterval(pfCartTimer);
        }
        catch (err) { }
        pfCartTimeLeft = data.TIMELEFT * 60;
        pfCartTimer = setInterval(pfShowGroupAlert, 10000);
    }

    if (data.OKADDRESS == false) { pfEditAddress(); }
    else { pfCheckFreeItemList(data); }

    return true;

}

function pfShowGroupAlert() {
    pfCartTimeLeft = pfCartTimeLeft - 10;
    if (pfCartTimeLeft < 0) {
        $("#cartWarnDateTime").html('Group Order has closed!');
        $("#cartWarnDateTimeWrapper").show();
    } else if (pfCartTimeLeft < 300) {
        if (pfCartTimeLeft > 59) {
            var num = pfCartTimeLeft / 60;
            var mess = 'Group Order Closes in ' + num.toFixed(0) + ' minutes.';
        } else {
            var mess = 'Group Order Closes in ' + pfCartTimeLeft + ' seconds!';
        }

        if (pfCartWarn5 == false) { pfAlert('Order Closing', mess); }
        pfCartWarn5 = true;
        $("#cartWarnDateTime").html(mess);
        $("#cartWarnDateTimeWrapper").show();
    }
}

var pfCVV2x = false; var pfCVV2y = false;
function pfGetCVV2(x, y) { pfCVV2x = x; pfCVVyx = y; $("#pfCurrentCVV2Code").val(''); $("#pfGetCVV2Box").modal({ backdrop: 'static', keyboard: false }); return true; }
function pfSaveCVV2() { }

function pfPopulateCartSummary(alldata) {
    var data = alldata.CART;
    pfHotelID = data.HOTELID;
    pfOrderMethod = data.ORDERMETHOD;

    $("#cartOrderID").html(data.ORDERID);
    $("#cartHeaderTotal").html('');
    $("#cartCustomerName").html(data.CUSTOMERNAME);
    $("#cartPhone").html(data.PHONE);
    if (data.HOTELID > 0) {
        $("#cartAddressLine1").html(data.HOTELNAME);
        $("#cartAddressLine2").html(data.ADDRESSLINE1);
        $("#cartAddressLine3").html(data.ADDRESSLINE2 + "<br>ROOM # " + data.HOTELROOM);
    }
    else {
        $("#cartAddressLine1").html(data.ADDRESSLINE1);
        $("#cartAddressLine2").html(data.ADDRESSLINE2);
        $("#cartAddressLine3").html('');
    }
    $("#cartDriverTip").html(data.DRIVERTIP);
    $("#cartDate").html(data.SCHEDULEDDATE);
    $("#cartTime").html('at ' + data.SCHEDULEDTIME);
    if (data.DRIVERINSTRUCTIONS != '') { $("#IsDriverInstructions").show(); }
    if (data.RESTAURANTINSTRUCTIONS != '') { $("#IsRestaurantInstructions").show(); }
    if (data.PO != '') { $("#IsPO").show(); }
    if (data.ATTENDANCECOUNT != '') { $("#IsAttendanceCount").show(); }
    $("#DriverInstructions").html(data.DRIVERINSTRUCTIONS);
    $("#RestaurantInstructions").html(data.RESTAURANTINSTRUCTIONS);
    $("#attendanceCount").html(data.ATTENDANCECOUNT);
    $("#po").html(data.PO);
    $("#cartFinePrint").html(data.FINEPRINT);

    if (pfOrderMethod == 'GiftCardOrder') {
        $("#cartTime").html('');
        $("#cartOrderType").html('Gift Card Order');
        $("#cartOrderType2").html('');
    } else if (pfOrderMethod == 'GroupOrder') {
        $("#cartOrderType").html('Group Order');
        $("#cartOrderType2").html('Deliver');
    } else if (data.PICKUPDELIVERYTEXT == 'delivery') {
        $("#cartOrderType").html('Delivery Order');
        $("#cartOrderType2").html('Deliver');
    }
    else {
        $("#cartOrderType").html('Takeout Order');
        $("#cartOrderType2").html('Pick up');
    }

    var pfItem = [];
    var cartRestCount = 0;
    var pfPaymentToEdit = 0;
    pfItem.push('<tr class="bg-info"><td colspan="3" class="panel-heading text-center"><h4 class="panel-title"><b>Order Detail</b></h4></td></tr>');

    $.each(data.RESTAURANTS, function (id, option) {
        cartRestCount++;
        pfItem.push('<tr class=""><td colspan="2" class="lead border-bottom">');
        pfItem.push('<b><span class="glyphicon glyphicon-cutlery"></span>&nbsp;' + option.RESTAURANTNAME + '</b></td></tr>');

        $.each(option.ITEMS, function (id, option) {
            pfItem.push('<tr class=""><td><b>' + option.ITEMNAME + '</b>');
            if (CheckNull(option.MODIFIERINFORMATION) != '') { pfItem.push('<br /><span class="small">' + option.MODIFIERINFORMATION + '</span>'); }
            pfItem.push('</td><td style="vertical-align: top; text-align: right;"> (' + option.QTY + ') <b>$ ' + option.PRICE + '</b>&nbsp;');
            pfItem.push('&nbsp;&nbsp;</td></tr>');
        });
    });


    var HeaderShown = false;
    $.each(data.COUPONS, function (id, option) {
        if (HeaderShown == false) {
            cartRestCount++;
            pfItem.push('<tr class="bg-info"><td colspan="2" class="panel-heading text-center"><h4 class="panel-title"><b>Coupons Applied</b></h4></td></tr>');
            HeaderShown = true;
        }

        pfItem.push('<tr class=""><td><b>' + option.COUPONNAME + '</b>');
        pfItem.push('</td><td style="vertical-align: top; text-align: right;"> <b>$ ' + option.PRICE + '</b>&nbsp;');
        pfItem.push('&nbsp;&nbsp;<a href="#" onclick="pfDeleteItem(\'' + option.LOCATOR + '\'); return false;"><span class="red glyphicon glyphicon-remove-circle"></span></a>&nbsp;');
        pfItem.push('&nbsp;&nbsp;<a href="#" onclick="return false;"><span class="glyphicon glyphicon-none"></span></a></td></tr>');
    });


    if (data.FOODTOTAL != '0.00') {
        pfItem.push('<tr class="border-top"><td style="text-align: right;">Food Total:</td><td style="text-align: right; font-weight: bold;">$ ');
        pfItem.push(data.FOODTOTAL + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    if (data.DELIVERYFEE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Delivery Fee:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.DELIVERYFEE + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    if (data.CONVFEE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Conv. Fee:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.CONVFEE + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    if (data.FUELSURCHARGE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Fuel Surcharge:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.FUELSURCHARGE + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    if (data.DISCOUNTS != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; color: red;">Discounts:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.DISCOUNTS + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    pfItem.push('<tr><td style="text-align: right; border-top: 0;">Sales Tax:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
    pfItem.push(data.SALESTAX + '&nbsp;&nbsp;&nbsp;</td></tr>');

    if (data.CREDITSUSED != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; color: red;">Credits Applied:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.CREDITSUSED + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    if (data.DRIVERTIP != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; ">' + pfTipTitle + ':</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.DRIVERTIP + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }


    pfItem.push('<tr><td style="text-align: right; border-top: 0;">Grand Total:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
    pfItem.push(data.GRANDTOTAL + '&nbsp;&nbsp;&nbsp;</td></tr>');

    if (data.ADMINSHARE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0; color:red;">Paid by your company:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.ADMINSHARE + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    if (pfOrderMethod == 'GroupOrder' && data.MEMBERDUE != '0.00') {
        pfItem.push('<tr><td style="text-align: right; border-top: 0;">Your Share:</td><td style="text-align: right; border-top: 0; font-weight: bold;">$ ');
        pfItem.push(data.MEMBERDUE + '&nbsp;&nbsp;&nbsp;</td></tr>');
    }

    var pCount = 0;

    $.each(data.PAYMENTS, function (id, option) {
        if (parseInt(option.AMOUNT, 10) > 0) {
            pfItem.push('<tr class="red" id="payment' + pCount + '"><td style="text-align: right; border-top: 0;">' + option.DESCRIPTION + '</td>');
            pfItem.push('<td style="text-align: right; border-top: 0; font-weight: bold;"><span style="color: red;">$ ' + option.AMOUNT + '</span>');
            pfItem.push('&nbsp;&nbsp;&nbsp;</td></tr>');
        }
    });

    $("#cartItems").html('');
    $("#cartItems").append(pfItem.join(''));

    if (pfPaymentToEdit != 0) { pfOpenPayment(pfPaymentToEdit, pfPaymentLabelToEdit); }

    if (pfOrderMethod == 'GroupOrder') {
        $("#chkPORow").hide();
        $("#chkInstRow").hide();
        $("#chkEditAddress").hide();
        $("#chkEditDateTime").hide();
        $("#chkNoCoupon").hide();
        $("#chkCoupon").show();
    } else if (pfOrderMethod == 'GiftCardOrder') {
        $("#chkPORow").hide();
        $("#chkInstRow").hide();
        $("#chkEditAddress").hide();
        $("#chkEditDateTime").hide();
        $("#chkNoCoupon").show();
        $("#chkCoupon").hide();

    } else {
        $("#chkPORow").show();
        $("#chkInstRow").show();
        $("#chkEditAddress").show();
        $("#chkEditDateTime").hide();
        $("#chkNoCoupon").hide();
        $("#chkCoupon").show();
    }


    return true;

}

function ScrollToMenuSection(elementName) {
    try {
        var e = document.getElementById(elementName);
        e.scrollIntoView({ block: 'center', behavior: 'smooth' });
    } catch (err) {
        alert("pfError:" + err);
    }
}

function TogglePanel(ID) { $(ID).collapse('toggle'); }

function PopulateMenu(alldata) {


    var data = alldata.MENU;
    $("#menuContainer").html("");
    $("#menuRestaurantName").html(data.RESTAURANTNAME);
    if (data.NOFILTERS == true) { $("#menuFilter").hide(); } else { $("#menuFilter").show(); }
    //$("#menuServices").html(data.SERVICES);
    $("#menuAddressLine1").html(data.ADDRESSLINE1);
    $("#menuAddressLine2").html(data.ADDRESSLINE2);
    $("#menuBlurb").html(data.BLURB);
    $("#menuLogo").attr("src", data.LOGO);
    $("#menuLogo").attr("alt", data.RESTAURANTNAME + ' logo');
    $("#menuPDF").attr("href", data.MENUPDF);
    $("#menuCuisines").html(data.CUISINES);
    if (data.FACEBOOKLIKEHREF != '' && data.FACEBOOKLIKEHREF != undefined) {
        $("#fbLike").attr("data-ref", data.FACEBOOKLIKEHREF)
        $("#fbLikeWrapper").show();
    } else {
        $("#fbLikeWrapper").hide();
    }

    var toc = [];
    $.each(data.TOC, function (id, option) {
        toc.push('<li class="pfTocLink"><a href="#" onclick="ScrollToMenuSection(\'MGS-' + option.GROUPNUMBER + '\'); return false;">' + option.GROUPNAME + '</a></li>');
    });
    $("#pfMenuTOC").html('');
    $("#pfMenuTOC").append(toc.join(''));

    //$("#").html(data.);	

    var groups = [];
    var GroupNumber = 0;
    $.each(data.MENUGROUPS, function (id, option) {
        GroupNumber++;
        groups.push('<div name="MenuGroupSection" class="panel panel-default" id="MGS-' + option.GROUPNUMBER + '">'); // Open Panel

        // Open Panel Heading
        groups.push('<div style="cursor: pointer;" class="panel-heading accordion-toggle" data-toggle="collapse" data-parent="#menuContainer1" data-target="#collapse-' + GroupNumber + '" href="#collapse-' + GroupNumber + '" role="tab" id="menuGroup-' + GroupNumber + '" >');
        groups.push('<h4 class="panel-title"><b>'); // Open Panel Title
        groups.push(option.GROUPNAME);
        if (option.DESCRIPTION != '') {
            groups.push('<br /><div class="small pfWhiteDetail1" >' + option.DESCRIPTION + '</div>');
        }
        groups.push('</b></h4>'); // Close Panel Title
        groups.push('</div>'); // Close Panel Heading
        groups.push('</div>'); // Close Panel

        // Section Collapse
        if (GroupNumber == 1) {
            groups.push('<div id="collapse-' + GroupNumber + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="menuGroup-' + GroupNumber + '">');
        } else {
            groups.push('<div id="collapse-' + GroupNumber + '" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="menuGroup-' + GroupNumber + '">');
        }

        // Open Section Div
        groups.push('<div class="row" >');

        //groups.push('<div class="panel-body1 list-group">');
        $.each(option.ITEMS, function (id, option) {

            groups.push('<div class="col-sm-6 col-lg-4 margin-bottom-box list-group-item-filter">'); // Open Item Box
            groups.push('<div class="panel panel-default">') // Open Panel
            groups.push('<div class="panel-body pfItem " >') // Open Panel Body
            groups.push('<a href="#" onClick="pfAddItem(\'' + option.MENUITEMTOKEN + '\'); return false;">'); // Open anchor
            groups.push('<div class="pull-right"><b>&nbsp;' + option.PRICE + '</b></div>');
            groups.push('<div class="text-overflow margin-bottom-box"><b>' + option.MENUITEMNAME + '</b></div>');

            groups.push('<div class="orderpage-menu-item-detail" style="width: 100%;  ">'); // Open Fixed Height Div

            //groups.push('<a class="pfItemMore" href="#" onclick="pfItemMore(this); return false;" style="display:none;">More</a>');


            if (option.IMAGENAME != '') { groups.push('<div class="pull-left"><img style="margin-right: 5px; height: 80px;" src="' + option.IMAGENAME + '"></div>'); }

            if (option.DESCRIPTION != '') { '<span class="text-overflow-multi">' + groups.push(option.DESCRIPTION + '</span>'); }

            groups.push('</div>'); // Closed fixed-height div

            groups.push('<div style="height: 20px; overflow: hidden;">') // Open Spicy line

            if (option.POPULAR == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-thumbs-up red"></i>'); }
            if (option.SPICY == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-fire red"></i>'); }
            if (option.GLUTENFREE == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-heart-o red"></i>'); }
            if (option.HEALTHY == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-heart red"></i>'); }
            if (option.VEGGIE == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-leaf green"></i>'); }

            groups.push('</div>'); // Close Spicy Line
            groups.push('</a>'); // Close Panel Body
            groups.push('</div>'); // Close Panel Body
            groups.push('</div>'); // Close Panel
            groups.push('</div>'); // Close Item Box
            /*
            groups.push('<div class="col-sm-6 col-lg-4 margin-bottom-box">'); // Open Item Box
            groups.push('<a href="#" onClick="pfAddItem(\'' + option.MENUITEMTOKEN + '\'); return false;">');

            // Open Item Box with Border
            groups.push('<div class="ord2erpage-menu-item1 border" style="height: 100px !important; overflow: hidden; "  id="orderpage-menu-item-' + option.MENUITEMTOKEN + '">'); 

            // Item Table
            
            groups.push('<table width="100%"><tr>'); 
            if (option.IMAGENAME == '') { '<td colspan="2" style="vertical-align: top;">' }
            else { groups.push('<td class="orderpage-menu-item-image"><img class="orderpage-menu-item-image-size" src="' + option.IMAGENAME + '"></td><td style="vertical-align: top;">'); }
            groups.push('<p class="orderpage-menu-item-name">' + option.MENUITEMNAME);
            if (option.POPULAR == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-thumbs-up red"></i>'); }
            if (option.SPICY == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-fire red"></i>'); }
            if (option.GLUTENFREE == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-heart-o red"></i>'); }
            if (option.HEALTHY == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-heart red"></i>'); }
            if (option.VEGGIE == true) { groups.push('&nbsp;&nbsp;<i class="fa fa-leaf green"></i>'); }
            groups.push('</p><p class="orderpage-menu-item-price">' + option.PRICE + '</p>');
            if (option.DESCRIPTION != '') { groups.push('<p class="orderpage-menu-item-detail">' + option.DESCRIPTION + '</p>'); }
            groups.push('</td></tr></table>');
            

            groups.push('</div>'); // Close Item Box with Border
            groups.push('</a>'); // Close anchor
            //groups.push('<div class="collapse" id="MenuOption-' + option.MENUITEMTOKEN + '">'); // Open Option
            //groups.push('<div class="well" id="MenuOptionWell-' + option.MENUITEMTOKEN + '"></div>'); // Option Well 
            //groups.push('</div>'); // Close Option
            groups.push('</div>'); // Close Item Box
            */

        });
        groups.push('</div>'); // Close Section Div
        groups.push('</div>'); // Close Section Collapse
    });
    $("#menuContainer").append(groups.join(''));

    var men = document.getElementsByClassName("orderpage-menu-item-detail");
    for (var g = 0; g < men.length; g++) {
        var item = men[g];

        //item.style.backgroundColor = 'yellow';
        if (isOverflown(item) == true) {
            //item.style.backgroundColor = 'red';
            for (var i = 0; i < item.childNodes.length; i++) {
                if (item.childNodes[i].className == 'pfItemMore') {
                    item.childNodes[i].style.display = 'block';
                }
            }
        }

    }

    var items = [];
    items.push('<table width="100%"><tr><td colspan="4" align="center"><b style="font-size: 1.2em;">Hours of Operation</b></td></tr>');
    items.push('<tr style="border-bottom: 1px solid gray;"><td></td><td align="center">Breakfast</td><td align="center">Lunch</td><td align="center">Dinner</td></tr>');

    $.each(data.HOURSOFOPERATION, function (id, option) {
        items.push('<tr><td align="center">' + option.DAY + '</td><td align="center">' + option.BREAKFAST + '</td>');
        items.push('<td align="center">' + option.LUNCH + '</td><td align="center">' + option.DINNER + '</td></tr>');
    });
    items.push('</table>');
    $("#menuHoursContainer").append(items.join(''));

    var items = [];
    items.push('<div id="pfc-group-toc-0" class="pfc-group-toc-on"><a href="#" onClick="ChooseAllGroups()">Entire Menu</a></div>');

    $.each(data.TOC, function (id, option) {
        items.push('<div id="pfc-group-toc-' + option.GROUPNUMBER + '" class="pfc-group-toc"><a href="#" onClick="ChooseGroup(' + option.GROUPNUMBER + ')">' + option.GROUPNAME + ' (' + option.ITEMCOUNT + ')</a></div>');
    });

    items.push('<input type="hidden" id="GroupCount" value="11">');
    $("#pfc-menu-toc").append(items.join(''));


    var tickler = data.TICKLERS;

    var items = [];
    items.push('<div id="tickler"><h4>Don\'t forget.....</h4>');

    items.push('<br><h4>Drinks!</h4><img class="tickler-image" src="https://cdn.pfcloud.net/common/images/Drinks.jpg" alt="Drinks Picture"><br>');
    $.each(tickler.DRINKS, function (id, option) {
        items.push('<div class="tickler-container"><div class="tickler-item">');
        items.push('<a href="#" onClick="pfEditItem(\'' + option.MENUITEMTOKEN + '\',\'' + option.MENUITEMTOKEN + '\',\'\'); return false;)" >' + option.ITEMNAME + '</a></div></div>');
        items.push('<div class="tickler-price">$' + option.PRICE + '</div></div>');
    });
    items.push('</div>');
    $("#menuTicklersContainer").append(items.join(''));

    filterMenu();

    //pfInsideSpinOff("#menuLoader");
    pfAppleSpinOff();

    return true;

}

function isOverflown(element) {
    return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
}
function filterMenu() {
    var incNone = false;
    var incSpicy = false; if ($('#menuSpicy').prop('checked') == true) { incSpicy = true }
    var incGlutenFree = false; if ($('#menuGlutenFree').prop('checked') == true) { incGlutenFree = true }
    var incHealthy = false; if ($('#menuHealthy').prop('checked') == true) { incHealthy = true }
    var incVeggie = false; if ($('#menuVeggie').prop('checked') == true) { incVeggie = true }
    var incPopular = false; if ($('#menuPopular').prop('checked') == true) { incPopular = true }
    if (incSpicy == false && incPopular == false && incHealthy == false && incVeggie == false && incGlutenFree == false) { incNone = true; }
    //incNone = true;

    $('.list-group-item-filter').each(function (i, obj) {
        var flag = false;
        if (incSpicy == true && $(obj).find("i").hasClass('fa-fire') == true) { flag = true; }
        if (incGlutenFree == true && $(obj).find("i").hasClass('fa-heart-o') == true) { flag = true; }
        if (incVeggie == true && $(obj).find("i").hasClass('fa-leaf') == true) { flag = true; }
        if (incHealthy == true && $(obj).find("i").hasClass('fa-heart') == true) { flag = true; }
        if (incPopular == true && $(obj).find("i").hasClass('fa-thumbs-up') == true) { flag = true; }
        if (incNone == true) { flag = true; }
        if (flag == true) { $(obj).show(); } else { $(obj).hide(); }
    });
}

function pfItemCheck() {
    for (xx = 1; xx <= pfOptCount; xx++) {
        for (yy = 1; yy <= document.getElementById('opt' + xx + 'count').value; yy++) {
            try {
                zz = document.getElementById('opt' + xx + 'choice' + yy + 'nest').value
                if (document.getElementById('opt' + xx + 'choice' + yy).checked == true) {
                    document.getElementById(zz).style.display = "block";
                }
                else {
                    document.getElementById(zz).style.display = "none";
                    /* Insert Code Here to uncheck all choices inside this level */

                }

            }
            catch (err) {

            }
        }
    }
    if (document.getElementById("ErrorSection").style.display == "block") {
        pfItemValidate(false);
    } else {
        pfItemValidate(true);
    }
}


function pfItemValidate(priceCheckOnly) {
    var ErrorMessage = "";
    var ErrorText = "";
    var ItemCount = 0;
    var RunningPrice = pfItemBasePrice;
    try {
        for (i = 1; i <= pfOptCount; i++) {
            ItemCount = 0;
            if ((document.getElementById('opt' + i + 'item').style.display != "none")) {
                for (a = 1; a <= document.getElementById('opt' + i + 'count').value; a++) {
                    if ($('#opt' + i + 'choice' + a).val() > 0) {
                        ItemCount = ItemCount + (parseInt(document.getElementById('weight' + i + 'choice' + a).value) * $('#opt' + i + 'choice' + a).val());
                        RunningPrice = RunningPrice + (CheckNullReal(document.getElementById('price' + i + 'choice' + a).value) * $('#opt' + i + 'choice' + a).val());
                    } else if (document.getElementById('opt' + i + 'choice' + a).checked == true) {
                        ItemCount = ItemCount + parseInt(document.getElementById('weight' + i + 'choice' + a).value);
                        RunningPrice = RunningPrice + CheckNullReal(document.getElementById('price' + i + 'choice' + a).value);
                    }
                }
                document.getElementById('opt' + i + 'info').style.color = "gray";
                if (ItemCount > document.getElementById('opt' + i + 'max').value) {
                    document.getElementById('opt' + i + 'info').style.color = "red";
                    ErrorMessage = ErrorMessage + ItemCount + '<br>'
                }
                if (ItemCount < document.getElementById('opt' + i + 'min').value) {
                    document.getElementById('opt' + i + 'info').style.color = "red";
                    ErrorMessage = ErrorMessage + ItemCount + '<br>'
                }
            }
            else if (document.getElementById('opt' + i + 'item').style.color != "green") {
                for (a = 1; a <= document.getElementById('opt' + i + 'count').value; a++) {
                    document.getElementById('opt' + i + 'choice' + a).checked = false;
                }
            }
        }

        $("#ItemPriceText").html('$' + CheckNullDollar(RunningPrice));


    } catch (err) {
        alert("E1:" + err);
    }
    oQTY = document.ItemForm.itemQTY.value;
    oMinQTY = document.ItemForm.MinimumQTY.value;
    oMaxQTY = document.ItemForm.MaximumQTY.value;
    oJCV = document.ItemForm.jobcode.value;


    if (parseInt(oQTY) < parseInt(oMinQTY)) {
        ErrorMessage = ErrorMessage + 'You must order at least ' + oMinQTY + ' of this item.'
        ErrorText = ErrorText + '<br>You must order at least ' + oMinQTY + ' of this item.'
    }
    if (parseInt(oQTY) > parseInt(oMaxQTY) && parseInt(oMaxQTY) > 0) {
        ErrorMessage = ErrorMessage + 'You cannot order more than ' + oMaxQTY + ' of this item.'
        ErrorText = ErrorText + '<br>You cannot order more than  ' + oMaxQTY + ' of this item.'
    }
    oJC = document.ItemForm.JobCodeRequired.value;
    if (oJC == 'true' || oJC == true) {
        if (oJCV.length == 0) {
            ErrorMessage = ErrorMessage + 'You must enter a job code.';
            ErrorText = ErrorText + '<br>You must enter a job code.';
        }

    }

    if (priceCheckOnly == true) { ErrorMessage = "" }

    if (ErrorMessage == "") {
        document.getElementById("ErrorSection").style.display = "none";
        return true;
    }
    else {
        document.getElementById("ErrorMessageText").innerHTML = "Please enter the required information" + ErrorText;
        document.getElementById("ErrorSection").style.display = "block";
        return false;
    }

}

function pfCancelRecurringOrder() {
    var formData = JSON.stringify($("#pfCancelRecurringOrderForm").serializeArray());
    $.ajax({
        type: "POST", url: pfUrl, dataType: 'json', data: formData,
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText); $("#pfCancelRecurringMessage").html('<h3>' + jsonError.ERROR + '</h3>'); $("#pfCancelRecurringContainer").html('');
        },
        success: function (data) {
            if (data.ERROR == '' || data.ERROR == 'OK') { $("#pfCancelRecurringContainer").html('<h3>' + data.MESSAGE + '</h3>'); }
            else { $("#pfCancelRecurringMessage").html('<h3>' + data.ERROR + '</h3>');; $("#pfCancelRecurringContainer").html('') }
        }
    });

}


function pfChangeQTY(x) { var z = parseInt($("#itemQTY").val()) + x; if (isNaN(z) || z < 1) { z = 1 }; if (z > 99) { z = 99 }; $("#itemQTY").val(z); }


var pfItemBasePrice = 0;

function pfPopulateItem(option, WindowID, ID) {
    try {
        pfItem = [];
        pfOptCount = 0;
        pfItemBasePrice = CheckNullReal(option.PRICE);
        //if (pfCurrentItemID != '') { $("#MenuOptionWell-" + pfCurrentItemID).html(''); }
        $("#MenuOptionWell-EDIT").html('');

        pfCurrentItemID = WindowID;
        pfItem.push('<form name="ItemForm" id="ItemForm" method="POST"> ');
        pfItem.push('<input type="hidden" name="Operation" value="SAVEITEM">');
        pfItem.push('<input type="hidden" name="MenuItemToken" value="' + ID + '">');
        pfItem.push('<input type="hidden" name="MinimumQTY" value="' + option.MINQTY + '">');
        pfItem.push('<input type="hidden" name="MaximumQTY" value="' + option.MAXQTY + '">');
        pfItem.push('<input type="hidden" name="JobCodeRequired" value="' + option.JOBCODEREQUIRED + '">');
        pfItem.push('<input type="hidden" name="Locator" value="' + option.LOCATOR + '">');
        pfItem.push('<h4 class="row border-bottom"> ');
        pfItem.push('<div class="col-xs-8">' + option.ITEMNAME + '</div><div id="ItemPriceText" class="col-xs-4 text-right ">$' + option.PRICE + '</div></h4>');
        pfItem.push('<div id="ErrorSection" class="pfc-item-error" style="display: none;"><h3>Oops! Your item is not yet complete.</h3><p id="ErrorMessageText">Error</p></div>');
        pfItem.push('<div class="row"><div class="col-xs-12 col-md-6">');
        if (option.MODIFIERS != undefined) {
            $.each(option.MODIFIERS, function (id, option) {
                pfDepth = 0;
                pfPopulateModifier(option);
            });
        }
        pfItem.push('</div><div class="row"><div class="col-xs-12 col-md-6">');

        pfItem.push('<div class="form-group form-group-sm"><textarea class="col-xs-12" rows="3" name="itemNotes" id="itemNotes">' + option.COMMENT + '</textarea><label class="small" for="itemNotes">Add a message or instructions.  Charges may apply.</label></div>');
        if (option.JOBCODEREQUIRED == true) { pfItem.push('<div class="form-group form-group-sm"><input class="form-control" type="text" maxlength="20" id="itmJobCode" value="' + option.JOBCODE + '" name="jobcode"><label class="small">Job Code (required)</label></div>'); }
        else { pfItem.push('<div class="form-group form-group-sm"><input class="form-control" type="text" maxlength="20" id="itmJobCode" value="' + option.JOBCODE + '" name="jobcode"><label class="small">Job Code (optional)</label></div>'); }
        pfItem.push('<div class="form-group form-group-sm"><input class="form-control" type="text" maxlength="30" value="' + option.CONSUMER + '" name="consumer"><label class="small">Who is this for? (optional)</label></div>');
        pfItem.push('<div class="row text-center">');
        pfItem.push('<div class="form-group form-group-sm has-success text-center" style="max-width: 125px; margin: auto; "><div class="input-group"><span class="input-group-addon" onclick="pfChangeQTY(-1);"><b>-</b></span>');
        pfItem.push('<input class="form-control" type="text" style="text-align: center;" maxlength="3" value="' + option.QTY + '" name="itemQTY" id="itemQTY"><span class="input-group-addon" onclick="pfChangeQTY(1);"><b>+</b></span></div><label class="small" for="itemQTY">Quantity?</label></div><br />');
        if (ID == 'EDIT') {
            pfItem.push('<input class="btn btn-success" type="submit" onClick="pfItemSubmit(); return false;" value="Save Changes" id="pfSubmitItem" name="pfSubmitItem"><br /> <br />');
            pfItem.push('<a class="link" href="#" onClick="pfCancelEditItem(); return false;")>cancel changes</a></div></div></div>');
            pfItem.push('</form>');

        } else {
            pfItem.push('<input class="btn btn-success" type="submit" onClick="pfItemSubmit(); return false;" value="Add to Order" id="pfSubmitItem" name="pfSubmitItem"><br /> <br />');
            pfItem.push('<a class="link" href="#" onClick="pfCancelEditItem(); return false;")>cancel item</a></div></div></div>');
            pfItem.push('</form>');
        }
        document.getElementById('MenuOptionWell-' + WindowID).innerHTML = ''
        $("#MenuOptionWell-" + WindowID).append(pfItem.join(''));

        pfItemCheck();


    } catch (err) { alert("pfPopulateItem Error: " + err.message); }
}

var pfCurrentPopOver = '';
function pfShowPopOver(id) {
    try {
        if (pfCurrentPopOver != '') { document.getElementById(pfCurrentPopOver).style.display = 'none'; }
        if (pfCurrentPopOver == id) { pfCurrentPopOver = ''; return false; }
    } catch (err) { }
    pfCurrentPopOver = id;
    $('#' + pfCurrentPopOver).show();
}

function pfPopulateModifier(modifier) {
    try {
        pfOptCount++;
        pfDepth++;

        var pfChoiceCount = 0;
        var pfCurrentOpt = pfOptCount;

        pfItem.push('<div id="opt' + pfCurrentOpt + 'item" class="row"><div class="col-xs-12 ');
        if (pfDepth > 1) { pfItem.push('col-xs-offset-1'); }
        pfItem.push('"><b>' + modifier.OPTIONTITLE + '</b><br>');
        pfItem.push('<i id="opt' + pfOptCount + 'info" class="small">' + modifier.INSTRUCTIONS + '</i><br>');
        pfItem.push('<input type="hidden" id="opt' + pfCurrentOpt + 'min" value="' + modifier.MINIMUM + '">');
        pfItem.push('<input type="hidden" id="opt' + pfCurrentOpt + 'max" value="' + modifier.MAXIMUM + '">');

        $.each(modifier.CHOICES, function (id, option) {
            pfChoiceCount++;

            var PopOverId = 'pop' + pfCurrentOpt + 'choice' + pfChoiceCount;
            var ChoiceDetail = '';
            if (option.CHOICEDETAILS != '') {
                ChoiceDetail = "&nbsp;<i class='fa fa-info-circle' onClick=\"pfShowPopOver('" + PopOverId + "'); return false;\" ></i><span id='" + PopOverId + "' class='pfPopOver'>" + option.CHOICEDETAILS + '</span>';
            }

            if (modifier.MINIMUM == 1 && modifier.MAXIMUM == 1) {
                if (option.QTY > 0) {
                    pfItem.push('<div class="scrunch"><label class="small"><input checked id="opt' + pfCurrentOpt + 'choice' + pfChoiceCount + '" onClick=pfItemCheck() type="radio" name="opt' + pfCurrentOpt + '" value="' + option.CHOICETOKEN + '">&nbsp;' + option.CHOICENAME + ' ' + option.PRICE + '</label>' + ChoiceDetail + '</div>');
                } else {
                    pfItem.push('<div class="scrunch"><label class="small"><input id="opt' + pfCurrentOpt + 'choice' + pfChoiceCount + '" onClick=pfItemCheck() type="radio" name="opt' + pfCurrentOpt + '" value="' + option.CHOICETOKEN + '">&nbsp;' + option.CHOICENAME + ' ' + option.PRICE + '</label>' + ChoiceDetail + '</div>');
                }
            } else if (modifier.ALLOWMULTIPLE == true) {
                pfItem.push('<div class="scrunch"><label class="small"><select id="opt' + pfCurrentOpt + 'choice' + pfChoiceCount + '" name="opt' + pfCurrentOpt + '_' + option.CHOICETOKEN + '">');
                for (i = 0; i < modifier.MAXIMUM + 1; i++) {
                    if (option.QTY == i) { pfItem.push('<option selected value="' + i + '">' + i + '</option>') } else { pfItem.push('<option value="' + i + '">' + i + '</option>'); }
                }
                pfItem.push('</select>&nbsp;' + option.CHOICENAME + ' ' + option.PRICE + '</label>' + ChoiceDetail + '</div>');
            } else {
                if (option.QTY > 0) {
                    pfItem.push('<div class="scrunch"><label class="small"><input checked id="opt' + pfCurrentOpt + 'choice' + pfChoiceCount + '" onClick=pfItemCheck() type="checkbox" name="opt' + pfCurrentOpt + '" value="' + option.CHOICETOKEN + '">&nbsp;' + option.CHOICENAME + ' ' + option.PRICE + '</label>' + ChoiceDetail + '</div>');
                } else {
                    pfItem.push('<div class="scrunch"><label class="small"><input id="opt' + pfCurrentOpt + 'choice' + pfChoiceCount + '" onClick=pfItemCheck() type="checkbox" name="opt' + pfCurrentOpt + '" value="' + option.CHOICETOKEN + '">&nbsp;' + option.CHOICENAME + ' ' + option.PRICE + '</label>' + ChoiceDetail + '</div>');
                }
            }
            pfItem.push('<input type="hidden" id="weight' + pfCurrentOpt + 'choice' + pfChoiceCount + '" value="' + option.WEIGHT + '">');
            pfItem.push('<input type="hidden" id="price' + pfCurrentOpt + 'choice' + pfChoiceCount + '" value="' + option.PRICE + '">');
            if (option.MODIFIER != undefined) {
                pfItem.push('<input type="hidden" id="opt' + pfCurrentOpt + 'choice' + pfChoiceCount + 'nest" value="opt' + (pfOptCount + 1) + 'item">');
                pfPopulateModifier(option.MODIFIER);
            }

        });

        pfItem.push('<input type="hidden" id="opt' + pfCurrentOpt + 'count" value="' + pfChoiceCount + '">');
        pfItem.push('<input type="hidden" name="hiddencount" value="0">');
        pfItem.push('</div></div>');
        pfDepth--;
    } catch (err) { alert("pfPopulate Modifier Error: " + err.message); }

}


function LoadRestaurantList() {
    try {
        var formData = JSON.stringify($("#RestaurantFilterForm").serializeArray());
        $.ajax({
            type: "POST",
            url: pfUrl,
            dataType: 'json',
            data: formData,
            success: function (data) {
                RestaurantList = data.RESTAURANTLIST;
                PopulateRestaurantList();
            },
            error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
        });
    } catch (err) {
        alert("ERROR: LoadRestaurantList: " + err);
    }
}

function PopulateRestaurantList() {

    $("#RestaurantListContainer").html('');
    $("#KeywordSearchList").val(RestaurantList.KEYWORDSEARCHLIST);
    var x = [];
    var CuisineList = $('input[name="cuisine"]:checkbox:checked').map(function () { return this.value; }).get();
    var CuisineFilter = 0;
    try {
        CuisineFilter = $('input[name=cuisinefilter]:checked').val();
    } catch (err) {
        alert(err);
    }




    $.each(RestaurantList.LEVELS, function (id, option) {
        x.push('<div class="alert alert-info hidden-xs"><span class="lead">' + option.LEVELNAME + '</span><br />' + option.LEVELDETAILS + '</div>');
        x.push('<div class="visible-xs-block text-center" style="margin-top: 15px; border-top: 2px solid black;"><span style="font-size: 1.6em;">' + option.LEVELNAME + '</span><br />' + option.LEVELDETAILS + '</div>');
        if (RestaurantPageLayout == 1) { x.push('<div class="row">'); }
        $.each(option.RESTAURANTS, function (id, option) {
            var flag = false;
            if (option.HASDELIVERY == true && $("#hasDelivery").prop('checked') == true) { flag = true; }
            if (option.HASTAKEOUT == true && $("#hasTakeOut").prop('checked') == true) { flag = true; }

            if ($("#useConvFeeFilter").val() == 'A' && flag == true) {
                var flag = false;
                if (option.HASCONVFEE == true && $("#hasConvFee").prop('checked') == true) { flag = true; }
                if (option.HASCONVFEE != true && $("#noConvFee").prop('checked') == true) { flag = true; }
            }


            if (flag == true && CuisineList.length > 0) {
                //alert("C-Count" + CuisineList.length);
                var target = option.CUISINELISTSEARCH;
                flag = false;
                $.each(CuisineList, function (id, option) {
                    if (target.indexOf('$' + option + '$') > 0) {
                        flag = true;
                    } else if (CuisineFilter == 1) {
                        flag = false;
                        return false;
                    }

                });
            }

            if (Number(option.DISTANCEVAL) > Number($("input[name=distance]:checked").val())) { flag = false; }

            if (option.COSTLEVEL == '0' && $("#pricing0").prop('checked') == false) { flag = false; }
            if (option.COSTLEVEL == '1' && $("#pricing1").prop('checked') == false) { flag = false; }
            if (option.COSTLEVEL == '2' && $("#pricing2").prop('checked') == false) { flag = false; }
            if (option.COSTLEVEL == '3' && $("#pricing3").prop('checked') == false) { flag = false; }
            if (option.COSTLEVEL == '4' && $("#pricing4").prop('checked') == false) { flag = false; }
            if (option.COSTLEVEL == '5' && $("#pricing5").prop('checked') == false) { flag = false; }

            if (option.RATING == '0' && $("#rating0").prop('checked') == false) { flag = false; }
            if (option.RATING == '1' && $("#rating1").prop('checked') == false) { flag = false; }
            if (option.RATING == '2' && $("#rating2").prop('checked') == false) { flag = false; }
            if (option.RATING == '3' && $("#rating3").prop('checked') == false) { flag = false; }
            if (option.RATING == '4' && $("#rating4").prop('checked') == false) { flag = false; }
            if (option.RATING == '5' && $("#rating5").prop('checked') == false) { flag = false; }

            if (option.RESTAURANTOPEN == false && $("#openNow").prop('checked') == true) { flag = false; }

            if (flag == true) {

                if (RestaurantPageLayout == 1) {
                    PopulateRestaurantSmall(x, option)
                } else {
                    PopulateRestaurant(x, option); PopulateRestaurantMin(x, option);
                }

            }
        });
        if (RestaurantPageLayout == 1) { x.push('</div>'); }
    });
    $("#RestaurantListContainer").append(x.join(''));

}
function PopulateRestaurant(x, option) {
    var InternetBonus = '';
    if (option.INTERNETBONUSTEXT != '') {
        InternetBonus = '&nbsp;&nbsp;<span class="pull-right" style="color:red;">' + option.INTERNETBONUSTEXT + '</span>';
    }
    x.push('<div class="hidden-xs">');
    x.push('<div class="panel panel-primary">');
    x.push('<div class="panel-body pfRestListItem"><a href="' + option.MENUTARGET + '"><div class="row"><div class="col-sm-2 hidden-xs">' + option.LOGO + '</div>');
    x.push('<div class="col-sm-10"><div class="lead" style="margin-bottom:0;"><b>' + option.RESTAURANTNAME + '&nbsp;' + InternetBonus + '</b><div class="pull-right text-right">');

    if (option.RATING == 1) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 2) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 3) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 4) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 5) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i>'); }
    else { x.push('&nbsp;'); }


    x.push('</div></div>');
    if (option.RESTAURANTOPEN != true) { x.push('<span class="small red">' + option.CLOSEDMESSAGE + '</span>'); }
    x.push('<div class="border-bottom"><div class="row">');
    x.push('<div class="col-xs-10">' + option.CUISINELIST + '&nbsp;</div>');
    x.push('<div class="col-xs-2 text-right">');
    if (option.COSTLEVEL == 1) { x.push('<i class="fa fa-dollar"></i>'); }
    else if (option.COSTLEVEL == 2) { x.push('<i class="fa fa-dollar"></i><i class="fa fa-dollar"></i>'); }
    else if (option.COSTLEVEL == 3) { x.push('<i class="fa fa-dollar"></i><i class="fa fa-dollar"></i><i class="fa fa-dollar"></i>'); }
    else if (option.COSTLEVEL == 4) { x.push('<i class="fa fa-dollar"></i><i class="fa fa-dollar"></i><i class="fa fa-dollar"></i><i class="fa fa-dollar"></i>'); }
    else if (option.COSTLEVEL == 5) { x.push('<i class="fa fa-dollar"></i><i class="fa fa-dollar"></i><i class="fa fa-dollar"></i><i class="fa fa-dollar"></i><i class="fa fa-dollar"></i>'); }
    x.push("</div></div></div>");

    x.push('<div class="small text-left hidden-xs">' + option.BLURB + '</div> <br /> <br />');

    if (RestaurantList.SHOWMINIMUMORDERSIZE == true || RestaurantList.SHOWDISTANCE == true || RestaurantList.SHOWDELIVERYFEE == true) {


        x.push('<div class="border-top hidden-xs"><div class="row small" style="padding-top: 7px;"><div class="col-sm-12">');


        x.push(option.MINIMUMORDER + '&nbsp;' + option.DELIVERYFEE + '&nbsp;' + option.DISTANCE);

        x.push('</div></div>');
    }
    x.push('</div>');
    //if (option.RESTAURANTOPEN == true) {  }
    //else {  }
    //x.push('<div class="text-left">');
    //if (option.HASDELIVERY == true) { x.push('<span class="small glyphicon glyphicon-check"></span>&nbsp;Delivery Available<br>'); }
    //if (option.HASTAKEOUT == true) { x.push('<span class="small glyphicon glyphicon-check"></span>&nbsp;Takeout Available<br>'); }
    x.push('</div></a></div></div></div></div></div>');

}

function PopulateRestaurantSmall(x, option) {
    var InternetBonus = '';
    if (option.INTERNETBONUSTEXT != '') {
        InternetBonus = option.INTERNETBONUSTEXT;
    }

    x.push('');
    x.push('<div class="col-sm-6 col-md-6 col-lg-4 ">');
    x.push('    <div class="smrWarning">');
    if (option.RESTAURANTOPEN != true) {
        x.push('<span class="red">');
        if (option.CLOSEDMESSAGE == '' || option.CLOSEDMESSAGE == undefined) { x.push('This restaurant is currently closed.'); } else { x.push(option.CLOSEDMESSAGE); }
        x.push('</span>');
    }
    x.push('    </div>');
    x.push('    <div class="smrWell">');
    x.push('        <a href="' + option.MENUTARGET + '">');

    // First Row of Well
    x.push('            <div class="smrTopRow">');
    //x.push('                <div class="smrRating">' + pfGetRating(option) + '</div>');
    x.push('                <div class="smrRating" style="color:red;">' + InternetBonus + '</div>');
    x.push('                <div class="smrRestName">' + option.RESTAURANTNAME + '</div>');
    x.push('            </div>');

    // Middle Row of Well
    x.push('            <div class="row smrMiddleRow">');
    x.push('                <div class="col-xs-4 col-sm-4 smrLogo">' + option.LOGO + '</div>');
    x.push('                <div class="col-xs-8 col-sm-8">');
    x.push('                    <div class="smrCuisines">' + option.CUISINELIST + '</div>');
    x.push('                </div>');
    x.push('            </div>');

    // Bottom Row of Well
    x.push('            <div class="row smrMessage">');
    x.push('                <div class="col-xs-4 text-left">');
    if (RestaurantList.SHOWDELIVERYFEE == true) { x.push(option.DELIVERYFEE); }
    x.push('                </div>');
    x.push('                <div class="col-xs-4 text-center">');
    if (RestaurantList.SHOWMINIMUMORDERSIZE == true) { x.push(option.MINIMUMORDER); }
    x.push('                </div>');
    x.push('                <div class="col-xs-4 text-right">');
    if (RestaurantList.SHOWDISTANCE == true) { x.push(option.DISTANCE); }
    x.push('                 </div>');
    x.push('            </div>');


    x.push('        </a>');
    x.push('    </div>');
    x.push('</div>');



}

function pfGetRating(option) {
    var rr;
    if (option.RATING == 1) { rr = '<i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'; }
    else if (option.RATING == 2) { rr = '<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'; }
    else if (option.RATING == 3) { rr = '<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'; }
    else if (option.RATING == 4) { rr = '<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i>'; }
    else if (option.RATING == 5) { rr = '<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i>'; }
    else { rr = '&nbsp;'; }
    return rr;
}

function PopulateRestaurantMin(x, option) {
    x.push('<a href="' + option.MENUTARGET + '"><div class="visible-xs-block whiteback border-top ">');
    x.push('<div style="padding-top: 17px; padding-bottom: 7px;">');
    x.push('<div class=""><div class="row">');
    x.push('<div class="col-xs-9 "><div style="font-size: 1.2em;"><b>' + option.RESTAURANTNAME + '</b></div>');
    x.push('<div style="padding-bottom: 8px;"><div class="small" style="padding-bottom: 8px;"><b>' + option.CUISINELIST + '&nbsp;</b></div></div>');
    if (option.RATING == 1) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 2) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 3) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 4) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star-o"></i>'); }
    else if (option.RATING == 5) { x.push('<i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i><i class="fa fa-star red"></i>'); }
    else { x.push('&nbsp;'); }
    x.push('</div><div class="col-xs-3">' + option.LOGO + '</div></div>');
    x.push('</div>');
    x.push('<div class="row text-left small" style="padding-top: 7px;"><div class="col-xs-12">');
    if (option.RESTAURANTOPEN != true) {
        x.push('<span class="red" style="">');
        if (option.CLOSEDMESSAGE == '' || option.CLOSEDMESSAGE == undefined) { x.push('This restaurant is currently closed.'); } else { x.push(option.CLOSEDMESSAGE); }
        x.push('</span>');
    } else {
        if (option.HASTAKEOUT == true) { x.push('Takeout;&nbsp;&nbsp;&nbsp;'); }
        if (option.HASDELIVERY == true) { x.push(option.DELIVERYFEE + '&nbsp;&nbsp;&nbsp;' + option.MINIMUMORDER + '&nbsp;&nbsp;&nbsp;'); }
        x.push('<span class="pull-right text-right">' + option.DISTANCE + '</span>');
    }
    x.push('</div></div></div></div>');

    x.push('</a>');

}

function pfMakeGift(x) { $("#giftAmount").val(x); }

function pfOrderGiftCard(NewGiftCardTemplateID, GiftCardTitle, GiftCardImageURL) {
    $("#giftTitle").html(GiftCardTitle);
    $("#giftTemplateID").val(NewGiftCardTemplateID);
    $("#pfGiftCardImage").attr("src", GiftCardImageURL);
    $("#pfOrderGiftCard").modal({ show: true, backdrop: "static" })

}

function pfAddGiftCard() {
    var formData = JSON.stringify($('#pfIssueGiftCardForm').serializeArray());
    $.ajax({
        type: "POST",
        url: pfUrl,
        dataType: 'json',
        data: formData,
        success: function (data) {
            if (data.ERROR != '') {
                alert(data.ERROR);
            } else {
                $("#pfOrderGiftCard").modal("hide"); pfPopulateGiftCart(data);
            }
        },
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText); $("#pfGiftError").html(jsonError.ERROR + "<br> <br>"); $("#pfGiftError").show();
            return false;
        }
    });

}



function pfOpenPayment(ID, pLabel) {
    pfAppleSpinOn('Loading');
    var formData = '{ "OPERATION" : "PAYMENTOPTIONS" , "LOCATOR" : "' + ID + '" }';
    $.ajax({
        type: "POST",
        url: pfUrl,
        dataType: 'json',
        data: formData,
        success: function (data) {
            pfAppleSpinOff();
            if (data.ERROR != '') {
                alert(data.ERROR);
            } else {
                var x = [];
                $.each(data.PAYMENTOPTIONS, function (id, option) {
                    x.push('<label class="radio pfCheckboxFixAll"><input ');
                    if (option.SELECTED == true) { x.push(' checked '); }
                    if (option.DESCRIPTION == 'New Credit Card') {
                        x.push('type="radio" value="' + option.PAYMENTMETHODTOKEN + '" name="pmtType" onclick="pfHideOldCVV2(); pfOpenNewCard();">' + option.DESCRIPTION + '</label>');
                    } else if (option.NEEDCVV2 == true) {
                        x.push('type="radio" value="' + option.PAYMENTMETHODTOKEN + '" name="pmtType" onclick="pfShowOldCVV2(); pfCloseNewCard();">' + option.DESCRIPTION + '</label>');
                    }
                    else {
                        x.push('type="radio" value="' + option.PAYMENTMETHODTOKEN + '" name="pmtType" onclick="pfHideOldCVV2(); pfCloseNewCard();">' + option.DESCRIPTION + '</label>');
                    }
                });
                $("#pmtOptions").html('');
                $("#pmtOptions").append(x.join(''));
                $("#pmtLocator").val(ID);
                $("#pmtPaymentLabel").html('Payment for $' + pLabel);
                //$("#cartPmts").hide();
                $("#cartNewPayment").show();
            }
        },
        error: function (request, status, error) {
            var jsonError = jQuery.parseJSON(request.responseText);
            return false;
        }
    });
}

function pfClosePayment() {
    $("#cartPmts").show();
    $("#cartNewPayment").hide();
    $("#pmtLocator").val('');
    $("#pmtOptions").html('');
}

function pfShowOldCVV2() { pfNeedCVV2Code = true; $("#pmtOldCardCVV2Frame").show() }
function pfHideOldCVV2() { pfNeedCVV2Code = false; $("#pmtOldCardCVV2Frame").hide() }

function pfOpenNewCard(Locator) {
    document.getElementById("pmtNewCardFrame").style.display = 'block';
}

function pfCloseNewCard() {
    try {
        document.getElementById("pmtNewCardFrame").style.display = 'none';
    }
    catch (err) {

    }
}


function pfaImageLoadTyper() {
    switch ($("#imgType").val()) {
        case "0":
            $("#fileBox").hide(); $("#catIDbox").hide(); $("#recordID").hide(); $("#imgLogo").html(""); $("#imgText").html("General Image Management");
            $("#imgDetail").html("Choose the type of image you want to upload or change."); $("#imgOperation").val(""); break;
        case "1":
            $("#fileBox").show(); $("#catIDbox").hide(); $("#recordID").show(); $("#imgLogo").html(""); $("#imgText").html("Restaurant Logos");
            $("#imgDetail").html("Each restaurant logo should be at least 100 wide.  It can be in a JPG, GIF, PNG, or TIFF format. Power Flash will automatically adjust the image the proper size needed.");
            $("#recordID").html($("#selRestaurant").html()); $("#imgOperation").val("UPLOADRESTAURANT"); break;
        case "4":
            $("#fileBox").show(); $("#catIDbox").show(); $("#recordID").show(); $("#imgLogo").html(""); $("#imgText").html("Menu Pictures");
            $("#imgDetail").html("Each menu picture should be at 350 pixels wide by 350 pixels tall. The pictures can be in a JPG, GIF, PNG, or TIFF format. Power Flash will automatically adjust the image the proper size needed.");
            $("#recordID").html(""); $("#imgOperation").val("UPLOADMENUITEM"); break;
        case "6":
            $("#fileBox").show(); $("#catIDbox").hide(); $("#recordID").show(); $("#imgLogo").html(""); $("#imgText").html("Driver Pictures");
            $("#imgDetail").html("Each driver's picture should be at 200 pixels wide. The pictures can be in a JPG, GIF, PNG, or TIFF format. Power Flash will automatically adjust the image the proper size needed.");
            $("#recordID").html($("#selDriver").html()); $("#imgOperation").val("UPLOADDRIVER"); break;
        case "9":
            $("#fileBox").show(); $("#catIDbox").hide(); $("#recordID").show(); $("#imgLogo").html(""); $("#imgText").html("Hotel Logos");
            $("#imgDetail").html("Each Hotel Logo should be at 100 pixels wide. The logos can be in a JPG, GIF, PNG, or TIFF format. Power Flash will automatically adjust the image the proper size needed.");
            $("#recordID").html($("#selHotel").html()); $("#imgOperation").val("UPLOADHOTEL"); break;
        case "7":
            $("#fileBox").show(); $("#catIDbox").hide(); $("#recordID").show(); $("#imgLogo").html(""); $("#imgText").html("Reward Prizes");
            $("#imgDetail").html("Each reward prize picture should be at 100 pixels wide. The image can be in a JPG, GIF, PNG, or TIFF format. Power Flash will automatically adjust the image the proper size needed.");
            $("#recordID").html($("#selReward").html()); $("#imgOperation").val("UPLOADREWARD"); break;
        case "8":
            $("#fileBox").show(); $("#catIDbox").hide(); $("#recordID").show(); $("#imgLogo").html(""); $("#imgText").html("Gift Cards");
            $("#imgDetail").html("Each gift card image should be 600 pixels wide and 200 pixels high. The image can be in a JPG, GIF, PNG, or TIFF format. Power Flash will automatically adjust the image the proper size needed.");
            $("#recordID").html($("#selGiftCard").html()); $("#imgOperation").val("UPLOADGIFTCARD"); break;
    }
}

function pfaImageLoadMenuItems() {
    var formData = "{'OPERATION':'GETMENUITEMS','MENUID':'" + $("#catID").val() + "'}";
    pfPost({
        type: "POST", url: pfUrl, dataType: "json", data: formData, success: function (data) { $("#recordID").html(data.MENUITEMS) },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
    });
}

function pfaImageLoadImage() {
    var formData = "{'OPERATION':'GETIMAGE','IMAGETYPE':'" + $("#imgType").val() + "','RECORDID':'" + $("#recordID").val() + "'}";
    pfPost({
        type: "POST", url: pfUrl, dataType: "json", data: formData, success: function (data) { $("#imgLogo").html("<img class='img-responsive' src='" + data.IMAGENAME + "' />") },
        error: function (request, status, error) { var jsonError = jQuery.parseJSON(request.responseText); pfAlert("Oops!", jsonError.ERROR); }
    });
}




/**
 * nimbleLoader v2.0.1 - Display loading bar where you want with ease
 * Version v2.0.1
 * @requires    jQuery v1.7.1
 * @description Display a loading bar in whatever block element you want
 *
 ***********************************************************************************************************************
 *                                                                                                      Prerequisites ? *
 ***********************************************************************************************************************
 *
 * 1- Build and download animated gif adapted to your web site thanks tools like http://www.ajaxload.info/
 * 2- Add a script tag referencing jquery.nimble.loader.js
 * 3- Configure your nimbleLoader and you somme CSS class
 * 4- That's it ! nimbleLoader is ready to use
 *
 *
 ***********************************************************************************************************************
 *                                                                                                          Use case ? *
 ***********************************************************************************************************************
 *
 * Most of the time the nimbleLoader is used when sending ajax request, to warn users that there is something
 * happening in the page :
 * - A form submission is being performed
 * - Updating a block content by getting information with ajax request
 * - Uploading / Downloading data
 * - ...
 *
 * There are two main ways of using the nimbleLoader
 * 1- You want to use it as an "overlay" : the nimbleLoader will appear inside the targeted container but over its content
 *    You may want to display a background with the loading bar (the background will cover all the content of the nimbleLoader target
 * 2- You want to display the nimbleLoader inside an container but as a element placed into the content right after the container content
 *
 *
 * Limitations :
 * - nimbleLoader shouldn't be use on an element with the css "position" property set to "fixed"
 * - nimbleLoader could impact the display of absolute element contained in the target element if the target element
 *   become the first relative parent to the absolute element.
 *
 ***********************************************************************************************************************
 *                                                                                                  How to configure ? *
 ***********************************************************************************************************************
 *
 * 1- Choose your params
 *
 *         |  Type / Value accepted   |  Name                 |              |  Default value         | Description
 * --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 * @option |  Boolean                 |  overlay              |  (optional)  |  default:true          | When true, nimbleLoader will appear above the content of the targeted element
 *                                                                                                      "loaderImgUrl" option will be ignore in this case.
 *                                                                                                      When false, it will be displayed as an img tag as the last child of the targeted element
 *                                                                                                      To build the image, "loaderImgUrl" will be used, and all other options will be ignored
 * @option |  String                  |  loaderClass          |  (optional)  |  default:"loading_bar" | CSS class for the element which will display your loading bar
 * @option |  Numeric                 |  zIndex               |  (optional)  |  default:undefined     | value of the z-index css property of the loading bar if you need to handle it.
 *         |                          |                       |              |                          This can be useful if you have loading bars on top of the other in a page
 * @option |  Boolean                 |  debug                |  (optional)  |  default:false         | useful to display debug info
 * @option |  String/Numeric          |  speed                |  (optional)  |  default:"fast"        | The speed you want tour loading bar to appear/disappear (numeric or 'slow', 'fast'...)
 * @option |  Boolean                 |  hasBackground        |  (optional)  |  default:false         | If true will add a background to the loader
 * @option |  css color               |  backgroundColor      |  (optional)  |  default:"black"       | Will decide the background color   (only useful when "hasBackground" is true)
 * @option |  0< opt =<1              |  backgroundOpacity    |  (optional)  |  default:0.5           | Will decide the background opacity (only useful when "hasBackground" is true)
 * @option |  String                  |  loaderImgUrl         |  (optional)  |  default:""            | Represent the img URL to build the nimbleLoader (only useful when "overlay" is false)
 *                                                                                                      If "overlay" is false, then "loaderImgUrl" is required
 * @option |  String                  |  position             |  (optional)  |  default:absolute      | A CSS position (absolute or fixed) which will allow the nimbleLoader to be displayed over some content
 * @option |  function                |  callbackOnHiding     |  (optional)  |  default:undefined     | Will be executed when nimbleLoader hide itself, when the fadeOut is done
 *
 *    Example : 
 *    var params = {
 *      loaderClass        : "loading_bar",
 *      debug              : false,
 *      speed              : 'fast',
 *      needPositionedParent : true
 *    }
 *
 * 2- Set your params
 *
 *    2.1 Global way
 *      $.fn.nimbleLoader.setSettings(params);
 *
 *    2.2 Specific way
 *      $("#myDiv").nimbleLoader("show", otherParams);
 *
 * 3- Don't forget to set the css of your loading bar : see the demo to have an example (style/loader.css)
 * 
 *
 * 
 ***********************************************************************************************************************
 *                                                                                                        How to use ? *
 ***********************************************************************************************************************
 *
 * => Showing a loading bar in <div id="myDiv"></div>
 * $("#myDiv").nimbleLoader("show");
 *
 * => Hiding the loading bar
 * $("#myDiv").nimbleLoader("hide");
 *
 */

if (jQuery) (function ($) {

    // Extend JQuery function : adding nimbleLoader
    $.extend($.fn, {

        nimbleLoader: function (method, options) {

            /*************************************************************************
             *  Plugin Methods
             ************************************************************************/

            // Clone the global settings. $.extend is needed : we extend a new object with global settings
            var settings = $.extend(true, {}, $.fn.nimbleLoader.settings);

            // Catch settings given in parameters

            if (options) { jQuery.extend(settings, options); }

            // Function to init the loader
            function init($nimbleLoader, settings) {
                var loader = new LoadingHandlerGenerator($nimbleLoader, settings);
                $nimbleLoader.data("loader", loader);
            }

            // Function to show the loading bar
            var show = function () {

                return this.each(function () {
                    var $nimbleLoader = $(this);
                    if ($nimbleLoader.data("loader") !== undefined) {
                        var loader = $nimbleLoader.data("loader");
                        loader.showLoading();
                    }
                    else {
                        init($nimbleLoader, settings);
                        $nimbleLoader.nimbleLoader('show');
                    }
                });
            };

            // Function to hide the loading bar
            var hide = function () {
                return this.each(function () {
                    var $nimbleLoader = $(this);
                    if ($nimbleLoader.data("loader") !== undefined) {
                        var loader = $nimbleLoader.data("loader");
                        loader.hideLoading();
                    }
                });
            };

            var methods = {
                show: show,
                hide: hide
            };

            /*************************************************************************
            *  Execution when calling .nimbleLoader()
            ************************************************************************/
            if (methods[method]) {
                return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
            }
            else if (!method) {
                return methods.show.apply(this, Array.prototype.slice.call(arguments, 1));
            }
            else {
                if (window && window.console) {
                    console.log("[jquery.nimble.loader] -> no method '" + method + "' to apply ");
                }
                return false;
            }

            /**
             * Closure function which define a loading bar element
             */
            function LoadingHandlerGenerator($parentSelector, params) {

                /**
                 * $loadingBar              : the loading bar jQuery element
                 * debug                    : debug option to display in console how many times the loading bar has been called
                 * speed                    : animation speed when showing/hiding the loading bar
                 * previousCssPosition      : store the initial position (string) of the loader parent when "needPositionedParent" is true
                 * countNbCall              : the counter to count the number of time the loader has been called
                 * nbLoadingElements        : counter of the number of HTML elements involved (1 -only the loading bar- or 2 -the loading bar + the background-)
                 */

                var $loadingBar;
                var debug = params.debug;
                var speed = params.speed;
                var previousCssPosition = "";
                var countNbCall = 0;
                var nbLoadingElements = 0;
                var waitForAnimation = {
                    isAnimated: 0, // the number of animated elements, - 0 meaning then no animation
                    callStack: []
                };

                // Init the loader : set html and place it
                function initLoading() {

                    // If the loader doesn't exists, we create and init it
                    if (!$loadingBar) {

                        // Define loading bar basic element (used to build inline and positioned nimble loader)
                        var $loader = $('<div></div>').addClass(params.loaderClass);
                        nbLoadingElements = 1;

                        /**
                         * Configuration for inline nimbleLoader:
                         * When creating an inline nimbleLoader, the plugin create a HTML img tag to display the nimbleLoader.
                         * To create this img tag, params.loaderImgUrl is required.
                         */
                        if (!params.overlay) {

                            $loadingBar = $loader;
                            // loaderImgUrl is required to build the image that will represent the loader
                            if (params.loaderImgUrl) {
                                $loadingBar.append("<img src='" + params.loaderImgUrl + "' />");
                            }
                            else {
                                if (window && window.console) {
                                    console.log("[jquery.nimble.loader] -> loaderImgUrl should be defined when 'display' = 'inline'");
                                }
                            }
                            // Append the loading bar in its parent so that it appear after the content already in $parentSelector
                            if ($parentSelector && $parentSelector.length) {
                                $parentSelector.append($loadingBar);
                            }
                        }
                        /**
                         * Configuration for overlay nimbleLoader:
                         */
                        else {
                            /**
                             * Configuring background
                             * If there is a background, we add it to the loadingBar selector
                             * and increase the nbLoadingElements value
                             * $nimbleLoader is now composed of two "brother" elements
                             */
                            if (params.hasBackground) {
                                nbLoadingElements++;
                                var opacity = params.backgroundOpacity;
                                var $backgroundLoader = $('<div></div>').css({
                                    top: 0,
                                    left: 0,
                                    position: params.position,
                                    display: "none",
                                    height: "100%",
                                    width: "100%",
                                    "background-color": params.backgroundColor,
                                    "opacity": opacity,
                                    filter: "alpha(opacity=" + Math.floor(100 * opacity) + ")" // This is for IE7 and IE8
                                });
                                $loadingBar = $backgroundLoader.add($loader);
                            } else {
                                $loadingBar = $loader;
                            }

                            /**
                             * Prepend the loading bar in its parent.
                             * It has to be done before configuring CSS properties: ce need to read some CSS property which should
                             * come from css file, and these properties are set to the element only once it has been added to the dom
                             */
                            if ($parentSelector && $parentSelector.length) { $parentSelector.prepend($loadingBar); }

                            // Configuring CSS z-index
                            if (params.zIndex) { $loadingBar.css("z-index", params.zIndex); }

                            /**
                             * Configuring CSS position of the loading bar
                             */
                            if (params.position) {
                                var $elToPosition = $loadingBar.filter("." + params.loaderClass);
                                $elToPosition.css("position", params.position);
                            }

                            /**
                             * Configuring CSS position of the nimbleLoader target
                             * If the params specified that the loading bar should have an absolute position, so we attribute a
                             * relative position to its parent if it's not already positioned
                             */
                            if (params.position === "absolute") {
                                // If nimbleLoader container is already positioned we keeps its position in memory to be able to
                                // restore it when precessing hide on nimbleLoader. Otherwise the container will loose it.
                                if ($parentSelector.css("position") === "relative" || $parentSelector.css("position") === "absolute") {
                                    previousCssPosition = $parentSelector.css("position");
                                }
                                // Else we positioned the nimbleLoader container as relative
                                else {
                                    if (params.position === "absolute" && ($parentSelector[0].tagName).toLowerCase() !== "body") {
                                        $parentSelector.css("position", "relative");
                                    }
                                }
                            }
                        }
                    }
                }

                // Log counter element in the loading bar : show the number of time a loading bar has been call
                function logCounter(nbCall) {
                    if (window && window.console) {
                        var idAttr = $parentSelector.attr("id");
                        var classAttr = $parentSelector.attr("class");
                        var params = [];
                        if (idAttr != "") { params.push("#" + idAttr); }
                        if (classAttr != "") { params.push("." + classAttr); }
                        console.log("[jquery.nimble.loader] -> $(" + params.join(" ") + ").logCounter : " + nbCall);
                    }
                }

                // Decrease the call counter and change the debug display if needed
                function decreaseCounter() {
                    var ret = -1;
                    if (countNbCall > 0) {
                        countNbCall--;
                        ret = countNbCall;
                    }
                    if (debug) { logCounter(ret); }
                    return ret;
                }

                // Increase the call counter and change the debug display if needed
                function increaseCounter() {
                    countNbCall++;
                    if (debug) { logCounter(countNbCall); }
                    return countNbCall;
                }

                // Check if there is an action to do in the callStack and do the one of the top of the stack
                function callStack() {
                    if (waitForAnimation.callStack.length > 0) {
                        if (waitForAnimation.isAnimated === 0) {
                            var actionToDo = waitForAnimation.callStack.pop();

                            if (actionToDo == "hideLoading") {
                                processHide();
                            }
                            else if (actionToDo == "showLoading") {
                                processShow();
                            }
                        }
                    }
                }

                function showLoading() {
                    unshiftAction("showLoading");
                }
                function hideLoading() {
                    unshiftAction("hideLoading");
                }

                function unshiftAction(action) {
                    waitForAnimation.callStack.unshift(action);
                    callStack();
                }

                // Show the loading bar element
                function processShow() {
                    if (increaseCounter() == 1) { // Check if we have to show the loader it's the first
                        initLoading();

                        // We set a param to know that the animation to hide has begin
                        waitForAnimation.isAnimated = nbLoadingElements;
                        $loadingBar.fadeIn(speed, function () {

                            // We set a param to know that the animation to show is finished
                            waitForAnimation.isAnimated--;

                            // During destroying, calls can be made to show the loader. So we let's the loader disappear and then we show it again
                            callStack();

                        });
                    }
                    else {
                        callStack();
                    }
                }

                // Hide the loading bar element
                function processHide() {

                    // Check if we have to destroy the loader (it happens when the counter is equal to 0)
                    if (decreaseCounter() === 0) { // If countNbCall == 0 decreaseCounter() returns -1

                        // We set a param to know that the animation to hide has begin
                        waitForAnimation.isAnimated = nbLoadingElements;

                        // We animate the loader to make it disappear
                        $loadingBar.fadeOut(speed, function () {
                            // This will be called as many times as there are elements in the $loading element
                            // We set a param to know that the animation to hide is finished
                            waitForAnimation.isAnimated--;

                            // We destroy the loader element
                            $(this).remove();

                            // Reset the initial position of the loader parent
                            $parentSelector.css("position", previousCssPosition);

                            // If all loaders have been destroyed, we reset the $loadingBar variable
                            if (waitForAnimation.isAnimated === 0) {
                                $loadingBar = undefined;
                            }

                            // If a callback is defined, we call it
                            if (params.callbackOnHiding && typeof (params.callbackOnHiding) === "function") {
                                params.callbackOnHiding();
                            }

                            // During destroying, calls can be made to show the loader. So we let's the loader disappear and then we show it again
                            callStack();
                        });
                    }
                    else {
                        callStack();
                    }
                }

                // Body of the closure function
                return {
                    showLoading: showLoading,
                    hideLoading: hideLoading,
                    init: initLoading
                };
            }
        }
    });

    $.extend($.fn.nimbleLoader, {
        settings: {
            overlay: true,
            position: "absolute",
            loaderImgUrl: "",
            loaderClass: "loading_bar",
            callbackOnHiding: function () { },
            speed: 'fast',
            hasBackground: false,
            backgroundColor: "#ffffff",
            backgroundOpacity: 0.5,
            debug: false
        },
        setSettings: function (options) {
            $.extend($.fn.nimbleLoader.settings, options);
        }
    });

})(jQuery);




$(document).ready(function () {

    /*********************************************************************************************************************
     * INITIALISATION
     * Define some sets of params
     * Init the global param for the plugin
     ********************************************************************************************************************/

    // Params example 1
    var params = {
        loaderClass: "loading_bar_1",
        debug: true,
        speed: 'fast',
        hasBackground: false,
        zIndex: 99
    };

    // Overwriting default params : nimbleLoader will use param1 as default options
    $.fn.nimbleLoader.setSettings(params);

    /*********************************************************************************************************************
     * EXAMPLE 1 : SIMPLE EXAMPLE
     * Activate loading bar with "show" button
     * Deactivate by "hide" button
     ********************************************************************************************************************/

    var changeNbCall = function (action) {
        var $nbCall = $("#nb-call");
        var nbCall = parseInt($nbCall.html());
        if (!isNaN(nbCall)) {
            if (action === "up") { nbCall += 1; }
            else if (action === "down") {
                if (nbCall > 0) { nbCall -= 1; }
            }
        } else { nbCall = 0; }
        $nbCall.html(nbCall);
    };

    // Init button of loader
    //$("#loader1 .show-loader").click(function () {
    //    changeNbCall("up");
    //    $("#loading1").nimbleLoader("show", {
    //        hasBackground: true,
    //        backgroundColor: "#ffffff",
    //        backgroundOpacity: "0.7"
    //    }); // No param is specified, it will use default one (param1)
    //});
    //$("#loader1 .hide-loader").click(function () {
    //    changeNbCall("down");
    //    $("#loading1").nimbleLoader("hide");
    //});
});

function pfInsideSpinOn(ID) {
    $(ID).nimbleLoader("show", {
        hasBackground: true,
        backgroundColor: "#ffffff",
        backgroundOpacity: "0.7"
    }); // No param is specified, it will use default one (param1)

}
function pfInsideSpinOff(ID) {
    $(ID).nimbleLoader("hide");
}

var overlay;

function pfAppleSpinOff() {
    overlay.hide();

}
function pfAppleSpinOn(TextualTitle) {
    try {
        pfAppleSpinOff();
    }
    catch (err) {

    }
    if (TextualTitle == undefined) { TextualTitle = 'Loading' }
    var opts = {
        lines: 13, // The number of lines to draw
        length: 11, // The length of each line
        width: 5, // The line thickness
        radius: 17, // The radius of the inner circle
        corners: 1, // Corner roundness (0..1)
        rotate: 0, // The rotation offset
        color: '#FFF', // #rgb or #rrggbb
        speed: 1, // Rounds per second
        trail: 60, // Afterglow percentage
        shadow: false, // Whether to render a shadow
        hwaccel: false, // Whether to use hardware acceleration
        className: 'spinner', // The CSS class to assign to the spinner
        zIndex: 2e9, // The z-index (defaults to 2000000000)
        top: 'auto', // Top position relative to parent in px
        left: 'auto' // Left position relative to parent in px
    };
    try {
        var target = document.createElement("div");
        document.body.appendChild(target);
        var spinner = new Spinner(opts).spin(target);
        overlay = iosOverlay({
            text: TextualTitle,
            spinner: spinner
        });
    } catch (err) {
    }

}

function pfCreateGroupOrder() {
    try {
        pfAppleSpinOn('Creating Group Order');
        var data = {};
        data.OPERATION = 'MANAGEGROUP';
        data.GroupOrderID = 'NEW';
        pfPost({
            type: "POST", url: pfUrl, dataType: 'json',
            data: JSON.stringify(data),
            error: function (request, status, error) {
                pfAppleSpinOff();
                alert("Browser Error");
            },
            success: function (data) {
                if (data.ERROR == '') {
                    location.href = '/ManageGroupOrder';
                } else {
                    pfAppleSpinOff();
                    pfAlert("Cannot create nw Group Order", data.ERROR);
                }
            }
        });

    } catch (err) {
        alert('pfNewGroupOrder:Error:' + err);
    }

}

function pfManageGroupOrder() {
    var formData = JSON.stringify($('#pfChangeManageGroupOrderForm').serializeArray());
    pfPost({
        type: "POST", url: pfUrl, dataType: 'json',
        data: formData,
        error: function (request, status, error) {
            alert("Browser Error");
        },
        success: function (data) {
            if (data.ERROR == '') {
                location.href = '/ManageGroupOrder';
            } else {
                pfAlert("Cannot Manage Order", data.ERROR);
            }
        }
    });



}


function grpSettings() {
    try {
        $('#grpSettingsBox').modal('show');

    } catch (err) {
        alert("grpSettings:Error:" + err);
    }



}

/*
var grpSettingsTabIndex = 0;
function grpSettingsTab(index) {
    try {
        $("#grpSettingsAddress").hide(); $("#grpSettingsDateTime").hide(); $("#grpSettingsRestaurants").hide(); $("#grpSettingsPayment").hide(); $("#grpSettingsTip").hide(); $("#grpSettingsInfo").hide();
        $("#grpSettingsAllocation").hide();

        pfGroupSaveStep(grpSettingsTabIndex, index);
        grpSettingsTabIndex = index;
        switch (index) {
            case 1: $("#grpSettingsAddress").show(); break;
            case 2: $("#grpSettingsDateTime").show(); break;
            case 4: $("#grpSettingsRestaurants").show(); break;
            case 5: $("#grpSettingsAllocation").show(); break;
            case 6: $("#grpSettingsPayment").show(); break;
            case 7: $("#grpSettingsTip").show(); break;
            case 8: $("#grpSettingsInfo").show(); break;
        }

    } catch (err) {
        alert("grpSettings:Error:" + err);
    }

}
*/

function pfPopulateSelectBox(selectElement, jsonArray) {
    try {
        var x = [];
        for (i = 0; i < jsonArray.length; i++) {
            var j = jsonArray[i];
            x.push("<option value='" + j.VALUE + "' ")
            if (j.SELECTED == true) { x.push(' selected '); }
            x.push(">" + j.DESCRIPTION + '</option>')
        }
        $(selectElement).html('');
        $(selectElement).append(x.join(''));

    } catch (err) {
        alert("pfError:" + err);
    }
}





function pfUpdateSettings(ElementChanged) {
    try {
        var ActionOverRide = '';
        var data = {};
        data.OPERATION = "UPDATESETTINGS";
        if (ElementChanged === 'time') {
            data.NewTime = $("#TimeList").val();
        } else if (ElementChanged === 'date') {
            data.NewDate = $("#DateValue").val();
        } else if (ElementChanged === 'sort') {
            data.NewSort = $("#SortOrder").val();
        } else if (ElementChanged === 'search') {
            data.NewSearchText = $("#SearchText").val();
        } else if (ElementChanged === 'place') {
            data.NewPlace = JSON.stringify(NewPlace);
            //data.NewPlace = NewPlace;
            data.Apt = NewApt;
        } else if (ElementChanged === 'manualplace') {
            data.FullAddress = JSON.stringify(NewPlace);
            data.Apt = NewApt;
        } else if (ElementChanged === 'saveaddress') {
            data.FullAddress = $("#pfFullAddress").val();
            data.Subdivision = $("#pfSubdivision").val();
            data.CrossStreet = $("#pfCrossStreet").val();
            data.City = $("#pfCity").val();
            data.State = $("#pfState").val();
            data.Zip = $("#pfZipCode").val();
            data.Apt = $("#pfApt").val();
            data.NewPlace = JSON.stringify(NewPlace);
            ActionOverRide = 'CLOSEMODAL';
        }



        pfPost({
            data: JSON.stringify(data),
            success: function (data) {
                pfPopulateSettings(data.CURRENTSETTINGS);
                if (ActionOverRide == 'CLOSEMODAL') { $('#pfModalAddress').modal('hide'); }
                if (pfCurrentPage == 'RESTAURANTS') { LoadRestaurantList(); }
                if (pfCurrentPage == 'ORDERPAGE') {
                    //location.reload();
                    LoadMenu();
                }
                if (pfCurrentPage == 'CHECKOUT') { }
                if (pfCurrentPage == 'HOME') { window.location = '/Restaurants' }


            }
        });

    } catch (err) {
        alert("pfError:" + err);
    }
}

function pfSavePO() {
    try {
        var data = {};
        data.OPERATION = 'SetPO';
        data.PO = $("#po").val();
        pfPost({
            data: JSON.stringify(data),
            success: function (data) {
                $("#po").val(data.PO)
            },
            error: function (request, status, error) {
                var jsonError = jQuery.parseJSON(request.responseText);
                pfAlert("Oops!", jsonError.ERROR);
                $("#po").val(jsonError.PO)
            }

        });

    } catch (err) {
        alert("pfSavePO:Error:" + err)
    }
}

function pfPopulateSettings(data) {
    try {
        pfPopulateSelectBox("#TimeList", data.TIMELIST)
        $("#TimeGroup").removeClass("has-error");
        $("#TimeGroup").removeClass("has-success");
        if (data.TIMEVALID == true) {
            $("#TimeGroup").addClass("has-success");
            $("#TimeValid").hide();
            if (data.DATEMESSAGE != '') { $("#TimeValid").html(data.DATEMESSAGE) } else { $("#TimeValid").html('Please enter a valid date.') }
        } else {
            $("#TimeGroup").addClass("has-error");
            $("#TimeValid").show();
            if (data.TIMEMESSAGE != '') { $("#TimeValid").html(data.TIMEMESSAGE) } else { $("#TimeValid").html('Invalid Time.') }
        }

        $("#ConfirmAddressLine1").html(data.CONFIRMADDRESSLINE1);
        $("#ConfirmAddressLine2").html(data.CONFIRMADDRESSLINE2);
        $("#ConfirmApt").html(data.CONFIRMAPT);
        $("#ConfirmCrossStreet").html(data.CONFIRMCROSSSTREET);
        $("#ConfirmSubdivision").html(data.CONFIRMSUBDIVISION);


        $("#DateValid").html(data.DATEMESSAGE);
        $("#DateValue").val(data.DATEVALUE);
        $("#DateGroup").removeClass("has-error");
        $("#DateGroup").removeClass("has-success");
        if (data.DATEVALID == true) {
            $("#DateGroup").addClass("has-success");
            $("#DateValid").hide();
        } else {
            $("#DateGroup").addClass("has-error");
            $("#DateValid").show();
        }

        $("#SearchText").val(data.SEARCHTEXT);
        $("#AddressTextLine").val(data.CURRENTADDRESSLINE);
        $("#AddressTextLine").attr('placeholder', data.CURRENTADDRESSPLACEHOLDER);
        $("#AddressValid").html(data.ADDRESSMESSAGE);
        $("#AddressGroup").removeClass("has-error");
        $("#AddressGroup").removeClass("has-success");

        $("#PopAddressTextLine").val(data.CURRENTADDRESSLINE);
        $("#PopAddressTextLine").attr('placeholder', data.CURRENTADDRESSPLACEHOLDER);
        $("#PopAddressValid").html(data.ADDRESSMESSAGE);
        $("#PopAddressGroup").removeClass("has-error");
        $("#PopAddressGroup").removeClass("has-success");

        if (data.ADDRESSVALID == true) {
            $("#AddressGroup").addClass("has-success");
            $("#AddressValid").hide();
            $("#PopAddressGroup").addClass("has-success");
            $("#PopAddressValid").hide();
        } else {
            $("#AddressGroup").addClass("has-error");
            $("#AddressValid").show();
            $("#PopAddressGroup").addClass("has-error");
            $("#PopAddressValid").show();
        }

        if (data.ADDRESSCONFIRMED == true) {
            pfAddressConfirmed = true;
        } else {
            pfAddressConfirmed = false;
        }


    } catch (err) {
        //alert("pfError:pfPopulateSettings:" + err);
    }

}



function pfGroupOrderPassword(sendData) {
    try {

        // pfGOP1Label
        // pfGroupOrderP1


        var e = false;
        var p1 = $("#pfGroupOrderPassword1").val();
        var p2 = $("#pfGroupOrderPassword2").val();

        if (p1.length > 2) {
            $("#pfGroupOrderP1").addClass("has-success");
            $("#pfGroupOrderP1").removeClass("has-error");
            $("#pfgopok1").show();
            $("#pfgopno1").hide();
            //return;
        } else if (sendData === false) {
            $("#pfGroupOrderP1").removeClass("has-success");
            $("#pfGroupOrderP1").removeClass("has-error");
            $("#pfgopok1").hide();
            $("#pfgopno1").hide();
            e = true;
        } else {
            $("#pfGroupOrderP1").removeClass("has-success");
            $("#pfGroupOrderP1").addClass("has-error");
            $("#pfgopok1").hide();
            $("#pfgopno1").show();
            e = true;
        }

        if (e == true && sendData == false) {
            $("#pfGroupOrderP2").removeClass("has-success");
            $("#pfGroupOrderP2").removeClass("has-error");
            $("#pfgopok2").hide();
            $("#pfgopno2").hide();
            //return;
        }

        if (p2.length > 2 && p1 == p2) {
            $("#pfGroupOrderP2").addClass("has-success");
            $("#pfGroupOrderP2").removeClass("has-error");
            $("#pfgopok2").show();
            $("#pfgopno2").hide();
        } else if (sendData === false) {
            $("#pfGroupOrderP2").removeClass("has-success");
            $("#pfGroupOrderP2").removeClass("has-error");
            $("#pfgopok2").hide();
            $("#pfgopno2").hide();
            e = true;
        } else {
            $("#pfGroupOrderP2").removeClass("has-success");
            $("#pfGroupOrderP2").addClass("has-error");
            $("#pfgopok2").hide();
            $("#pfgopno2").show();
            e = true;
        }



        if (sendData == false || e == true) { return; }


        var data = {};
        data.OPERATION = "NEWGROUPPASSWORD";
        data.PASSWORD1 = p1;
        data.PASSWORD2 = p2;
        data.CUSTOMERTOKEN = $("#pfGopCustomerId").val();
        pfPost({
            data: JSON.stringify(data),
            success: function (data) {
                location.reload();
            },
            error: function (request, status, error) {
                var jsonError = jQuery.parseJSON(request.responseText);
                pfAlert("Oops!", jsonError.ERROR);
            }
        });


    } catch (err) {
        alert('pfGroupOrderPassword:Error:' + err)
    }

}


function pfFindId(element) {
    try {
        var e = element;

        //if (e.Id != undefined) {
        //    return e.Id;
        //} else if (e.ID != undefined) {
        //    return e.ID;
        //} else if (e.id != undefined && e.id != '') {
        //    alert("!" + e.id);
        //    return e.id;
        //}
        for (; e && e !== document; e = e.parentNode) {
            if (e.Id != undefined) {
                return e.Id;
            } else if (e.ID != undefined) {
                return e.ID;
            } else if (e.id != undefined && e.id != '') {
                return e.id;
            }
        }
    } catch (err) {
        alert('pfFindId:Error:' + err);
    }
    return null;
}


