﻿/* 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;
}


CmsElementDeletion.prototype = {

    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=" + utils.url.get_PageLang(),
            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=" + utils.url.get_PageLang(),
            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) {
        //debugger;
        // Código del callback de eliminación
        var lCanDelete = result.CanDelete;
        var lMessage = result.Message;

        var lCallBackDelegate = Function.createDelegate(this, this._removeCallBack);
        // Se puede eliminar
        if (lCanDelete) {
            TLK.RadConfirm(lMessage, lCallBackDelegate, 350, "Confirmaci&oacute;n");
        }
        else {
            // No se puede eliminar. Se muestran las relaciones que nos referencian
            TLK.RadAlert(lMessage, 600);
        }
    },

    /*
    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);
    },

    /*
    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);
            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, "Confirmaci&oacute;n");
            }
        }
        else {
            TLK.RadAlert(lMessage, 600);
            this.Recorrer(result, ++pos);
        }
    }
}