﻿
var params;
var modelPost;

function HandleAgregarClick() {

    var cantidad = GetCantidad();

    if (!ValidateCantidad(cantidad)) {
        return false;
    }

    var variante1 = GetVariante1OrDefault();
    var variante2 = GetVariante2OrDefault();
    var variante3 = GetVariante3OrDefault();

    if (!variante1) {
        alert(params.VarianteNotDefinedError);
        return false;
    }

    if (!ValidateVariantesRepetidas(variante1, variante2, variante3)) {
        return false;
    }

    var variante = {};
    variante.Variante1 = variante1;
    variante.Variante2 = variante2;
    variante.Variante3 = variante3;
    variante.Cantidad = cantidad;
    variante.Observaciones = GetObservaciones();

    CheckIfVariantesArrayIsCreated();

    modelPost.Variantes.push(variante);

    AppendNewVariante(variante);
    ResetInputValues();

    return true;
}

function BuildVariantePrincipalId(variante) {
    var variante1 = variante.Variante1;
    var variante2 = variante.Variante2;
    var variante3 = variante.Variante3;

    if (!variante1) {
        variante1 = '';
    }

    if (!variante2) {
        variante2 = '';
    }

    if (!variante3) {
        variante3 = '';
    }

    variante1 = EncodeVariante(variante1);
    variante2 = EncodeVariante(variante2);
    variante3 = EncodeVariante(variante3);

    return escape(variante1 + '_' + variante2 + '_' + variante3);
}

function AppendNewVariante(variante) {
    var divVariante = '<div id="varianteId_' + BuildVariantePrincipalId(variante) + '" class="varianteItem">';

    var variante1 = variante.Variante1;
    var variante2 = variante.Variante2;
    var variante3 = variante.Variante3;

    if (variante1 != undefined && variante1 != '') {
        divVariante += '<div class="variante1">' + variante.Variante1 + '</div>';
    }

    if (variante2 != undefined && variante2 != '') {
        if (variante1 != undefined) {
            divVariante += '|';
        }
        divVariante += '<div class="variante2">' + variante.Variante2 + '</div>';
    }

    if (variante3 != undefined && variante3 != '') {
        if ((variante1 != undefined) || (variante2 != undefined)) {
            divVariante += '|';
        }
        divVariante += '<div class="variante3">' + variante.Variante3 + '</div>';
    }

    divVariante += '<div class="varianteCantidad"><input type="text" value="' + variante.Cantidad + '" /></div>';
    divVariante += '<div class="varianteImagenBorrar">' + BuildImagenVarianteBorrarLink(variante) + '</div>';

    divVariante += '</div>';

    $('#variantes').append(divVariante);
    $('#nonevariantes').hide();
}

function BuildImagenVarianteBorrarLink(variante) {
    var divId = 'varianteImagenBorrarId_' + BuildVariantePrincipalId(variante);
    var img = '';

    img += '<div id="' + divId + '" class="varianteBorrar">';
    img += params.ImagenElement;
    img += '</div>';

    return img;
}

function HandleVarianteImagenBorrar(divImagenVarianteBorrar) {
    var divId = divImagenVarianteBorrar.id;
    var divIdSplit = divId.split('_');
    var variante1 = divIdSplit[1];
    var variante2 = divIdSplit[2];
    var variante3 = divIdSplit[3];

    if (variante1 == '') {
        variante1 = undefined;
    }

    if (variante2 == '') {
        variante2 = undefined;
    }

    if (variante3 == '') {
        variante3 = undefined;
    }

    var i = 0;

    variante1 = DecodeVariante(variante1);
    variante2 = DecodeVariante(variante2);
    variante3 = DecodeVariante(variante3);

    for (; i < modelPost.Variantes.length; i++) {
        var variante = modelPost.Variantes[i];
        if (variante != null && variante.Variante1 == variante1 && variante.Variante2 == variante2 && variante.Variante3 == variante3) {
            break;
        }
    }

    if (i < modelPost.Variantes.length) {
        // Encontrado
        var variante = modelPost.Variantes[i];
        modelPost.Variantes.splice(i, 1);

        $('#varianteId_' + BuildVariantePrincipalId(variante)).remove();
        if (modelPost.Variantes.length == 0) {
            $('#nonevariantes').show();
        }
    }
}

