var view = null;
function viewModel() {

    var t = this;

    t.all = ko.observableArray();

    t.newCartTemp = ko.observable(false);

    t.newSettingsTemp = ko.observable(false);

    t.Navigation = ko.observable(screens.productList);

    t.IsLoading = ko.observable(true);

    t.HeaderRightIcon = ko.pureComputed(function () {
        switch (t.Navigation()) {
            case screens.productList:
                return icons.message;
            case screens.searchView:
                return icons.searchView;
            default:
                return '';
        }
    })


    t.HeaderLeftIcon = ko.pureComputed(function () {
        switch (t.Navigation()) {
            case screens.productList:
                return icons.menu;
            case screens.searchView:
                return icons.menu;
            default:
                return icons.arrowLeft;
        }
    });

    t.HeaderLeftClick = function () {
        switch (t.Navigation()) {
            case screens.cart:
                return t.Navigation(screens.productList);
            case screens.tablesAfterCart:
                return t.Navigation(screens.productList);
            case screens.tablesBeforeAddition:
                return t.Navigation(screens.productList);
            case screens.addition:
                return t.Navigation(screens.tablesBeforeAddition);
            case screens.payment:
                t.PaymentType(undefined);
                return t.Navigation(screens.tablesBeforeAddition);
            case screens.identity:
                return t.Navigation(screens.productList);
            case screens.bakiye:
                return t.Navigation(screens.addition);
            default:
                return t.AppMenuItems(!t.AppMenuItems());
        }
    }

    t.HeaderRigthClick = function () {
        switch (t.Navigation()) {
            case screens.cart:
                return t.Navigation(screens.productList);
            case screens.tablesAfterCart:
                return t.Navigation(screens.cart);
            case screens.productList:
                return t.GetMessages();
            default:
                return null;
        }
    }

    t.GetMessages = function () {
        var user = ko.toJS(view.user());
        if (user) {
            PostQuery("/api/getMessages", { "garsonId": user.ID }, function (res) {
                if (res.Error) {
                    MessageBox("hata oluştu");
                    return;
                } else {
                    if (res && res.list && res.list.messages) {
                        var d = res.list.messages;
                        t.SignalRNotifications([]);
                        d.map(function (itm, idx) {
                            t.SignalRNotifications.push(new notificationModel("anonim", itm.MESAJ, itm.ID));
                        })
                        d.length > 0 ? $('#notificationModal').modal() : MessageBox("Okunmamış mesajınız bulunmamaktadır!")

                    }

                }
            })
        }
    }

    t.HeaderTitle = ko.pureComputed(function () {
        switch (t.Navigation()) {
            case screens.cart:
                return t.CartTitleText();
            case screens.tablesAfterCart:
                return t.CartTitleText();
            case screens.addition:
                return "Masa no: " + t.DeskNo();
            case screens.payment:
                return "Masa no: " + t.DeskNo();
            case screens.identity:
                return 'Müşteriyi bul(barkod)'
            case screens.bakiye:
                return 'Bakiye Sorgulama'
            default:
                return "";
        }
    })

    // start barkod
    // barkod değeri
    t.Customer = ko.observable();

    t.limitControl = ko.observable();

    // barkod değerine göre müşteri bulmaya yarar
    t.FindCustomer = function () {
        //15E7C871B0ED4DF
        var cno = t.Customer().CartNo(),
            rno = t.Customer().RoomNo();
        if (cno || rno) {
            var model = {
                "Name": t.Customer().Name(),
                "Lastname": t.Customer().Lastname(),
                "CartNo": t.Customer().CartNo(),
                "RoomNo": t.Customer().RoomNo(),
            };
            PostQuery("/api/FindCustomer", model, function (res) {
                if (res.Error) {
                    MessageBox(res.Error || "Hata oluştu", "danger")
                } else {
                    if (res.result.length == 0) {
                        MessageBox("Kayıt Bulunamadı!");
                        return
                    };

                    var cdata = Array.isArray(res.result) ? res.result[0] : (res.result || {
                        "Misafir": undefined, "Bakiye": 0, "CheckIn": undefined, "CheckOut": undefined, "Vip": undefined, "Limit": 0
                    });
                    t.limitControl(cdata.Limit);
                    t.Customer().Name(cdata.Misafir);
                    t.Customer().Bakiye(cdata.Bakiye);
                    t.Customer().CheckIn(cdata.CheckIn);
                    t.Customer().CheckOut(cdata.CheckOut);
                    t.Customer().Vip(cdata.Vip);
                    t.Customer().RoomNo(cdata.OdaNo);
                    t.Navigation(screens.bakiye);
                }
            })
        } else {
            MessageBox(t.AppConfig().KartNo == "1" ? "Kart Numarası Giriniz" : "Oda Numarası Giriniz");
        }
    }
    // end barkod

    // start uygulama modu 'Otel/Restoran/Uye (0/1/2)'

    t.AppConfig = ko.observable();

    t.GetAppConfig = function () {
        PostQuery("/api/GetAppConfig", null, function (res) {
            if (res.Error) {
                MessageBox(res.Error || "");
            } else {
                if (res.Mode == "0") {
                    t.Customer(new customer());
                }
                t.AppConfig(res);
            }
        })
    }
    // end uygulama modu

    t.AppMenuItems = ko.observable(false);

    t.SettingsAlert = function () {
        t.selectedDataFromDbList().length > 0 ? t.OrderCancellation(!t.OrderCancellation()) : MessageBox('Lütfen en az bir kayıt seçin', "danger");
    }

    t.SignalRNotificationsCount = ko.pureComputed(function () {
        if (t.SignalRNotifications() && t.SignalRNotifications().length > 0) {
            var count = t.SignalRNotifications().filter(function (f) { return f.state() == "1" });
            return count.length;
        } else {
            return 0;
        }
    });

    //Tüm masaları boşaltır!
    t.EmptyTables = function () {
        PostQuery("/api/EmptyTables");
        MessageBox("Tüm Masalar Boşaltıldı!");
    }

    t.NewTransfer = ko.observable("");

    t.UseTransfer = ko.observable(false);

    t.TransferEnabled = function () {
        if (t.IsSelectedTable(t.DeskNo())) {
            var isFilled = t.FilteredTables().filter(function (f) { return f.MASANO == t.DeskNo() && f.DOLU == false });
            if (isFilled.length > 0) {
                MessageBox("Lütfen transfer etmek için dolu bir masa seçin", "danger");
                t.tableFilter('dolu');
                t.DeskNo(undefined);
                return
            }
            t.UseTransfer(true);
            t.tableFilter('bos');
        }
    }

    t.CancelTransfer = function () {
        t.UseTransfer(false);
        t.NewTransfer("");
        t.DeskNo(undefined);
        return
    }

    t.Transfer = function () {
        if (!t.NewTransfer()) {
            MessageBox("Lütfen transfer etmek istediğiniz masanın hangi masaya transfer edileceğini seçiniz.", "danger");
            return;
        }
        else {
            if (t.NewTransfer() == t.DeskNo()) {
                MessageBox("Masa numaraları aynı olamaz", "danger");
                return
            }
            view.ShowConfirm(t.DeskNo() + " numaralı masayı " + t.NewTransfer() + " numaralı masaya transfer etmek üzeresiniz emin misiniz?",
                function () {
                    var model = { "From": t.DeskNo(), "To": t.NewTransfer(), "DepNo": view.user().DepartNo(), "YeniMasaDepKodu": view.user().DepartNo() };
                    PostQuery("/api/transfer", model, function (res) {
                        if (res.Error) {
                            MessageBox(res.Error || "Transfer yapılırken hata oluştu", "danger");
                            t.CloseConfirm();
                            t.CancelTransfer();
                        } else {
                            MessageBox("Transfer başarı ile tamamlandı");
                            t.CloseConfirm();
                            t.NewTransfer("");
                            t.Navigation(screens.productList);
                            t.DeskNo(undefined);
                            t.UseTransfer(false);
                        }
                    });
                }, function () {
                    t.CloseConfirm();
                    t.CancelTransfer();
                }
            );
        }
    }

    t.CloseConfirm = function () {
        $("#confirmModal").modal("hide");
    }


    t.RemoveAllCache = function () {
        app.Cookie.Remove("AU");
        app.Cookie.Remove("BL");
        app.LocalStorage.Remove("AU");
        app.LocalStorage.Remove("BL");
        app.LocalStorage.Remove("alldata");
        app.LocalStorage.Remove("desk");
        app.LocalStorage.Remove("notifications");
        window.location.reload();
    }

    t.DataFromServer = ko.observableArray();

    t.showSearch = ko.observable(false);

    t.ModalBodyHeight = ko.observable(window.screen.availHeight - 120);

    t.data = ko.observableArray();

    t.SetTableNo = function (val, bindingContext) {
        if (!val && !val.MASANO)
            return;
        switch (bindingContext) {
            case 'DeskNoForCart':
                t.DeskNoForCart() == val.MASANO ? t.DeskNoForCart(undefined) : t.DeskNoForCart(val.MASANO);
                break;
            case 'DeskNo':
                t.OnSelectTable(val);
                break;
        }
    }


    t.OnSelectTable = function (val) {
        if (!t.UseTransfer()) {
            val != undefined && val != null && val.MASANO ? (t.DeskNo() == val.MASANO ? t.DeskNo(undefined) : t.DeskNo(val.MASANO)) : null;
        } else {
            if (val.DOLU) {
                MessageBox("Dolu masayı ancak boş masaya transfer edebilirsiniz", "danger");
                t.tableFilter('bos');
                return
            } else {
                t.NewTransfer() == "" ? t.NewTransfer(val.MASANO) : (val.MASANO == t.NewTransfer() ? t.NewTransfer("") : t.NewTransfer(val.MASANO));
            }
        }
    }

    t.SignalRNotifications = ko.observableArray([]);

    t.SignalRNotifications.subscribe(function (value) {
        app.LocalStorage.Write("notifications", ko.toJS(view.SignalRNotifications()));
    })

    t.Height = ko.observable(70);

    t.menuItems = ko.pureComputed(function () {
        if (t.XmlToJsonData().length > 0) {
            var data = [];
            var _d = t.XmlToJsonData().filter(function (f) { return f.valid() == true });
            for (var i = 0; i < _d.length; i++) {
                data.push({ "target": "#menu" + (i + 1), "displayName": _d[i].GADI() });
            }
            return data;
        } else {
            return [];
        }
    })

    t.elements = ko.observableArray();

    t.cartItems = ko.observableArray();

    t.cartItems.subscribe(function (val) {
        if (val.length == 0) {
            t.Navigation(screens.productList);
        }
    });

    t.ReadQrCode = function () {
        t.Next('dinner-table-2', 'code-reader');
        Open(function (response) {
            if (response) {
                t.QRCode(response);
                t.Next("code-reader", "code-reader-result");
                Close();
            }
        });
    };

    t.SelectedPriceAction = ko.observable("Tutar");

    t.CloseScanner = function (elementId) {
        t.Next('code-reader', 'dinner-table-2', t.ClearChildren("reader", 1), Close());
        if (elementId) {
            t.Next("elementId", "dinner-table-2")
        }
    }

    t.QRCode = ko.observable();

    t.IsSecureConnection = ko.observable(false);

    t.ClearChildren = function (element, startIndex) {
        var currentElem = document.getElementById(element);
        $.each(currentElem.children, function (index, value) {
            currentElem.children[0].remove();
        });
    }

    t.ReplayRead = function () {
        t.Next('code-reader-result', 'code-reader', undefined, Open(function (response) {
            if (response) {
                t.QRCode(response);
                Close();
            }
        }));
    }

    t.Next = function (currentTemplateId, targetTemplateId, beforeCallback, afterCallback) {
        if (typeof (beforeCallback) == "function") {
            beforeCallback();
        }
        var curTemp = document.getElementById(currentTemplateId);
        var tarTemp = document.getElementById(targetTemplateId);
        if (curTemp && tarTemp) {
            curTemp.style.display = "none";
            tarTemp.style.display = "block";
            if (typeof (afterCallback) == "function") {
                afterCallback();
            }
        }
    }

    t.QueryQrCodeToServer = function () {
        t.ShowConfirm("Girilen barkod ile ilgili bir kayıt bulunamadı masa listesine dönmek ister misiniz?",
            function () {
                t.CloseScanner();
                t.Next("code-reader-result", "dinner-table-2");
                t.ConfirmModalOptions().NoCallback();
            });
    }

    t.CanAddAfterQrCode = ko.observable(false);

    t.DinnerTableListEnabled = ko.observable(false);

    t.isMultiplePayment = ko.pureComputed(function () {
        if (t.PaymentType() && t.PaymentType() == "Multiple") {
            return true;
        }
        else {
            t.PaymentInputs([])
            return false;
        }
    });

    t.PaymentInputs = ko.observableArray([]);

    t.TotalPriceMultiplePayment = function () {
        var total = 0;
        for (var i = 0; i < t.PaymentInputs().length; i++) {
            total += t.PaymentInputs()[i].Price() > 0 ? parseFloat(t.PaymentInputs()[i].Price()) : 0;
        }
        return total.toFixed(2);
    };

    t.isEqual = ko.pureComputed(function () {
        return parseFloat(t.TotalPriceMultiplePayment()) === parseFloat(t.totalPriceFromServer());
    })

    t.PaymentInputsControl = function () {
        var currentPrice = parseFloat(t.TotalPriceMultiplePayment());
        var _remainingamount = t.RemainingAmount();
        var result = t.isEqual();
        if (result) {
            return true;
        }
        else if (currentPrice < parseFloat(t.totalPriceFromServer())) {
            t.PaymentInputs.push(new multiplePaymentModel(_remainingamount));
            return false;
        }

    };

    t.OrderCancellation = ko.observable(false);

    t.CancelBtnVisible = ko.pureComputed(function () {
        return t.selectedDataFromDbList && t.selectedDataFromDbList().length > 0 ? true : false;
    })

    t.RemoveFromPaymentInputs = function (index) {
        t.PaymentInputs.splice(index, 1);
        t.PaymentInputsControl();
    }

    t.PaymentSubOption = ko.observable();

    t.selectedDataFromDbList = ko.observableArray();

    t.selectedForRemove = function (index, data) {
        if (data) {
            if (!data.isSelected() && data.Quantity() !== -1) {
                t.selectedDataFromDbList.push(new settingsModel(data.ID(), data.Name(), data.Price(), 1, data.Quantity()));
                data.isSelected(!data.isSelected())
            }
            else if (data.isSelected()) {
                t.selectedDataFromDbList.remove(function (item) {
                    return item.ID() == data.ID();
                })
                data.isSelected(false)
            }
            else if (data.Quantity() !== -1) {
                data.isSelected(!data.isSelected())
            }
        }
    }

    t.TotalCountOfCartItems = ko.pureComputed(function () {
        var c = 0;
        t.cartItems().map(function (cart) {
            c += cart.Quantity()
        })
        return c;
    })

    t.RemoveCart = function () {
        t.cartItems([]);
        t.Navigation(screens.productList);
    }

    t.SelectedPaymetType = function (data) {
        t.PaymentType(data);
        t.PaymentInputs.push(new multiplePaymentModel());
        t.Navigation(screens.payment);
    }

    t.Finish = function (data) {
        t.PaymentType(data && data.Id);
        t.ViewOrClose('close');
    }
    
    t.BakiyeControl = ko.pureComputed(function () {
        if (t.limitControl && t.limitControl()==1)
        {
            if (t.Customer() && t.Customer().Bakiye && t.Customer().Bakiye() && t.viewListFromServer().length > 0 && t.viewListFromServer()[0].CartTotalPrice()) {

                var bakiye = parseInt(t.Customer().Bakiye());
                var hesap = parseInt(t.viewListFromServer()[0].CartTotalPrice())
                if (bakiye >= hesap)
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
        else
        {
            t.PaymentTypeCart("AÇIK HESAP");
            return true;
        }
    })

    t.PayFromCart = function () {
        if (t.BakiyeControl()) {

            t.PaymentType(t.PaymentTypeCart());
            t.ViewOrClose('close');
            t.Navigation(screens.productList);
            t.Customer(new customer());
        }
        else
            MessageBox("Bakiye Yetersiz!");
    }

    t.PaymentTypeCart = ko.observable("AÇIK HESAP");

    t.cartPopup = ko.observable(false);

    t.TotalPrice = ko.pureComputed(function () {
        var total = 0;
        $.each(t.cartItems(), function () {
            if (this.Extras && this.Extras().length > 0) {
                $.each(this.Extras(), function () {
                    if (this.Price && this.Price()) {
                        total += this.Price && this.Price();
                    }
                })
            }
            total += this.DisplayPrice() * 1
        })
        return total.toFixed(2);
    });

    t.TotalCountFromServer = ko.pureComputed(function () {
        var count = 0;
        t.viewListFromServer().map(function (item) {
            item.list().map(function (f) {
                count += f.Quantity();
            })
        })
        return count;
    });

    t.TotalCountCartItems = ko.pureComputed(function () {
        var count = 0;
        t.cartItems().map(function (item) {
            count += item.Quantity();
        })
        return count;
    });

    t.addToBasket = function (data, index, parentIndex) {
        if (data && index >= 0 && parentIndex >= 0) {
            data.Collapse(false);

            var crtData = { ID: data.SID, Name: data.SADI, Price: data.F, Quantity: data.Quantity, Extras: data.Extras, AccNo: data.AccNo, Currency: data.Currency };
            if (t.cartItems && t.cartItems().length > 0) {
                var _self = this;
                this.result = ko.observable(-1);
                var _data = new cart(ko.toJS(crtData));
                var currrentItem = t.cartItems().filter(function (i, idx) { return i.ID() == _data.ID() && i.ExtrasKey() == _data.ExtrasKey() && i.AccNo() == _data.AccNo(); });

                if (currrentItem.length == 0) {
                    t.cartItems.push(_data);
                    t.ClearAllAfterExtra(data);
                    return true;
                }
                else {
                    currrentItem = currrentItem[0];
                    currrentItem.Quantity(currrentItem.Quantity() + 1);
                    t.ClearAllAfterExtra(data);
                    return true;
                }
            }
            else {
                t.cartItems.push(new cart(ko.toJS(crtData)));
                t.ClearAllAfterExtra(data);
                return true;
            }
        }
        return
    }

    t.ClearAllAfterExtra = function (data) {
        if (data) {
            data.AccNo(0);
            data.Extras().map(function (f) {
                f.ExtraCount(0);
            });
            var before = data.Extras().filter(function (f) { return !f.AfterAdd() });
            data.Extras(before);
        } else {
            return;
        }

    }

    t.AddToBasketAfterClose = function (data) {
        // ürün detay sayfasında sepete atıldıpktan sonra çalışır
        var result = t.addToBasket(data);
        if (result) {
            //t.Next("product-detail", "container");
        }
    }

    t.Queue = ko.observableArray([]);

    t.DeskNo = ko.observable().extend({ required: { message: "Masa seçiniz!" } });

    t.DeskNoForCart = ko.observable().extend({ required: { message: "Masa seçiniz!" } });
    t.TableDetail = ko.observableArray([]);

    t.SetNotificationStatu = function (data, array, index) {
        if (!data && !data.SatirCounter())
            return
        t.IsLoading(true);
        var c = JSON.stringify(data.SatirCounter());
        PostQuery("/api/ModifyNotification", { "counter": c }, function (res) {
            if (res.Error) {
                t.IsLoading(false)
                MessageBox("işlem sırasında hata oluştu.", "danger")
                return;
            } else {
                t.LoadNotifications();
                t.IsLoading(false)
                return;
            }
        });
    }

    t.ChangeNotificationStatu = function (state, data) {
        if (state && data) {
            var model = {
                State: state,
                GarsonId: t.user().ID(),
                Message: data.message,
                MasaNo: data.masano,
                FisCounter: 1,
                GarsonMsgId: data.garsonMsgId
            }
            t.IsLoading(true);
            PostQuery("/api/ChangeStateNotification", { model: JSON.stringify(model) }, function (res) {
                if (res.Error) {
                    t.IsLoading(false)
                    MessageBox("hata olustu mesaj statusu değiştirilmedi", "danger");
                } else {
                    var notes = t.SignalRNotifications().filter(function (f) { return f.garsonMsgId() != data.garsonMsgId });
                    app.LocalStorage.Remove("notifications");
                    app.LocalStorage.Write("notifications", ko.toJS(notes));
                    t.SignalRNotifications(ko.mapping.fromJS(notes)());
                    t.IsLoading(false)
                }
            })
        }
    }

    t.SetStateNow = function () {
        var model = {
            state: 2,
            GarsonId: t.user().ID(),
            message: document.getElementById("NotificationMessage").innerHTML || "",
            masano: "",
            FisCounter: 1,
            garsonMsgId: document.getElementById("NotificationGarsonId").innerHTML || "0"
        }
        t.ChangeNotificationStatu("2", model);

    }

    t.ShowTableDetail = ko.observable(false);

    t.TableDetailCallBack = function () {
        t.OrderComplate(); t.ShowTableDetail(false);
    }

    t.PaymentTypes = ko.observableArray();

    t.GetPaymentTypes = function () {
        var CC = [], Tickets = [], cart = [], C = [];
        var pt = app.LocalStorage.Read("PaymentTypes");
        if (pt !== "null") {
            return t.PaymentTypes(JSON.parse(pt));
        }
        t.IsLoading(true);
        PostQuery("/api/GetPaymentTypes", null, function (response) {
            if (response.paymentTypes == "[]") {
                t.IsLoading(true);
                t.PaymentTypes([]);
                return;
            }
            response.paymentTypes.map(function (item) {
                if (item.Type !== "Hesaptan Ödeme") {
                    switch (item.Type) {
                        case "Kredi Karti":
                            CC.push(item);
                            break;
                        case "Ticket":
                            Tickets.push(item);
                            break;
                        default:
                            C.push(item);
                            break;
                    }
                } else if (item.Type == "Hesaptan Ödeme") {
                    t.PaymentTypeCart("AÇIK HESAP");
                }
                else
                    t.PaymentTypeCart("HESABA GONDER");
            })
            var types = [{ "Name": "Kredi Kartı", "Id": "KK", "Options": CC }, { "Name": "Ticket", "Id": "Ticket", "Options": Tickets }, { "Name": "Nakit", "Id": "Nakit", "Options": C }];
            //app.LocalStorage.Write("PaymentTypes", JSON.stringify(types));
            window.localStorage.setItem("PaymentTypes",JSON.stringify(types))
            t.IsLoading(false);
            t.PaymentTypes(types);
            return;
        })
    };

    t.PaymentType = ko.observable();

    t.validationForCart = ko.validation.group([t.DeskNoForCart]);

    t.validationForClose = ko.validation.group([t.DeskNo]);

    t.lastItemOfCartItems = ko.pureComputed(function () {
        return t.cartItems && t.cartItems().length > 0 ? t.cartItems().reverse()[0].Name() : ''
    })

    t.viewMessage = ko.observable();

    t.PostToSafeData = {};

    t.AddNewTable = function () {
        if (t.NewMasa()) {
            if (ko.toJS(t.Desks().filter(function (f) { return f.MASANO == t.NewMasa() })).length == 0) {
                var model = {
                    ID: -1,
                    MASANO: t.NewMasa(),
                    DOLU: false,
                    SEZLONG: t.AppConfig() && t.AppConfig().Sezlong && t.AddNewChildProp && t.AddNewChildProp() || false,
                    FISCOUTER: null,
                    AfterSezlong: ko.observable()
                };
                t.Desks().unshift(model)
                t.Desks(t.Desks());

                t.NewMasa(undefined);
                t.NewMasaEnabled(false);
                t.AddNewChildProp(false);
                t.SetTableNo(model.MASANO, "DeskNoForCart");
                return;
            }
            else {
                MessageBox(t.NewMasa() + " isimli masa daha önceden açılmış lütfen başka bir isim belirleyin", "danger");
                return
            }
        } else {
            MessageBox("masa için bir isim belirleyiniz", "danger");
            return;
        }
    }

    t.CartNext = function () {
        t.getDesks();
        t.Navigation(screens.tablesAfterCart);
        if (!t.AppConfig()) {
            t.GetAppConfig();
        }
    }

    t.AddNewChildProp = ko.observable(false);

    t.OrderComplate = function (data, event) {
        if (t.validationForCart().length > 0) {
            t.validationForCart.showAllMessages();
            MessageBox("Lütfen masa seçiniz!.", "danger")
            return
        } else {
            t.IsLoading(true);
            var sezlongDurum = false;
            if (t.AppConfig() && t.AppConfig().Sezlong == "1") {
                ko.toJS(t.Desks()).filter(function (f) {
                    if (f.MASANO == t.DeskNoForCart() && f.SEZLONG) {
                        sezlongDurum = f.SEZLONG
                    }
                    if (f.MASANO == t.DeskNoForCart() && f.AfterSezlong) {
                        sezlongDurum = true
                    }
                });
            }
            var model = {
                Products: ko.toJS(t.cartItems()),
                TotalPrice: t.Account(),
                DeskNo: t.DeskNoForCart(),
                AddNewChildProp: sezlongDurum == "1" ? true : false
            };
            t.AddOrder(model, function (response) {
                if (response.Error) {
                    if (response.Error == "NetWork Error") {

                        t.Queue.push(JSON.parse(response.Data)[0]);
                        app.LocalStorage.Write("Queue", t.Queue());
                        //t.Next("dinner-table", "container");
                        t.Navigation(screens.productList);
                        t.cartItems([]);
                        t.DeskNoForCart(undefined);

                    } else {
                        MessageBox(response.Error, "danger");
                        t.IsLoading(false)
                    }
                } else {
                    t.cartItems([]);
                    t.DeskNoForCart(undefined);
                    t.validationForCart.showAllMessages(false);
                    t.viewListFromServer([]);
                    t.DeskNo(undefined);
                    //t.Next("dinner-table", "binding");
                    t.Navigation(screens.productList);
                    t.IsLoading(false)
                }
            })
        }
    }

    t.AddOrder = function (_data, successCallback, errorCallback) {
        var login = t.loginInfo && t.loginInfo() || null;
        if (login) {
            var model = {
                User: login.UserName,
                DepartmentNo: login.DepartNo,
                UserId: login.ID,
                DeskNo: _data && _data.DeskNo,
                Products: _data && _data.Products,
                TotalPrice: _data && _data.TotalPrice[0].value,
                Sezlong: _data && _data.AddNewChildProp == "1" ? true : false
            }
            var data = JSON.stringify([model]);
            PostQuery("/api/AddOrder", JSON.stringify(data), successCallback || function (res) { console.log(res) }, function () {
                t.Queue.push(model);
            }, "POST");
        } else {
            console.log(login);
        }
    }


    // Masaya açan garson devam ettirsin parametresi POSV5'de açıksa
    // Sipariş gönderilirken sipariş veren garsonla masayı açan garsonun aynı kullanıcı olup olmadığı kontrol edilir
    // eğer aynı garson ise işleme devam eder ve sipariş verir. Eğer farklı garsonsa uyarı verir.
    // Bu fonksiyon uyutulursa t.OrderComplate() fonksiyonu sipariş gönder butonunun click'ine verilmelidir.
    t.AuthorityCheck = function (masaNo)
    {
        var garsonId = t.loginInfo && t.loginInfo().ID || -1;
        if (garsonId > -1 && masaNo) {
            PostQuery("/api/AuthorityCheck", { "garsonId": garsonId, "masaNo": masaNo }, function (res) {
                if (res) {
                    if (res && res.Message && res.Message == "0") {
                        MessageBox("Bu masayı açmak için yetkiniz yok!", "danger");
                        return;
                    }
                    else if (res && res.Error) {
                        MessageBox(res.Error);
                        return;
                    }
                    else {
                        t.OrderComplate();
                    }
                }
                else {
                    MessageBox("Herhangi bir sebebten ötürü hata olustu");
                    return;
                }
            });
        } else {
            var garsonMsg = garsonId == -1 ? "Garson bilgisi alınamadı lütfen login olmayı deneyin." : undefined;
            var masaMsg = masaNo == undefined ? "Lütfen masa seçiniz" : undefined;
            MessageBox(garsonMsg || masaMsg);
        }        
    }

    t.AddOrderWithQrCode = function () {
        var model = {
            QRCode: t.QRCode(),
            User: t.loginInfo().UserName,
            DepartmentNo: t.loginInfo().DepartNo,
            UserId: t.loginInfo().ID,
            Products: ko.toJS(t.cartItems()),
        }
        t.IsLoading(true);
        PostQuery("/api/AddOrderWithQrCode", { data: JSON.stringify(model) }, function (res) {
            if (res.Error) {
                t.IsLoading(false)
                MessageBox(response.Error, "danger");
            } else {
                t.cartItems([]);
                t.QRCode(undefined);
                //qr-code-result
                t.Next("code-reader-result", "container");
                //t.Next("code-scanner-template", "container");
                Close();
                t.IsLoading(false)
            }
        })
    }

    //t.PushQueue = function () {
    //    var data = app.LocalStorage.Read("Queue");
    //    PostQuery("/api/AddOrder", { data }, function (res) {
    //        if (res.Error) {
    //        }
    //        else {
    //            t.Queue([]);
    //            app.LocalStorage.Remove("Queue");
    //        }
    //    });
    //}

    t.BodyHeight = ko.pureComputed(function () {
        return (window.screen.height - 50) + "px";
    })

    t.CartTitleText = ko.pureComputed(function () {
        //if (t.TotalCountCartItems() > 0 && t.TotalPrice && t.TotalPrice()) {
        //    return t.TotalCountCartItems() + ' Adet ' + t.TotalPrice();
        //} else {
        //    return "";
        //}
        var accountText = "";
        if (t.Account && t.Account()) {
            t.Account().forEach(function (item) {
                accountText += " " + item.value + " " + item.key;
            });
            return accountText;
        }
    })

    t.Desks = ko.observableArray([]);

    t.user = ko.observable();

    t.loginInfo = ko.observable();

    t.tableFilter = ko.observable("hepsi");

    t.tableFilter.subscribe(function (val) {
        if (val == "hepsi") {
            return;
        } else {
            t.FilteredTables();
        }
    })

    t.FilteredTables = ko.pureComputed(function () {
        if (t.Desks && t.Desks().length > 0) {
            switch (t.tableFilter && t.tableFilter() || "hepsi") {
                case "dolu":
                    return view.Desks().filter(function (item) { return item.DOLU == true });
                    break;
                case "bos":
                    return view.Desks().filter(function (item) { return item.DOLU == false })
                    break;
                default:
                    return t.Desks();
                    break;
            }
        } else {
            return [];
        }
    });
    t.getDesks = function (res) {
        PostQuery("/api/DeskList", { departmentId: view.user().DepartNo() || t.loginInfo().DepartNo }, function (res) {
            if (res && Array.isArray(res.desks)) {
                res.desks.map(function (item) {
                    item.selected = false;
                })
                if (t.AppConfig() && t.AppConfig().Sezlong == "1") {
                    res.desks.map(function (f) {
                        f.AfterSezlong = ko.observable(false);
                    })
                }
                t.Desks(res.desks);
            } else {
                t.Desks([]);
            }
            //app.LocalStorage.Write("Desk", ko.toJS(view.Desks()));
        });
        //}
    };

    t.RefreshTables = function () {
        t.IsLoading(true);
        PostQuery("/api/DeskList", { departmentId: view.user().DepartNo() || t.loginInfo().DepartNo }, function (res) {
            t.Desks(res.desks);
            app.LocalStorage.Write("Desk", ko.toJS(view.Desks()));
            t.IsLoading(false)
            return;
        })
    }

    t.IsSelectedTable = function (tableNo) {
        if (!tableNo) {
            MessageBox("Lütfen masa seçiniz", "danger");
            return false;
        } else {
            return true;
        }
    }

    t.AdisyonGor = function () {
        if (t.IsSelectedTable(t.DeskNo())) {
            t.GetPaymentTypes();
            t.ViewOrClose("view");
        } else {
            return
        }
    }

    t.isModal = ko.pureComputed(function () {
        return t.cartItems && t.cartItems().length > 0 ? true : false;
    })

    t.deskErrorMessage = ko.observable();


    t.viewListFromServer = ko.observableArray();

    t.PriceActionValue = ko.observable(0);

    t.totalPriceFromServer = ko.pureComputed(function () {
        if (t.viewListFromServer().length > 0 && t.viewListFromServer()[0].LastPrice()) {
            return view.viewListFromServer()[0].LastPrice();
        } else {
            return "0";
        }
    })

    t.RemainingAmount = ko.pureComputed(function () {
        var result = parseFloat(t.totalPriceFromServer()) - parseFloat(t.TotalPriceMultiplePayment());
        return result.toFixed(2);
    });

    t.subSelectOptions = ko.observableArray();

    t.selectionChangedType = function (value) {
        if (value && value.Price() === undefined) {
            value.Price(parseFloat(t.RemainingAmount()))
        }
        if (value && value.Type() == "KK") {
            value.SubTypes(t.PaymentTypes().filter(function (f) { return f.Id == value.Type(); }));
        }
        else if (value && value.Type() == "Ticket") {
            value.SubTypes(t.PaymentTypes().filter(function (f) { return f.Id == value.Type(); }));
        }
        else {
            value.SubType("Nakit");
            value.SubTypes([]);
            return
        }
    }

    t.DeletedList = ko.observableArray();

    t.loadTables = function () {
        t.tableFilter('hepsi'); t.RefreshTables();
    }

    t.TotalPriceWithDiscount = function () {
        if (t.viewListFromServer().length > 0) {
            return t.viewListFromServer()[0].CartTotalWithDiscount();
        } else {
            return "0";
        }
    }

    t.ViewOrClose = function (param) {
        if (t.validationForClose().length > 0) {
            t.validationForClose.showAllMessages();

            return
        } else {
            if (param) {
                var params = {};
                params.IsViewOrClose = param;
                params.DepartmentId = t.user().DepartNo() || t.loginInfo().DepartNo;
                params.DeskNo = t.DeskNo();
                params.PaymentInfo = [];
                params.cartNo = t.Customer() && t.Customer().CartNo && t.Customer().CartNo();
                params.odaNo = t.Customer() && t.Customer().RoomNo && t.Customer().RoomNo();
                if (t.PaymentType() == "Multiple") {
                    params.PaymentInfo = ko.toJS(t.PaymentInputs());
                }
                else {
                    params.PaymentInfo = [{
                        "Price": parseFloat(t.TotalPriceWithDiscount() || t.totalPriceFromServer()), "Type": t.PaymentType(), "SubType": t.PaymentType()
                    }]
                }
                t.IsLoading(true);
                PostQuery("/api/ViewOrClose", { "data": JSON.stringify(params) }, function (res) {
                    if (res.view) {
                        if (res.view.length == 0) {
                            t.viewListFromServer([]);
                            t.IsLoading(false)
                            t.viewMessage(t.DeskNo() + " numaralı masanın açık hesabı bulunmamaktadır");
                            MessageBox(t.DeskNo() + " numaralı masanın açık hesabı bulunmamaktadır");
                            t.validationForClose.showAllMessages(false)
                        } else {
                            // kod satırını daha fazla uzatmamak için datayı başka bir fonksiyonda işliyorum.
                            t.AdisyonListMapping(res.view);
                            t.IsLoading(false)
                        }
                    }
                    else if (res.Message) {
                        var defaultProccess = function () {
                            t.DeskNo(undefined);
                            t.validationForClose.showAllMessages(false);
                            t.newSettingsTemp(false);
                            t.viewListFromServer([]);
                            t.PaymentType(undefined);
                            t.Navigation(screens.productList);

                        }
                        t.IsLoading(false)
                        view.ShowConfirm(res.Message + " yazdırmak isterminiz?", function () {
                            t.Print(function (res) {
                                if (res.Error) {
                                    MessageBox("Yazdırma işleminde hata oluştu", "danger");
                                    defaultProccess();
                                    $("#confirmModal").modal("hide");
                                } else {
                                    MessageBox("Yazdırma isteği başarı ile gönderildi");

                                    $("#confirmModal").modal("hide");
                                    defaultProccess();
                                }
                                t.loadTables();
                            });
                        }, function () {
                            $("#confirmModal").modal("hide");
                            defaultProccess();
                            t.loadTables();
                        });



                    }
                    else if (res.Error) {
                        MessageBox(res.Error, "danger");
                    }
                });
            }

        }
    }

    t.AdisyonListMapping = function (data) {
        data.map(function (f) {
            f.isSelected = false;
            f.TransferQuantity = 0;
            // null gelen accnolar artık default 0 olarak set ediliyor. U.E
            f.AccNo = f.AccNo != undefined && f.AccNo != null && f.AccNo != "" ? f.AccNo : "0";
        })
        var groupedView = ko.mapping.fromJS(GroupBy(data, "AccNo"))();
        groupedView.map(function (f) {
            f.CartTotalPrice = ko.observable(0);
            f.CartTotalWithDiscount = ko.observable(0);
            f.ListTotalPrice = ko.observable(0);
            f.LastPrice = ko.pureComputed(function () {
                if (f.CartTotalWithDiscount() <= f.CartTotalPrice()) {
                    return f.CartTotalWithDiscount();
                }
                else {
                    return f.CartTotalPrice();
                }
            })
            f.list().map(function (ff, index) {
                f.CartTotalPrice(ff.TotalWithOutDiscount() || 0);
                f.CartTotalWithDiscount(ff.TotalWithDiscount() || 0);
                f.ListTotalPrice(f.ListTotalPrice() + (ff.Price() * ff.Quantity()));
                ff.DepNoFilter = ko.observable('currentDepNo');
                ff.SelectedDepNo = ko.observable();
                ff.SelectedTableNo = ko.observable();
            })
        })
        t.viewListFromServer(groupedView);
        t.viewMessage(undefined);
        //t.Next("dinner-table-2", "settings-new-template");
        t.Navigation(screens.addition);
    }

    t.AllDepartments = ko.observableArray([]);

    t.GetDepartments = function () {
        if (t.AllDepartments().length > 0) {
            return;
        } else {
            t.IsLoading(true);
            PostQuery("/api/GetDepartments", null, function (res) {
                if (res && res.Error) {
                    t.IsLoading(false)
                    MessageBox(res.Error, "danger");
                    return;
                } else {
                    var data = res.list.obj.DEPARTMANLAR.DEPARTMAN || [];
                    t.DepartmentMapping(data);
                    t.IsLoading(false)
                }
            })
        }
    }
    t.LoginDepartments = ko.pureComputed(function () {
        if (t.AllDepartments().length > 0) {
            return;
        } else {
            t.IsLoading(true);
            PostQuery("/api/GetDepartments", null, function (res) {
                if (res && res.Error) {
                    t.IsLoading(false)
                    MessageBox(res.Error, "MPOS_Departman_MasaListesi prosedürü eksik veya prosedürden dönen sonuç boş!");
                    return;
                } else {
                    if (res && res.list && res.list.obj && res.list.obj.DEPARTMANLAR && res.list.obj.DEPARTMANLAR.DEPARTMAN) {

                        t.AllDepartments(res.list.obj.DEPARTMANLAR.DEPARTMAN || []);
                    }
                    t.IsLoading(false);
                }
            })
        }
    });

    t.OtherDepartmentTables = ko.observableArray([]);

    t.DepartmentMapping = function (data) {
        t.AllDepartments(data);
        data.map(function (f) {
            if (!Array.isArray(f.MASALAR.MASA)) {
                f.MASALAR.MASA = [f.MASALAR.MASA];
            }
        })
        var others = data.filter(function (f) {
            return f.KODU != t.user().DepartNo()
        });
        t.OtherDepartmentTables(others);
    }

    t.Print = function (callback) {
        if (t.DeskNo()) {
            var counter = null;
            for (var i = 0; i < t.Desks().length; i++) {
                if (t.Desks()[i].MASANO == t.DeskNo()) {
                    counter = t.Desks()[i].FISCOUTER;
                }
            }
            if (counter) {
                t.IsLoading(true);
                PostQuery("/api/Yazdir", { "Id": counter }, callback || function (res) {
                    if (res.Error) {
                        t.IsLoading(false)
                        MessageBox("Yazdırma işleminde hata oluştu", "danger");
                    } else {
                        t.IsLoading(false)
                        MessageBox("Masanın adiyon yazdırma isteği gönderildi.");
                    }
                })
            }
        }
    }

    t.ProductTransfer = function (data, index, pindex) {
        if (!data) {
            return
        } else {

            if (!data.SelectedTableNo()) {
                MessageBox("lütfen masa seçiniz");
                return
            }
            // transfer edilecek masanın data nesnesinden(view.viewListFromServer()) alınması;
            var to = data.SelectedTableNo();
            // eğer adet  seçilmemişse default adet ne kadarsa o kadar adet transfer edilsin;
            var quantity = data.TransferQuantity() > 0 ? data.TransferQuantity() : data.Quantity();
            var depNo = data.DepNoFilter() == 'anotherDepno' ? data.SelectedDepNo() : t.user().DepartNo();
            view.ShowConfirm(t.DeskNo() + " numaralı masadan " + to + " numaralı masaya seçilen ürünün " + quantity + " adetini transfer etmek üzeresiniz emin misiniz", function () {
                t.IsLoading(true);
                var model = { "From": t.DeskNo(), "To": to, "ProductId": data.ID(), "Quantity": quantity, "DepNo": depNo };
                PostQuery("/api/UrunTransfer", model, function (res) {

                    t.CloseConfirm();
                    if (res.Error) {
                        t.IsLoading(false)
                        MessageBox(res.Error || "işlem sırasında hata oluştu", "danger");
                        return;
                    } else {
                        var result = t.RemoveOrMinimizeCount(index, quantity, pindex);
                        if (result) {
                            t.IsLoading(false)
                            MessageBox("işlem başarı ile gerçekleşti");
                            return
                        } else {
                            t.IsLoading(false)
                            MessageBox("işlem sırasında hata oluştu.", "danger");
                            return
                        }
                    }
                })
            },
                function () {
                    t.CloseConfirm();
                })

        }
    }

    t.RemoveOrMinimizeCount = function (index, count, pindex) {
        var result = ko.toJS(t.viewListFromServer()[pindex]).list[index];
        if (result) {
            // eğer transfer edilen ürünün countu arrayin countu ile aynı ise arraydan kaldır.
            var beforePrice = t.viewListFromServer()[pindex].ListTotalPrice(),
                afterPrice = beforePrice - result.Price;
            t.viewListFromServer()[pindex].ListTotalPrice(afterPrice);
            for (var i = 0; i < t.viewListFromServer().length; i++) {
                t.viewListFromServer()[i].CartTotalPrice(t.viewListFromServer()[i].CartTotalPrice() - result.Price);
                t.viewListFromServer()[i].CartTotalWithDiscount(t.viewListFromServer()[i].CartTotalWithDiscount() - result.Price)
            }
            if (result.Quantity == count) {

                t.viewListFromServer()[pindex].list.splice(index, 1);
                t.viewListFromServer()[pindex].list().length == 0 ? t.Next("settings-new-template", "container") : null;
                return true;
            }
            // değilse array in countunu gelen count ile güncelle
            else {
                var beforeCount = t.viewListFromServer()[pindex].list()[index].Quantity(),
                    afterCount = beforeCount - count;
                t.viewListFromServer()[pindex].list()[index].Quantity(afterCount);
                return true;
            }
        } else {
            return false;
        }
    }

    t.UseBulkTransfer = ko.observable(false);

    t.BulkTransferTableNo = ko.observable();

    t.BulkTransfer = function () {
        if (t.viewListFromServer().length == 0) {
            return
        } else {
            if (!t.BulkTransferTableNo()) {
                MessageBox("Lütfen adisyonu birleştireceğiniz masayı seçiniz!");
                return
            }
            t.ShowConfirm(t.DeskNo() + " numaralı masanın adisyonunu " + t.BulkTransferTableNo() + " numaralı masa ile birleştirmek üzeresiniz emin misiniz ?",
                function () {
                    var model = { "From": t.DeskNo(), "To": t.BulkTransferTableNo(), "DepNo": t.user().DepartNo() };
                    PostQuery("/api/BulkTransfer", model, function (res) {
                        if (res.Error) {
                            MessageBox("Hata oluştu", "danger");
                        }
                        else {
                            t.UseBulkTransfer(false);
                            t.BulkTransferTableNo(undefined);
                            t.DeskNo(undefined);
                            //t.Next('settings-new-template', 'container');
                            t.Navigation(screens.productList);
                            //t.IsLoading(false)
                            MessageBox("işlem başarı ile gerçekleştirildi");
                        }
                        t.CloseConfirm();
                    })
                },
                function () {
                    t.CloseConfirm();
                });
        }
    }

    t.GoToTablesFromAdisyon = function () {
        t.Next('settings-new-template', 'dinner-table-2');
        t.DeskNo(undefined);
    };

    t.GetDetail = function (isviewOrClose, TableNo, successCallback) {
        if (!TableNo) {
            //t.validationForClose.showAllMessages();
            MessageBox("Masa seçiniz !")
            return
        } else {
            if (isviewOrClose) {
                var params = {};
                params.IsViewOrClose = isviewOrClose;
                params.DepartmentId = t.user().DepartNo() || t.loginInfo().DepartNo;
                params.DeskNo = TableNo;
                params.PaymentInfo = [];
                if (t.PaymentType() == "Multiple") {
                    params.PaymentInfo = ko.toJS(t.PaymentInputs());
                }
                else {
                    params.PaymentInfo = [{
                        "Price": parseFloat(t.totalPriceFromServer()), "Type": t.PaymentType(), "SubType": t.PaymentType()
                    }]
                }
                PostQuery("/api/ViewOrClose", { "data": JSON.stringify(params) }, successCallback || function (res) { console.log(res) });
            }
        }
    }

    t.ShowConfirm = function (Question, yesCallBack, noCallBack) {
        var m = $("#confirmModal");
        if (m) {
            var options = {
                Question: (Question || "Emin misiniz?"),
                YesCallback: yesCallBack || function () { console.log(""); },
                NoCallback: noCallBack || function () { m.modal('hide'); },
            }
            t.ConfirmModalOptions(options);
            m.modal();
        }
    }

    t.ConfirmModalOptions = ko.observable();

    t.afterSave = function () {
        if (t.validationForClose().length > 0) {
            t.validationForClose.showAllMessages();
            return
        } else {
            var model = {
                Products: ko.toJS(t.selectedDataFromDbList()),
                DeskNo: t.DeskNo()
            }
            t.AddOrder(model, function (response) {
                if (response.Error) {
                    if (response.Error == "NetWork Error") {
                        t.Queue.push(JSON.parse(response.Data));
                    } else {
                        MessageBox(response.Error, "danger");
                    }
                } else {
                    MessageBox("Değişiklikler başarı ile gerçekleşti.");
                    t.selectedDataFromDbList([]);
                    t.ViewOrClose("view");
                    t.OrderCancellation(false);
                    t.validationForClose.showAllMessages(false);
                }
            })
        }
    }

    t.RemoveAfterExtra = function (parent, data, index) {
        if (data.AfterAdd()) {
            parent.Extras.splice(index, 1);
            return;
        }
        if (!data.AfterAdd()) {
            data.ExtraCount(0);
            MessageBox("Bu özellik sonradan eklenmiş bir özellik olmadığından listeden silinemez", "danger");
            return
        }
        else {
            data.ExtraCount(-1);
            return;
        }
    }

    t.isShowViewOrClose = ko.observable(false);

    t.isShowViewOrClose.subscribe(function (val) {
        if (val) {
            t.viewMessage(undefined);
        }
    })

    t.ClearAndCloseForSettings = function () {
        t.viewListFromServer().map(function (m) {
            m.list().map(function (f) {
                f.isSelected(false);
            })
        });
        t.selectedDataFromDbList([]);
    }

    t.LoginControl = function (data) {
        var login = JSON.parse(app.LocalStorage.Read("au"));
        if (login) {
            t.loginInfo(login);
        } else {
        }
    }

    t.initUserModel = ko.computed(function () {
        if (!t.loginInfo()) {
            var data = JSON.parse(app.LocalStorage.Read("au"));
            t.user(new userModel(data));
        } else {
            return;
        }
    })

    t.Login = function () {
        t.user().Login(function (response) {
            if (response.Error) {
                t.user().NotFound(true);
                t.user().ErrorMessage(response.Error);
            } else if (response.user) {
                t.user().ID(response.user.ID);
                t.user().UserName(response.user.UserName);
                t.user().RoleId(response.user.RoleId);
                if (response.roles.length > 0) {
                    var roles = response.roles.filter(function (r) {
                        return r.UseRole == true;
                    });
                    if (response.roles.length == roles.length) {
                        response.roles.push({ RoleId: 6, Name: "CanEdit", UseRole: true });
                    }
                    t.user().Roles(response.roles);
                }
                t.LoginControl(ko.toJS(t.user()));
                app.LocalStorage.Write("AU", JSON.stringify(ko.toJS(t.user())));
                app.LocalStorage.Write("BL", JSON.stringify(ko.toJS(t.user())));
                location.reload();
            }
        })
    }

    t.SignOut = function () {
        if (t.loginInfo()) {
            app.Cookie.Remove("AU");
            app.LocalStorage.Remove("AU");
            location.reload();
            return true;
        } else {
            return;
        }
    }

    t.Query = ko.observable();

    t.sortedCartItems = ko.pureComputed(function () {
        return t.cartItems() && t.cartItems().length > 0 ? t.cartItems().sort() : [];
    })

    t.onEnter = function (d, e) {
        if (e.keyCode === 13) {
            t.search();
        }
        return true;
    };


    t.searchView = ko.observable(false);

    t.visibleAll = function () {
        t.Query(undefined);
        t.Navigation(screens.productList);
    }

    t.search = function () {
        if (t.Query()) {
            var q = t.Query().toLowerCase();
            var Data = [];
            var List = [];
            var Name = [];
            for (var i = 0; i < t.data().length; i++) {
                for (var j = 0; j < t.data()[i].Products().length; j++) {
                    if (t.data()[i].Products()[j].Name().toLowerCase().indexOf(q) >= 0)
                        List.push(t.data()[i].Products()[j]);
                }
            }
            if (List.length > 0) {
                var message = "Arama sonu";
                Name.push(List.length == 1 ? message + "cu" : message + "çları");
                Data.push({ Name: Name, Products: List });
            }
            if (Data.length > 0) {
                t.SearchList(Data);
                t.Navigation("SearchView");
            }
        }
        else {
            return;
        }
    };

    t.SearchList = ko.observableArray([]);

    t.SearchList = ko.pureComputed({
        read: function () {
            if (t.Query()) {
                if (t.Query().length >= 2) {
                    var q = t.Query().toLowerCase();
                    var data = ko.observableArray();
                    var filteredData = ko.observableArray([]);
                    //var _d = t.XmlToJsonData().filter(function (f) { return f.valid });
                    t.XmlToJsonData().filter(function (f) {
                        return f.STOKLAR.STOK && f.STOKLAR.STOK().filter(function (ff) {
                            if (ff.SADI().toLowerCase().indexOf(q) >= 0) {
                                filteredData.push(ff);
                            }
                        })
                    });
                    if (filteredData().length > 0) {
                        var message = "Arama sonu";
                        var STOKLAR = { STOK: filteredData || [] }
                        data([{ Name: filteredData().length == 0 ? message + "cu" : message + "cları" }, { STOKLAR: STOKLAR }]);
                        //t.searchView(true);
                        t.Navigation("SearchView");
                        return data();
                    } else {
                        return [];
                    }

                } else {
                    //t.searchView(false);
                    t.Navigation(screens.productList);
                    return [];
                }

            } else {
                //t.searchView(false);
                t.Navigation(screens.productList);
                return [];
            }
        },
        write: function (data) {
            return data;
        }
    });


    t.hideSearchList = function () {
        if (t.searchView()) {
            t.searchView(false);
        }
    }

    t.Direction = ko.observable(true);

    t.isCollapse = ko.observable(true);

    t.ProductDetails = ko.observable();

    t.showDetailDialog = ko.observable(false);

    t.showDetail = function (data) {
        t.ProductDetails(data);
        var _d = data.Details;
        t.ProductDetail(new EditViewModel(data.SID(), data.SADI(), _d.ImgPath(), [], _d.Heat(), _d.Interval(), _d.CookingTime(), _d.Description(), _d.Calori()))
        t.Next("container", "product-detail");
    }

    t.ProductDetail = ko.observable();

    t.EditDetail = function (data) {
        var _d = data.Details;
        t.ProductDetail(new EditViewModel(data.SID(), data.SADI(), _d.ImgPath(), [], _d.Heat(), _d.Interval(), _d.CookingTime(), _d.Description(), _d.Calori()))
        t.Next("container", "product-edit");
        t.ProductDetails(data);
    }

    t.AddDetail = function () {
        alert();
    }

    t.GetFileInput = function (event) {
        var formData = GetFormData(event);
        if (formData) {
            fileUpload('/home/UploadImage', formData, function (res) {
                var data = JSON.parse(res)
                if (data.files.length > 0) {
                    for (var i = 0; i < data.files.length; i++) {
                        t.ProductDetail().File(data.files[i].Path);
                    }

                }
            })
        }
    }

    t.backToindex = function () {
        t.Next("product-detail", "container");
        t.ProductDetail(undefined);
    }

    t.showCartView = ko.observable(false);

    t.showCart = ko.observable(false);

    t.openModal = function () { return t.cartItems().length > 0 ? ((t.Direction() == true ? t.Direction(false) : t.Direction(false)) && t.showCart(!t.showCart())) : false }

    t.openCart = function () {
        if (t.cartItems().length > 0) {
            t.Direction() == true ? t.Direction(false) : t.Direction(false);
            //t.newCartTemp(!t.newCartTemp()))
            t.Navigation(screens.cart);
        }
        // return t.cartItems().length > 0 ? ((t.Direction() == true ? t.Direction(false) : t.Direction(false)) && t.newCartTemp(!t.newCartTemp())) : false
    }

    t.refreshCache = function () {
        app.LocalStorage.Remove("alldata");
        app.LocalStorage.Remove("paymenttypes");
        app.LocalStorage.Remove("desk");
        location.reload();
    }

    t.XmlToJsonData = ko.observableArray([]);

    t.Run = function () {
        var d = JSON.parse(app.LocalStorage.Read("AllData"));
        if (d != null && d.length > 0) {
            t.XmlToJsonData(ko.mapping.fromJS(d)());
            view.IsLoading(false)
        }
        else {
            t.Load();
        }
    }

    t.Load = function () {
        t.IsLoading(true);
        PostQuery("/api/GetAll", { DepNo: (t.user() && t.user().DepartNo() || "") }, function (res) {
            if (res && res.obj && res.obj.GRUPLAR) {
                var data = Array.isArray(res.obj.GRUPLAR.GRUP) == false ? [res.obj.GRUPLAR.GRUP] : res.obj.GRUPLAR.GRUP;
                t.DataMapping(data);
            } else {
                console.log("MPOS_URUNLIST prosedürü eksik veya bu prosedürün içeriğini oluşturacak fieldlar yok önce database bu prosedürü çalıştırınız. Eğer prosedür varsa ürün tanımlarını kontrol ediniz.");
                t.XmlToJsonData([]);
            }
            //if (t.XmlToJsonData().length > 0) {
            //    app.LocalStorage.Write("AllData", t.XmlToJsonData());
            //}
        });
    }

    t.DataMapping = function (data) {
        var dp = t.user && t.user() && t.user() && t.user().DepartNo && t.user().DepartNo();
        data.map(function (f, index) {
            f.STOKLAR = f.STOKLAR || { STOK: [] };
            f.STOKLAR.STOK = f.STOKLAR.STOK || [];
            if (!Array.isArray(f.STOKLAR.STOK)) {
                f.STOKLAR.STOK = [f.STOKLAR.STOK];
            }
            f.valid = ko.observable(true);
            var sayac = 0;
            f.STOKLAR.STOK.map(function (ff, index) {
                ff.valid = ko.observable(true);
                var counter = 0;
                ff.FIYATLAR = ff.FIYATLAR || {};
                // departman boşsa mevcut departmanda satılabilir
                ff.FIYATLAR.FIYAT = ff.FIYATLAR.FIYAT || [{ DEP: dp, F: "-1" }];
                if (!Array.isArray(ff.FIYATLAR.FIYAT)) {
                    ff.FIYATLAR.FIYAT = [ff.FIYATLAR.FIYAT];
                }
                ff.EKSTRALAR = ff.EKSTRALAR || {},
                    ff.EKSTRALAR.EKSTRA = ff.EKSTRALAR.EKSTRA || [];
                if (!Array.isArray(ff.EKSTRALAR.EKSTRA)) {
                    ff.EKSTRALAR.EKSTRA = [ff.EKSTRALAR.EKSTRA];
                }
                ff.Extras = ff.EKSTRALAR.EKSTRA;
                ff.Extras.map(function (Ex, idx) {
                    Ex.ExtraCount = 0;
                    Ex.ExtraCount = "";
                    Ex.Price = Ex.OFYT;
                    Ex.Name = Ex.ADI;
                    Ex.isOk = "";
                    Ex.AfterAdd = false;
                    Ex.ID = idx + 1;
                })
                ff.FIYATLAR.FIYAT.map(function (fff) {
                    if (fff.DEP == dp && fff.F > "-1") {
                        f.STOKLAR.STOK[index].F = fff.F;
                    }
                    if (fff.DEP != dp) {
                        counter++;
                    }
                });
                if (counter == ff.FIYATLAR.FIYAT.length) {
                    ff.valid(false);
                    sayac++;
                }
                ff.Query = "";
                ff.AccNo = 0,
                    ff.Collapse = false;
                ff.Quantity = 1;
                ff.DisplayPrice = null;
                ff.Currency = ff.D || "TL";
                ff.Details = {
                    Calori: ff.PSURE || 0,
                    Description: ff.DES || "",
                    Name: ff.SADI || "",
                    CookingTime: ff.PSURE || "",
                    Interval: ff.SSURE || "",
                    Heat: ff.SSCK || "",
                    ImgPath: ff.SR || ""
                };
            })
            if (sayac == f.STOKLAR.STOK.length) {
                f.valid(false);
            }
        });
        data.map(function (f, idx) {
            if (f.STOKLAR.STOK.length == 0) {
                console.log(f.GADI + " grubunda herhangi stok olmadığından listede yer almayacak bu grubun listede yer almasını istiyorsanız stok ekleyin");
                data.splice(idx, 1);
            }
        });
        t.XmlToJsonData(ko.mapping.fromJS(data)());
        t.WriteToLog(data, dp);
        t.IsLoading(false);
    }

    t.WriteToLog = function (data, departman) {
        var hiddenData = [];
        data.map(function (group, index) {
            if (!group.valid()) {
                hiddenData.push({
                    GrupAdı: group.GADI,
                    Stok: group
                });
            } else {
                group.STOKLAR.STOK.map(function (stok, sidx) {
                    if (!stok.valid()) {
                        hiddenData.push({
                            GrupAdı: group.GADI,
                            Stok: stok
                        });
                    }
                });

            }
        });
        console.log(departman + " numaralı departmana ait olamayan ürünler ", hiddenData);
    }

    t.NewMasa = ko.observable();

    t.NewMasaEnabled = ko.observable(false);

    t.extrasTotal = ko.observable();

    t.CurrentDepData = function (data) {
        var dp = t.user && t.user() && t.user() && t.user().DepartNo && t.user().DepartNo();
        var d = data;
        if (d.length > 0 && dp) {
            d.forEach(function (itm, idx) {
                itm.valid = ko.observable(true);
                var sayac = 0;
                itm.STOKLAR.STOK.forEach(function (stk, sidx) {
                    stk.valid = ko.observable(true);
                    var counter = 0;
                    stk.FIYATLAR.FIYAT.map(function (fyt, fidx) {
                        if (fyt.DEP != t.user().DepartNo()) {
                            counter++;
                        }
                    })
                    if (counter == stk.FIYATLAR.FIYAT.length) {
                        stk.valid(false);
                        sayac++;
                    }
                    // burdaki kodda  fiyat eğer birden fazla varsa ve bu departmana girilmemişse hata veriyordu
                    //if (stk.FIYATLAR.FIYAT.length == 1) {
                    //    if (stk.FIYATLAR.FIYAT[0].DEP != t.user().DepartNo()) {
                    //        stk.valid(false);
                    //        sayac++;
                    //    }
                    //}
                });
                if (sayac == itm.STOKLAR.STOK.length) {
                    itm.valid(false);
                }
            })
            return d;
        } else {
            return [];
        }
    };

    t.plusExtra = function (data) {
        if (data && data.Name()) {
            data.isOk(true);
            data.ExtraCount(1);
        }
    }

    t.minusExtra = function (data) {
        if (data && data.Name()) {
            data.isOk(false);
            data.ExtraCount(-1);
        }
    }

    t.AfterAdd = function (data) {
        if (data && data.Query()) {
            t.AddExtra(data);
        }
    }

    t.enterKey = function (data) {
        if (data && data.Query()) {
            var q = data.Query();
            data.Query(undefined);
            data.AfterAdd(false);
            var i = t.FindIndexByCart(data);
            t.cartItems()[i].Extras.push(new extraProductModel(0, q, true, i, "1"));
        }
    }

    t.RemoveExtras = function (parentData, currentIndex, currentdata) {
        var i = t.FindIndexByCart(parentData);
        if (i != undefined) {
            t.cartItems()[i].Extras.splice(currentIndex, 1);
        }
    }

    t.Close = function (data) {
        data.AfterAdd(false);
        data.Query(undefined);
    }
    t.DownAccNo = function (data) {
        if (data && parseInt(data.AccNo && data.AccNo() || 0) <= 0) {
            MessageBox("Kişi Numarası 0 dan küçük olamaz");
        }
        else {
            data.AccNo(parseInt(data.AccNo()) - 1)
            return
        }
    }
    t.UpAccNo = function (data) {
        if (data && parseInt(data.AccNo && data.AccNo() || 0) >= 8) {
            MessageBox("Kişi Numarası 8 den büyük olamaz");
        }
        else {
            data.AccNo(parseInt(data.AccNo()) + 1)
            return
        }
    }

    t.CurrentExtra = ko.observableArray([]);

    t.AddExtra = function (data) {

        if (data && data.Query()) {

            var ID = data.Extras().length;
            var model = { AfterAdd: ko.observable(true), Name: ko.observable(data.Query()), Price: ko.observable(0), IsOk: ko.observable(), ExtraCount: ko.observable(1), isOk: ko.observable(true), ID: ko.observable(ID + 1) };
            data.Extras.push(model);
            data.Query(undefined);
        }
    }

    t.CartUp = function (data) {
        data.AfterAdd(false);
        data.Quantity(data.Quantity() + 1);
        toplam = data.DisplayPrice() * data.Quantity();
        data.DisplayPrice(toplam);
        t.cartItems().map(function (obj, index) {
            if (obj.Name() == data.Name()) {
                obj.Quantity(data.Quantity());
            }
        });
        //var i = t.FindIndexByCart(data);
        //if (i != undefined) {
        //    var q = parseInt(t.cartItems()[i].Quantity());
        //    t.cartItems()[i].Quantity(q + 1);
        //}
    }
    t.CartDown = function (data) {
        data.AfterAdd(false);
        var i = t.FindIndexByCart(data);
        if (i != undefined) {
            var q = parseInt(t.cartItems()[i].Quantity());
            t.cartItems()[i].Quantity() > 1 ? t.cartItems()[i].Quantity(q - 1) : t.RemoveFromCart(data);
        }
    }

    t.FindIndexByCart = function (data) {
        var index;
        for (var i = 0; i < t.cartItems().length; i++) {
            if (JSON.stringify(ko.toJS(data)) == JSON.stringify(ko.toJS(t.cartItems()[i]))) {
                index = i;
            }
        }
        return index;
    }

    t.RemoveFromCart = function (data) {
        data.AfterAdd(false);
        var index = t.FindIndexByCart(data);
        if (index != undefined) {
            t.cartItems.splice(index, 1);
        }
    }

    t.GroupedCartItems = ko.pureComputed(function () {
        if (t.cartItems().length == 0) {
            return [];
        } else {
            var data = GroupBy(ko.toJS(t.cartItems()), "AccNo");
            data.map(function (f) {
                f.TotalPrice = 0;
                f.TotalPriceText = {};
                f.Prices = [];
                f.list.map(function (ff) {
                    f.TotalPrice += ff.DisplayPrice;

                    f.TotalPriceText.hasOwnProperty(ff.Currency) ? f.TotalPriceText[ff.Currency || "TL"] += ff.DisplayPrice : f.TotalPriceText[ff.Currency || "TL"] = ff.DisplayPrice;

                });
                Object.keys(f.TotalPriceText).forEach(function (item) { f.Prices.push({ key: item ? item : "TL", value: f.TotalPriceText[item] }) });


            })
            return ko.mapping.fromJS(data)();
        }
    })

    t.Account = function () {
        var priceText = {};
        var items = ko.toJS(view.GroupedCartItems());
        items.forEach(function (item) {
            item.Prices.forEach(function (price) {
                priceText.hasOwnProperty(price.key) ? priceText[price.key] += price.value : priceText[price.key] = price.value;
            })
        })
        // return ;
        var prices = [];
        Object.keys(priceText).forEach(function (item) {

            prices.push({ key: item, value: priceText[item] })
        });
        return prices;
    }


}

var customer = function () {

    var t = this;

    t.Name = ko.observable();

    t.Lastname = ko.observable();

    t.RoomNo = ko.observable();

    t.CartNo = ko.observable();

    t.errors = ko.validation.group(t, { deep: true });

    t.Bakiye = ko.observable();

    t.CheckIn = ko.observable();

    t.CheckOut = ko.observable();

    t.Vip = ko.observable();
}