Type.registerNamespace('Devy.UI.Carrito');

Devy.UI.Carrito.CarritoView = function() {
    Devy.UI.Carrito.CarritoView.initializeBase(this);

    //Miembros
    this._Container = null;
    this._CSSClass = "";

    this._HtmlViewTemplateName = "";

    this._ItemsContainer = null;
    this._BusinessObject = null;
}

Devy.UI.Carrito.CarritoView.prototype = {
    //*********************************************************************
    //Publicos
    set_Container: function (value) { this._Container = value; },
    get_Container: function () { return this._Container; },

    set_CSSClass: function (value) { this._CSSClass = value; },
    get_CSSClass: function () { return this._CSSClass; },

    set_HtmlViewTemplateName: function (value) { this._HtmlViewTemplateName = value; },
    get_HtmlViewTemplateName: function () { return this._HtmlViewTemplateName; },

    set_UserRegistrationLinkUrl: function (value) { this._UserRegistrationLinkUrl = value; },
    get_UserRegistrationLinkUrl: function () { return this._UserRegistrationLinkUrl; },
    set_UserRegistrationLinkText: function (value) { this._UserRegistrationLinkText = value; },
    get_UserRegistrationLinkText: function () { return this._UserRegistrationLinkText; },

    set_UserPasswordRecoveryLinkUrl: function (value) { this._UserPasswordRecoveryLinkUrl = value; },
    get_UserPasswordRecoveryLinkUrl: function () { return this._UserPasswordRecoveryLinkUrl; },
    set_UserPasswordRecoveryLinkText: function (value) { this._UserPasswordRecoveryLinkText = value; },
    get_UserPasswordRecoveryLinkText: function () { return this._UserPasswordRecoveryLinkText; },

    initialize: function () {
        Devy.UI.Carrito.CarritoView.callBaseMethod(this, 'initialize');

        this._ServicePortal = Devy.UI.Carrito.CarritoService;
        this._MembershipServicePortal = Devy.UI.MembershipService;

        this._initInterface();

        this._atachEvents();


        Devy.UI.Carrito.CarritoView.__RegisterInstance(this);

        this._BeginGetObject();
        this.____loading = true;
    },

    dispose: function () {
        this._detachEvents();

        Devy.UI.Carrito.CarritoView.callBaseMethod(this, 'dispose');
    },

    _atachEvents: function () {
        var contexto = this;


    },

    _detachEvents: function () {

    },

    _initInterface: function () {
        var containerJQ = $(this._Container);
        var contexto = this;


        //Vista minima (Collapsed)
        this._PanelMinimo = $('<div class="PanelMinimo"></div>')[0];
        $(this._PanelMinimo).hide();
        this._PanelMinimoInfo = $('<p class="Info"></p>')[0];
        $(this._PanelMinimo).append(this._PanelMinimoInfo);

        var PanelMinimoCommandContainer = $('<p class="CommandContainer"></p>');

        this._showPanelCompletoCmd = $('<a href="#" title = "Mostrar contenido del carrito" class="Command ShowPanelCompleto"><span> Mostrar </span></a>')[0];
        this._hidePanelCompletoCmd = $('<a href="#" title = "Ocultar contenido del carrito" class="Command HidePanelCompleto"><span> Ocultar </span></a>')[0];
        $(this._hidePanelCompletoCmd).hide();

        $addHandler(this._showPanelCompletoCmd, "click", function (evt) {
            evt.preventDefault();
            contexto._ShowPanelCompleto();
        });
        $addHandler(this._hidePanelCompletoCmd, "click", function (evt) {
            evt.preventDefault();
            contexto._HidePanelCompleto();
        });

        PanelMinimoCommandContainer.append(this._showPanelCompletoCmd);
        PanelMinimoCommandContainer.append(this._hidePanelCompletoCmd);

        $(this._PanelMinimo).append(PanelMinimoCommandContainer);
        containerJQ.append(this._PanelMinimo);




        //Vista Completa (Expanded)
        this._PanelCompleto = $('<div class="PanelCompleto"></div>')[0];
        containerJQ.append(this._PanelCompleto);
        var PanelCompletoJQ = $(this._PanelCompleto);
        PanelCompletoJQ.hide();

        var itemsPanel = $('<div class="ItemsPanel"></div>')
        PanelCompletoJQ.append(itemsPanel);

        this._ItemsContainer = $('<div class="ItemsContainer"></div>')[0];
        itemsPanel.append(this._ItemsContainer);

        this._CommandsContainer = $('<div class="CommandsContainer"></div>')[0];
        this._enviarCarritoCmd = $('<a href="#" title = "Enviar carrito" class="Command enviarCarritoCmd"><span> Enviar </span></a>')[0];
        $addHandler(this._enviarCarritoCmd, "click", function (evt) {
            evt.preventDefault();

            contexto._CheckAuthenticationAndSendCarrito();
        });
        $(this._CommandsContainer).append(this._enviarCarritoCmd);
        PanelCompletoJQ.append(this._CommandsContainer);


        this._InfoContainer = $('<div class="InfoContainer"></div>')[0];
        PanelCompletoJQ.append(this._InfoContainer);


    },



    _ShowPanelCompleto: function () {
        this._PanelCompletoVisible = true;
        $(this._PanelCompleto).show();

        $(this._showPanelCompletoCmd).hide();
        $(this._hidePanelCompletoCmd).show();

        this._updateItemsList();
    },

    _HidePanelCompleto: function () {
        this._PanelCompletoVisible = false;
        $(this._PanelCompleto).hide();

        $(this._hidePanelCompletoCmd).hide();
        $(this._showPanelCompletoCmd).show();
    },


    _CheckAuthenticationAndSendCarrito: function () {
        //Invocamos el servicio
        var ServiceData = new Array();
        ServiceData.Requester = this;


        this._MembershipServicePortal.UserIsAuthenticated(
            this._onMembershipServiceSuccess, this._onMembershipServiceError, ServiceData);

    },

    _onMembershipServiceSuccess: function (result, context, methodName) {
        if (result) {
            //Estamos logueados, enviamos el carro
            context.Requester._sendCarrito();
        }
        else {
            //Usuario no logueado, mostramos el login
            //Mostramos el dialogo
            var formDialog = context.Requester._getLoginDialog();

            $(formDialog).dialog({ dialogClass: 'devy-EditForm',
                modal: true,
                title: "Debe iniciar sesión para continuar",
                height: 400,
                width: 600,
                closeOnEscape: true,
                close: function () { $(this).dialog('destroy'); }
            });
        }
    },
    _onMembershipServiceError: function (error, context, methodName) {
        //No hay nada por hacer
    },

    _sendCarrito: function () {
        var ServiceData = new Array();
        ServiceData.Requester = this;

        Devy.Notifications.ShowLoading("Enviando el carrito");

        this._ServicePortal.SendCarrito(
            this._onCarritoServerSuccess, this._onCarritoServerError, ServiceData);
    },



    _updateInterface: function () {
        //Panel Minimo
        $(this._PanelMinimoInfo).html('<span>Cantidad de items en el carrito: </span><strong>' + this._BusinessObject.Cantidad + '</strong>');


        //Panel completo
        var infoContainerJQ = $(this._InfoContainer);
        infoContainerJQ.empty();

        infoContainerJQ.append('<p class="Cantidad"><span>Cantidad: </span><strong>' + this._BusinessObject.Cantidad + '</strong></p>');
        if (!this._BusinessObject.CarritoSinPrecio) {
            infoContainerJQ.append('<p class="Importe"><span>Importe: </span><strong>' + this._BusinessObject.Importe + '</strong></p>');
        }

        if (this._BusinessObject.Items.length > 0) {
            $(this._PanelMinimo).show();

            if (!this.____loading) this._ShowPanelCompleto(); //Evitar que se abra al cargar la pagina si tiene items

            $(this._enviarCarritoCmd).show();
        }
        else {
            $(this._PanelMinimo).hide();
            $(this._PanelCompleto).hide();
        }

        this._updateItemsList();

        this.____loading = false;
    },

    _updateItemsList: function () {
        var itemsContainerJQ = $(this._ItemsContainer);
        itemsContainerJQ.empty();

        var totalWidth = 0;

        if (this._BusinessObject) {
            for (var i = 0; i < this._BusinessObject.Items.length; i++) {
                totalWidth += this._updateItemsList_addItem(this._BusinessObject.Items[i]);
            }
        }

        //Seteamos ancho del contenedor
        $(this._ItemsContainer).width(totalWidth + 40);
    },

    _updateItemsList_addItem: function (itemBO) {
        var contexto = this;
        var itemsContainerJQ = $(this._ItemsContainer);

        //Vista producto
        var itemContainer = $('<div class="CarritoItem"></div>');
        itemContainer.append(itemBO.ProductoHtmlView);


        //Propiedades
        var propiedadesContainer = $('<div class="PropiedadesContainer"></div>');
        propiedadesContainer.append('<p class="Cantidad"><span>Cantidad: </span><strong>' + itemBO.Cantidad + '</strong></p>');

        if (itemBO.PrecioUnitario > 0) {
            propiedadesContainer.append('<p class="Importe"><span>Importe: </span><strong>' + itemBO.Importe + '</strong></p>');
        }

        itemContainer.append(propiedadesContainer);


        //Comandos
        var commandsContainer = $('<div class="CommandContainer"></div>');
        var deleteCmd = $('<a href="#" title = "Eliminar este item" class="Command DeleteCmd"><span> Eliminar </span></a>')[0];
        $addHandler(deleteCmd, "click", function (evt) {
            evt.preventDefault();

            contexto._BeginRemoveItem(itemBO);
        });
        commandsContainer.append(deleteCmd);

        var editCmd = $('<a href="#"  title = "Editar item" class="Command EditCmd"><span> Editar </span></a>')[0];
        $addHandler(editCmd, "click", function (evt) {
            evt.preventDefault();

            contexto._BeginEditItem(itemBO);
        });
        commandsContainer.append(editCmd);
        itemContainer.append(commandsContainer);


        itemsContainerJQ.append(itemContainer);

        //Devolvemos el ancho del item
        return itemContainer.outerWidth(true);
    },



    _refresh: function (BusinessObject) {
        this._BusinessObject = BusinessObject;
        this._updateInterface();
    },

    //WebServices
    _BeginGetObject: function () {
        //Invocamos el servicio
        var ServiceData = new Array();
        ServiceData.Requester = this;

        this._ServicePortal.GetObject(this._HtmlViewTemplateName,
            this._onCarritoServerSuccess, this._onCarritoServerError, ServiceData);

    },

    AddItem: function (IdProducto, Cantidad, IdTagsOpciones) {
        this._BeginAddItem(IdProducto, Cantidad, IdTagsOpciones);
    },

    _BeginAddItem: function (IdProducto, Cantidad, IdTagsOpciones) {
        //Invocamos el servicio
        var ServiceData = new Array();
        ServiceData.Requester = this;

        Devy.Notifications.ShowLoading("Agregando un nuevo item al carrito");

        this._ServicePortal.AddItem(this._BusinessObject, IdProducto, Cantidad, IdTagsOpciones,
            this._onCarritoServerSuccess, this._onCarritoServerError, ServiceData);

    },

    _BeginRemoveItem: function (itemBO) {
        //Invocamos el servicio
        var ServiceData = new Array();
        ServiceData.Requester = this;

        Devy.Notifications.ShowLoading("Eliminando item del carrito");

        this._ServicePortal.RemoveItem(this._BusinessObject, itemBO.Id,
            this._onCarritoServerSuccess, this._onCarritoServerError, ServiceData);

    },


    _onCarritoServerSuccess: function (result, context, methodName) {
        context.Requester._refresh(result);
        Devy.Notifications.HideLoading();

        if (methodName == "AddItem")
            context.Requester._ShowPanelCompleto();

        else if (methodName == "SendCarrito")
            Devy.Notifications.ShowMessage("Carrito", "El pedido fué enviado con éxito");
    },
    _onCarritoServerError: function (error, context, methodName) {
        //No hay nada por hacer
        Devy.Notifications.HideLoading();

        if (methodName == "SendCarrito")
            Devy.Notifications.ShowError("Error al intentar enviar el carrito", error.get_Message());
    },


    //Edit Item
    _BeginEditItem: function (CarritoItem) {
        //Mostramos el dialogo
        var formDialog = this._getEditItemFormDialog();
        this._setEditItemFormValues(CarritoItem);

        this.__EditItemFormDialog_Object = CarritoItem;

        $(formDialog).dialog({ dialogClass: 'devy-EditForm',
            modal: true,
            title: "Editar Item",
            height: 400,
            width: 600,
            closeOnEscape: true,
            close: function () { $(this).dialog('destroy'); }
        });

    },

    __BeginEditItem: function () {
        if (this.__EditItemFormDialog_Object) {
            this.__EditItemFormDialog_Object.Cantidad = Devy.Util.GetFormNumericFieldValue(this._fldEditItem_Cantidad);


            //Updateamos el BO
            var ServiceData = new Array();
            ServiceData.Requester = this;

            Devy.Notifications.ShowLoading("Actualizando item del carrito");

            this._ServicePortal.UpdateObject(this._BusinessObject,
                this._onCarritoServerSuccess, this._onCarritoServerError, ServiceData);
        }
    },

    _clearEditItemForm: function () {
        if (this._fldEditItem_Cantidad) {
            Devy.Util.SetFormTextFieldValue(this._fldEditItem_Cantidad, '');
        }
    },

    _setEditItemFormValues: function (CarritoItem) {
        if (this._fldEditItem_Cantidad) {
            Devy.Util.SetFormNumericFieldValue(this._fldEditItem_Cantidad, CarritoItem.Cantidad);


        }
    },



    _getEditItemFormDialog: function () {
        if (this.EditItemFormDialog)
            return this.EditItemFormDialog
        else {
            var jqsEditItemForm = $('<div class="Form ObjectEdit EditItemForm"></div>');

            var fieldsContainer = $('<div class="Fields"></div>');
            jqsEditItemForm.append(fieldsContainer);

            var itemCantidadContainer = $('<div class="Field TextBox NumericField">')
            itemCantidadContainer.append('<label>Cantidad</label>');
            this._fldEditItem_Cantidad = $('<input type="text" size="20" style="text-align:right" />')[0];
            Devy.Util.SetNumericTextBox(this._fldEditItem_Cantidad);
            itemCantidadContainer.append(this._fldEditItem_Cantidad);
            fieldsContainer.append(itemCantidadContainer);


            var commandsDiv = $('<div class="Field Commands Bottom">');
            fieldsContainer.append(commandsDiv);

            var uploadCommand = $('<a href="#" class="Command Ok" title="Guardar"><span>Guardar</span></a>')[0];
            commandsDiv.append(uploadCommand);

            var contexto = this;

            $addHandlers(uploadCommand, { click: function (e) {
                e.preventDefault();

                contexto.__BeginEditItem();

                jqsEditItemForm.dialog("close");
            }
            }, this);


            this.EditItemFormDialog = jqsEditItemForm[0];

            return this.EditItemFormDialog;
        }
    },

    _getLoginDialog: function () {
        if (this.LoginFormDialog)
            return this.LoginFormDialog
        else {
            var jqsLoginForm = $('<div class="Form LoginForm"></div>');

            var LoginCtrlContainer = $('<div class="LoginContainer"></div>')[0];
            jqsLoginForm.append(LoginCtrlContainer);

            var ctrlLogin = $create(Devy.UI.UsersLogin,
            {
                "Container": LoginCtrlContainer,
                "UserRegistrationLinkUrl": this.get_UserRegistrationLinkUrl(),
                "UserRegistrationLinkText": this.get_UserRegistrationLinkText(),
                "UserPasswordRecoveryLinkUrl": this.get_UserPasswordRecoveryLinkUrl(),
                "UserPasswordRecoveryLinkText": this.get_UserPasswordRecoveryLinkText()
            },
            {
                "SuccessfulLogin": this._onLoginCtrlSuccessfulLogin
            },
            {});

            ctrlLogin.___Parent = this;

            this.LoginFormDialog = jqsLoginForm[0];

            return this.LoginFormDialog;
        }
    },

    _onLoginCtrlSuccessfulLogin: function (s, e) {
        var thisRef = s.___Parent;

        //Cerramos el dialogo
        $(thisRef._getLoginDialog()).dialog("close");

        thisRef._sendCarrito();
    }
}


Devy.UI.Carrito.CarritoView.registerClass('Devy.UI.Carrito.CarritoView', Sys.Component);

Devy.UI.Carrito.CarritoView.__Instances = new Array();
Devy.UI.Carrito.CarritoView.__RegisterInstance = function (instance) {
    Array.add(Devy.UI.Carrito.CarritoView.__Instances, instance);
}
Devy.UI.Carrito.CarritoView.GetFirstInstance = function () {
    if (Devy.UI.Carrito.CarritoView.__Instances.length > 0)
        return Devy.UI.Carrito.CarritoView.__Instances[0];
    else
        return null;
}