function RefreshCantidades() {
    $('.varianteItem').each(function () {
        var variante = this;
        var varianteIdSplit = variante.id.split('_');
        var variante1 = varianteIdSplit[1];
        var variante2 = varianteIdSplit[2];
        var variante3 = varianteIdSplit[3];

        if (variante1 == '') {
            variante1 = undefined;
        }

        if (variante2 == '') {
            variante2 = undefined;
        }

        if (variante3 == '') {
            variante3 = undefined;
        }

        variante1 = DecodeVariante(variante1);
        variante2 = DecodeVariante(variante2);
        variante3 = DecodeVariante(variante3);

        $(modelPost.Variantes).each(function () {
            var varianteGrabada = this;
            if (varianteGrabada != null && varianteGrabada.Variante1 == variante1 && varianteGrabada.Variante2 == variante2 && varianteGrabada.Variante3 == variante3) {
                var nuevaCantidad = $(variante).children().filter('.varianteCantidad').children().get(0).value;
                varianteGrabada.Cantidad = nuevaCantidad;
            }
        });
    });
}

function HandleListoClick() {
    if (!ValidateSubmit()) {
        return false;
    }

    $.ajax({
        url: params.AgregarCarritoPostUrl,
        type: 'POST',
        dataType: 'html',
        data: $.toJSON(modelPost),
        contentType: 'application/json; charset=utf-8',
        success: function (result) {
            if (!params.IsEdit) {
                $(params.RefreshDivId).html(result);
            } else {
                location.reload();
            }
        }
    });
}

function InitializeOrderCart(_params) {

    modelPost = {};
    params = _params;

    modelPost.ProductId = params.Model.Product.Id;

    ProcessCurrentVariantes(params.Model.Variantes);

    $('#Agregar').click(function () {
        HandleAgregarClick();
        return false;
    });

    if (params.Model.OrderVarianteInputtedByUser) {

        var preventWeirdCharacters = function (e) {
            var key = String.fromCharCode(e.which);
            var ptn = new RegExp(/^[a-zA-Z0-9ñ\/\- ]*$/);
            var result = ptn.exec(key);
            return result != null && result != undefined;
        };

        $('#Variante1').keypress(preventWeirdCharacters);
        $('#Variante2').keypress(preventWeirdCharacters);
        $('#Variante3').keypress(preventWeirdCharacters);

        $('#necesitoVariante').click(function () {
            if (modelPost.Variantes && modelPost.Variantes.length == 0) {
                $('#nonevariantes').show();
            }

            $('#Agregar').show();
            $('#variantesByUser').show();
            $('#noNecesitoVariante').show();
            $('#necesitoVariante').hide();
            ResetInputValues();

            return false;
        });

        $('#noNecesitoVariante').click(function () {
            if (confirm(params.LoseVariantesWarning)) {
                modelPost.Variantes = null;
                $('.varianteItem').remove();
                $('#Agregar').hide();
                $('#nonevariantes').hide();
                $('#variantesByUser').hide();
                $('#noNecesitoVariante').hide();
                $('#necesitoVariante').show();
                ResetInputValues();
            }

            return false;
        });

        // CHEQUEAMOS SI HAY VARIANTES CARGADAS ASI LAS MOSTRAMOS
        if (modelPost.Variantes && modelPost.Variantes.length > 0) {
            $('#necesitoVariante').hide();
            $('#noNecesitoVariante').show();
            $('#variantesByUser').show();
        } else {
            $('#Agregar').hide();

            // NO HAY VARIANTES ENTONCES MOSTRAMOS LA CANTIDAD Y OBSERVACION FIJA
            // QUE FUE CARGADA
            if (params.Model.Cantidad) {
                modelPost.Cantidad = params.Model.Cantidad;
                $('#Cantidad').val(modelPost.Cantidad);
            }
            if (params.Model.Observaciones) {
                modelPost.Observaciones = params.Model.Observaciones;
                $('#Observaciones').val(modelPost.Observaciones);
            }
        }

        $('#nonevariantes').hide();
    }

    if (!params.Model.OrderVarianteInputtedByUser && CheckIfThereAreNoVariantesToChoose()) {
        $('#Agregar').hide();
        $('#nonevariantes').hide();

        if (params.Model.Cantidad) {
            modelPost.Cantidad = params.Model.Cantidad;
            $('#Cantidad').val(modelPost.Cantidad);
        }
        if (params.Model.Observaciones) {
            modelPost.Observaciones = params.Model.Observaciones;
            $('#Observaciones').val(modelPost.Observaciones);
        }
    }

    $('#Listo').click(function () {
        HandleListoClick();
        return false;
    });

    // FIX: Esto provocaba multiples ventanas de Borrado
    $('.varianteBorrar').die('click');

    $('.varianteBorrar').live('click', function (e) {
        e.preventDefault();
        e.stopPropagation();

        if (confirm(params.ConfirmVarianteDelete)) {
            HandleVarianteImagenBorrar(this);
        }
        return false;
    });

}


