﻿/* Clase Js que representa una eliminación. Contiene toda la información y métodos necesarios
para efectuar una eliminación */

CmsElementDeletion = function(aItemId, aRemoveCallBack) {
    this._itemId = aItemId; // Puede ser una lista
    this._removeCallBack = aRemoveCallBack;
}

/* Solo se usa cuando se tiene que eliminar un elemento con el metodo "RemoveWithConfirm"
y el metodo preguntara si quieres la version localizada o todo el contenido */
CmsElementDeletion = function(aItemId, aRemoveCallBack, aRemoveLocalizatedCallBack) {
    this._itemId = aItemId; // Puede ser una lista
    this._removeCallBack = aRemoveCallBack;
    this._removeLocalizatedCallBack = aRemoveLocalizatedCallBack;
    this._resultConfirmRemove = null;
}

CmsElementDeletion.prototype = {
    MsgConfirmacion: 'Confirmaci&oacute;n',
    MsgAviso: 'Aviso',
    RemoveWithConfirm: function() {
        // Crear delegado de CallBack
        var lCallBackDelegate = Function.createDelegate(this, this.Execute);
        //Softeng.Cms.Web.BackOffice.ConfirmRemove(this._itemId, lCallBackDelegate);
        $.ajax({
            type: "POST",
            url: "/pb/Services/BackOffice.asmx/ConfirmRemove?pbl=" + Pb.Utils.Url.getPageLang(),
            data: $.compactJSON({ "aElementId": this._itemId }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(res) {
                lCallBackDelegate(res.d);
            }
        });
    },

    RemoveWithConfirmMultiple: function() {
        // Crear delegado de CallBack
        var lCallBackDelegate = Function.createDelegate(this, this.ExecuteMultiple);
        //Softeng.Cms.Web.BackOffice.ConfirmRemoveMultiple(this._itemId, lCallBackDelegate);
        $.ajax({
            type: "POST",
            url: "/pb/Services/BackOffice.asmx/ConfirmRemoveMultiple?pbl=" + Pb.Utils.Url.getPageLang(),
            data: $.compactJSON({ "aElementIds": this._itemId }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(res) {
                lCallBackDelegate(res.d);
            }
        });
    },

    RemoveWithConfirmMultipleLocalization: function() {
        // Crear delegado de CallBack
        var lCallBackDelegate = Function.createDelegate(this, this.ExecuteMultipleLocalization);

        //Softeng.Cms.Web.BackOffice.ConfirmRemoveMultiple(this._itemId, lCallBackDelegate);
        $.ajax({
            type: "POST",
            url: "/pb/Services/BackOffice.asmx/ConfirmRemoveMultiple?pbl=" + Pb.Utils.Url.getPageLang(),
            data: $.compactJSON({ "aElementIds": this._itemId }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(res) {
                lCallBackDelegate(res.d);
            }
        });
    },

    /*
    Se ejecuta la eliminación de un elemento con confirmación
    */
    Execute: function(result) {
        // Código del callback de eliminación
        this._resultConfirmRemove = result;

        var lCanDelete = result.CanDelete;
        var lMessage = result.Message;
        var lNumLocalizations = result.NumLocalizations;
        var lHasLocalization = result.HasLocalization;

        var lCallBackDelegate = Function.createDelegate(this, this._removeCallBack);

        if ((lNumLocalizations > 1) && (lHasLocalization)) {
            /* Aqui deberia llamar al formulario especial */
            // TLK.RadConfirm(lMessage, lCallBackDelegate, 350, "Confirmaci&oacute;n");

            var lCallBackDelegateLocalizated = Function.createDelegate(this,
                    this.InternalCallBackRemoveLocalizatedVersion);

            var lUrlConfirm = '/' +
                    Pb.Utils.Url.getPageLang() +
                    '/pb/forms/backoffice/MainForm/ContentRemoveConfirm.aspx?ElementId=' +
                    this._itemId;

            var oWin = TLK.OpenModalWindow(lUrlConfirm, lCallBackDelegateLocalizated);

            oWin.setSize(500, 260);
        }
        else {
            if (lCanDelete) {
                // TLK.RadConfirm(lMessage, lCallBackDelegate, 350, "Confirmaci&oacute;n");
                TLK.RadConfirm(lMessage, lCallBackDelegate, 350, this.MsgConfirmacion);
            }
            else {
                // No se puede eliminar. Se muestran las relaciones que nos referencian
                TLK.RadAlert(lMessage, 600, this.MsgAviso);
            }
        }

        // Se puede eliminar        
    },

    InternalCallBackRemoveLocalizatedVersion: function(radWindow, returnValue) {
        radWindow.close();

        if (returnValue != null) {
            if (returnValue.RemoveLocalization) {

                var lCallBackDelegateLocalizated = Function.createDelegate(this,
                    this._removeLocalizatedCallBack);

                lCallBackDelegateLocalizated(returnValue.ElementId);
            }
            else {
                if (this._resultConfirmRemove.CanDelete) {
                    var lCallBackDelegate = Function.createDelegate(this, this._removeCallBack);
                    lCallBackDelegate(true);
                }
                else {
                    TLK.RadAlert(this._resultConfirmRemove.Message, 600, this.MsgAviso);
                }
            }
        }
    },

    /*
    Se ejecuta la eliminación de múltiples elementos. No pide confirmación en casos simples
    */
    ExecuteMultiple: function(result) {
        this._elementsToDelete = new Array();
        this._AllElementsConfirmed = false;


        this.Recorrer(result, 0);
    },

    ExecuteMultipleLocalization: function(result) {
        this._elementsToDelete = new Array();
        this._AllElementsConfirmed = false;

        this.Recorrer(result, 0);
    },

    /*
    Método recursivo necesario para la eliminación con confirmación mediante callbacks de RadConfirms
    */
    Recorrer: function(result, pos) {
        //debugger;
        // Si se recorrieron todos los elementos,
        if (result.length <= pos) {
            // Llamar al CallBack que efectuará la eliminación de los elementos confirmados
            var lCallBackDelegate = Function.createDelegate(this, this._removeCallBack);
            lCallBackDelegate(this._elementsToDelete, result);
            return;
        }
        var lCanDelete = result[pos].CanDelete;
        var lHasWarnings = result[pos].HasWarnings;
        var lMessage = result[pos].Message;

        var self = this;
        // Si se puede eliminar, llamar a la confirmación y a la vuelta en caso positivo, añadir el id a la lista de elementos
        // a eliminar
        if (lCanDelete) {
            if (!lHasWarnings) {
                // No pedir confirm para confirmaciones simples (sin advertencias de eliminar relationes o versiones)
                self._elementsToDelete.push(self._itemId[pos]);
                self.Recorrer(result, ++pos);
            }
            else {
                TLK.RadConfirm(lMessage, function(args) {
                    if (args) {
                        self._elementsToDelete.push(self._itemId[pos]);
                    }
                    self.Recorrer(result, ++pos);
                }, 350, this.MsgConfirmacion);
            }
        }
        else {
            TLK.RadAlert(lMessage, 600, this.MsgAviso);
            this.Recorrer(result, ++pos);
        }
    }
}