function ProcessCurrentVariantes(variantes) {
    if (!variantes) {
        return false;
    }

    CheckIfVariantesArrayIsCreated();

    $(variantes).each(function () {
        var variante = this;
        modelPost.Variantes.push(variante);
        AppendNewVariante(variante);
    });

    return true;
}


function ResetInputValues() {
    ResetObservaciones();
    ResetCantidad();
    ResetVariante1IfExists();
    ResetVariante2IfExists();
    ResetVariante3IfExists();
}

function CheckIfVariantesArrayIsCreated() {
    if (!modelPost.Variantes) {
        modelPost.Variantes = [];
    }
}

function CheckIfThereAreNoVariantesToChoose() {
    var variante1 = GetVariante1OrDefault();
    var variante2 = GetVariante2OrDefault();
    var variante3 = GetVariante3OrDefault();

    return !variante1 && !variante2 && !variante3;
}

///////////////////////////////////////////////////////////////////////////////
//
//  Getters sobre la UI de Cart
//
///////////////////////////////////////////////////////////////////////////////

function ResetObservaciones() {
    $('#Observaciones').val("");
}

function ResetCantidad() {
    $('#Cantidad').val(0);
}

function GetObservaciones() {
    return $('#Observaciones').val();
}

function GetCantidad() {
    return parseInt($('#Cantidad').val());
}

function GetVariante1OrDefault() {
    return GetVarianteOrDefault('#Variante1');
}

function GetVariante2OrDefault() {
    return GetVarianteOrDefault('#Variante2');
}

function GetVariante3OrDefault() {
    return GetVarianteOrDefault('#Variante3');
}

function GetVarianteOrDefault(varianteSelector) {
    var varianteValue;
    var $varianteValue;
    if (params.Model.OrderVarianteInputtedByUser) {
        $varianteValue = $(varianteSelector);
        if ($varianteValue.length) {
            varianteValue = $varianteValue.val();
        }
    } else {
        $varianteValue = $(varianteSelector + ' option:selected');
        if ($varianteValue.length) {
            varianteValue = $varianteValue.text();
        }
    }

    if (!varianteValue || (varianteValue && !varianteValue.length)) {
        varianteValue = undefined;
    }

    return varianteValue;
}

function ResetVariante1IfExists() {
    return ResetVarianteIfExists('#Variante1');
}

function ResetVariante2IfExists() {
    return ResetVarianteIfExists('#Variante2');
}

function ResetVariante3IfExists() {
    return ResetVarianteIfExists('#Variante3');
}

function ResetVarianteIfExists(varianteSelector) {
    if (params.Model.OrderVarianteInputtedByUser) {
        $(varianteSelector).val('');
    } else {
        var $variante2ddl = $(varianteSelector);
        if ($variante2ddl.length) {
            var variante2ddl = $variante2ddl[0];
            if (variante2ddl) {
                variante2ddl.selectedIndex = 0;
            }
        }
    }
}


///////////////////////////////////////////////////////////////////////////////
//
//  Validaciones
//
///////////////////////////////////////////////////////////////////////////////

function ValidateCantidad(cantidad) {
    if (isNaN(cantidad) || cantidad <= 0) {
        alert(params.ValidateCantidadError);
        return false;
    }
    return true;
}

function ValidateSubmit() {

    if (params.Model.OrderVarianteInputtedByUser) {
        if (!modelPost.Variantes || modelPost.Variantes.length == 0) {
            var cantidad = GetCantidad();
            var observaciones = GetObservaciones();
            if (!ValidateCantidad(cantidad)) {
                return false;
            }
            modelPost.Cantidad = cantidad;
            modelPost.Observaciones = observaciones;
        } else {
            RefreshCantidades();    // Se actualizan las cantidades que se cambiaron en la UI
        }

        return true;
    }

    if (CheckIfThereAreNoVariantesToChoose()) {
        // El usuario tiene que elegir alguna variante, pero no hay ninguna para elegir, entonces
        // solo se valida la Cantidad
        var cantidad = GetCantidad();
        var observaciones = GetObservaciones();
        if (!ValidateCantidad(cantidad)) {
            return false;
        }
        modelPost.Cantidad = cantidad;
        modelPost.Observaciones = observaciones;
    } else {
        if (modelPost.Variantes && modelPost.Variantes.length == 0) {
            alert(params.ValidateSubmitError);
            return false;
        }

        RefreshCantidades();    // Se actualizan las cantidades que se cambiaron en la UI
    }

    return true;
}

function ValidateVariantesRepetidas(variante1, variante2, variante3) {
    var found;

    if (!modelPost.Variantes) {
        return true;
    }

    var length = modelPost.Variantes.length;

    $(modelPost.Variantes).each(function () {
        var variante = this;
        if (variante != null && variante.Variante1 == variante1 && variante.Variante2 == variante2 && variante.Variante3 == variante3) {
            found = true;
        }
    });
       
    if (found) {
        alert(params.ValidateVariantesRepetidasError);
        return false;
    }

    return true;
}

function EncodeVariante(varianteName) {
    if (varianteName) {
        varianteName = varianteName.replace(/ñ/g, '-nnaa-');
        varianteName = varianteName.replace(/\//g, '-nnee-');
        varianteName = varianteName.replace(/ /g, '-nnoo-');
    }
    return varianteName;
}

function DecodeVariante(varianteName) {
    if (varianteName) {
        varianteName = varianteName.replace(/-nnaa-/g, 'ñ');
        varianteName = varianteName.replace(/-nnee-/g, '/');
        varianteName = varianteName.replace(/-nnoo-/g, ' ');
    }
    return varianteName;
}

////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

function OrderDetails_InitializeUpdateOrderLinkOnClick(pedidoNumber, pageNumber) {

    $('.updateOrderLink').unbind('click');
    $('.updateOrderLink').click(function () {

        //event.preventDefault();

        var href = this.href;
        var updateParams = { pedidoNumber: pedidoNumber,
            page: pageNumber,
            observaciones: $('#AdditionalInformation').val()
        };

        $.post(href, updateParams,
                         function (htmldata) {
                             $('#order').html(htmldata);
                             AjaxHandlerSingleton.HideAjaxActivity();
                         });

        return false;
    });
}

function OrderDetails_InitializeEliminacionProductos(params) {
    $('.PedidoEliminar').click(function () {
        if (confirm(params.MessageRemoveWarning)) {
            var id = $(this).attr('id');
            var valueids = id.split('_');
            var orderId = valueids[1];
            var productId = valueids[2];

            var formPost = '';
            formPost += '<form action="' + params.UrlRemove + '" method="POST">';
            formPost += '<input type="hidden" name="orderId" value="' + orderId + '" />';
            formPost += '<input type="hidden" name="productId" value="' + productId + '" />';
            formPost += '</form>';

            var $form = $(formPost).appendTo('body');

            $form.submit();
        }
        return false;
    });
}

var $varianteCantidadEnviadaSelector;
var $varianteObservacionEnvioSelector;
var varianteCantidadEnviadaTotal;

function OrderControl_InitializeStockUpdate(params) {

    $varianteCantidadEnviadaSelector = $(params.VarianteCantidadEnviadaSelector);
    $varianteObservacionEnvioSelector = $(params.VarianteObservacionEnvioSelector);

    $(function () {
        $('.ProductoCantidadEnviada').keyup(function (e) {
            var pedidoId = this.id.split('_')[1];
            var precioStr = $('#ProductoPrecio_' + pedidoId).val();
            var precio = Number.parseLocale(precioStr);

            var cantidadEnviada = 0;
            var value = $('#CantidadEnviada_' + pedidoId).val();

            if (value) {
                cantidadEnviada = parseInt(value);
                if (!cantidadEnviada) {
                    cantidadEnviada = 0;
                }
            }

            var totalEnviado = cantidadEnviada * precio;

            $('#ProductoTotalEnviado_' + pedidoId).text(totalEnviado.localeFormat('C2'));

            var objret = OrderControl_ObtenerTotalEnviado();

            var varianteCantidadEnviadaTotal = objret.Total;

            $('.OnDataChangedFeedbackUser').show();

            $('#DivPrecioTotalEnviado').text(varianteCantidadEnviadaTotal.localeFormat('C2'));
            return false;
        });

        $('.ProductoObservacion').keyup(function (e) {
            $('.OnDataChangedFeedbackUser').show();
            return false;
        });

        $varianteObservacionEnvioSelector.keyup(function (e) {
            $('.OnDataChangedFeedbackUser').show();
            return false;
        });

        $varianteCantidadEnviadaSelector.keyup(function (e) {
            var valueTotal = 0;
            var objret = OrderControl_ObtenerTotalEnviado();

            $(objret.Productos).each(function () {
                var p = this;
                $('#ProductoCantidadEnviada_' + p.Id).text(p.CantidadEnviada);
                $('#ProductoTotalEnviado_' + p.Id).text(p.TotalEnviado.localeFormat('C2'));
            });

            varianteCantidadEnviadaTotal = objret.Total;

            $('.OnDataChangedFeedbackUser').show();

            $('#DivPrecioTotalEnviado').text(varianteCantidadEnviadaTotal.localeFormat('C2'));
            return false;
        });

        // Click en Guardar
        $('#ConfirmarControlarPedido').click(function () {

            var pedidoControlado = {};
            pedidoControlado.Items = [];

            pedidoControlado.OrderId = $('#OrderId').val();

            var cantProducto = 0;

            // por cada producto en el pedido...
            $('.productoPedido').each(function () {
                var pedidoControladoItem = {};
                var $productoPedido = $(this);
                pedidoControladoItem.ArticuloId = this.id.split('_')[1];

                // Tiene variantes?
                var $productoPedidoVarianteItem = $('#productoPedidoVariante_' + pedidoControladoItem.ArticuloId);
                if ($productoPedidoVarianteItem && $productoPedidoVarianteItem.length > 0) {

                    // Si tiene las recorremos...
                    pedidoControladoItem.VariantesControladas = [];
                    var cantVariante = 0;
                    $productoPedidoVarianteItem.find('.productoPedidoVarianteItem').each(function () {
                        var pedidoControladoVariante = {};

                        // Por cada variante saco la CantidadEnviada, el id y la observacion
                        var $productoPedidoVariante = $(this);
                        pedidoControladoVariante.OrderItemVarianteId = this.id.split('_')[1];
                        var cantidadEnviada = 0;
                        var cantidadEnviadaStr = $productoPedidoVariante.find('.VarianteCantidadEnviada').val();
                        if (cantidadEnviadaStr) {
                            cantidadEnviada = parseInt(cantidadEnviadaStr);
                            if (!cantidadEnviada) {
                                cantidadEnviada = 0;
                            }
                        }

                        pedidoControladoVariante.CantidadEnviada = cantidadEnviada;
                        pedidoControladoVariante.Observaciones = $productoPedidoVariante.find('.VarianteObservacionEnvio').val();

                        pedidoControladoItem.VariantesControladas[cantVariante] = pedidoControladoVariante;
                        cantVariante++;
                    });

                } else {
                    // Al no tener variantes entonces saco la cantidadenviada y observacion a nivel de producto
                    pedidoControladoItem.CantidadEnviada = $productoPedido.find('.ProductoCantidadEnviada').val();
                    pedidoControladoItem.Observaciones = $productoPedido.find('.ProductoObservacion').val();
                }

                pedidoControlado.Items[cantProducto] = pedidoControladoItem;
                cantProducto++;
            });

            $.ajax({
                url: params.ControlarPedidoPostUrl,
                type: 'POST',
                dataType: 'html',
                data: $.toJSON(pedidoControlado),
                contentType: 'application/json; charset=utf-8',
                success: function (htmldata) {
                    $('#admin').html(htmldata);
                }
            });

            return false;
        });
    });
}

function OrderControl_ObtenerTotalEnviado() {
    var objret = {};
    objret.Productos = [];
    objret.Total = 0;

    $varianteCantidadEnviadaSelector.each(function () {

        var pedidoId = this.id.split('_')[2];
        var precioStr = $('#ProductoPrecio_' + pedidoId).val();
        var precio = Number.parseLocale(precioStr);
        var value = $(this).val();
        var cantidadEnviada = 0;

        if (value) {
            cantidadEnviada = parseInt(value);
            if (!cantidadEnviada) {
                cantidadEnviada = 0;
            }

            objret.Total += cantidadEnviada * precio;
        }

        var productItem;

        $(objret.Productos).each(function () {
            var p = this;
            if (p.Id == pedidoId) {
                productItem = p;
                return false;
            }
        });

        if (!productItem) {
            productItem = {};
            productItem.Id = pedidoId;
            productItem.TotalEnviado = 0;
            productItem.CantidadEnviada = 0;
            objret.Productos.push(productItem);
        }

        productItem.CantidadEnviada += cantidadEnviada;
        productItem.TotalEnviado += cantidadEnviada * precio;

    });

    $('.ProductoCantidadEnviada').each(function () {
        var value = $(this).val();
        var pedidoId = this.id.split('_')[1];
        var precioStr = $('#ProductoPrecio_' + pedidoId).val();
        var precio = Number.parseLocale(precioStr);
        var totalEnviado = precio * value;
        objret.Total += totalEnviado;
    });

    return objret;
}

function OrderControl_ValidarCantidadItem(obj) {
    var txt = $(obj);
    var validNumber = /^\d+$/;

    if (txt.val().length == 0) {
        alert("Debe ingresar un numero valido");
        txt.focus();
        return false;
    }

    if (txt.val().length > 0) {
        if (txt.val().search(validNumber) == -1 || txt.val() == "") {
            alert("Debe ingresar un numero valido");
            txt.focus();
            return false;
        }
    }

    return true;
}


