﻿var $j = jQuery.noConflict();

/*
Fecha revision: 01/03/2010
Version: 1.0
Descricion: Clase para gestionar envios con MRW.
*/
function MRW_Envios() {

    /* VARIABLES DE CONFIGURACION */
    this.MRW_UrlWebService = "http://serviciomrw.webbuilder.es";
	this.MRW_UrlXmlFiles = "http://" + window.location.hostname + "/config/mrw";
    this.CosteObtener = "CosteMRW";
    this.MRW_showMessages = true;

    /* TEXTOS DE MRW */
    this.Msg_peso_limite = "El servicio de E-Commerce no admite paquetes mayores a 25 KG.";
    //var Msg_destino_error = "No se pueden hacer envios del producto PARAM_1 al pais de destino ( PARAM_2 ).";
    this.Msg_tarifa_noexiste = "La tarifa PARAM_1 no existe.";
    this.Msg_servicio_destino = "El servicio de E-Commerce no admite paquetes a PARAM_1.";
    this.Msg_err = "Ha ocurrido un error inesperado consulte con el administrador de la web.";
    this.Msg_volumen_limite = "El servicio de E-Commerce no admite paquetes con un volumén superior a 200 cm";

    /* TEXTOS PERSONALIZADOS */
    this.Msg_destino_error = "No se pueden enviar pedidos a su dirección de envío en el país PARAM_2.";


    /* METODOS PUBLICOS */

    this.CalcularCosteMRW = function(provDest, paisDest, provAlm, paisAlm, cuadroTarifaNacional, producto, peso, entregaEnSabado, volumenEnvio, showMessages) {

        if (typeof (showMessages) != 'undefined' && showMessages != 'undefined') { this.MRW_showMessages = showMessages; }


        if (peso > 25000) {
            if (this.MRW_showMessages) alert(this.Msg_peso_limite);
            return;
        }

        if (volumenEnvio > 200) {
            if (this.MRW_showMessages) alert(this.Msg_volumen_limite);
            return;
        }

        var areaGeo = this.CalcularAreaGeografica(provDest, paisDest, provAlm, paisAlm, producto);

        if (areaGeo == "NO_VALIDA") {
            if (this.MRW_showMessages) alert(this.Msg_destino_error.replace(/PARAM_1/, producto).replace(/PARAM_2/, paisDest));
            return;
        }

        if (areaGeo == "Internacional") {
            cuadroTarifaNacional = "Internacional";
        }
        else {
            var array = areaGeo.split(';');
            if (array.length == 1) {
                areaGeo = areaGeo;
            }
            else {
                cuadroTarifaNacional = array[0];
                areaGeo = array[1];
            }
        }


        var xml = null;



        $j.ajax({
            type: "GET",
            url: this.MRW_UrlXmlFiles + "/ProductosMRW.xml",
            dataType: "xml",
            async: false,
            success: function(data) {

                xml = data;
            },
            error: function(xhr) {
                //alert('an error occurred: ' + xhr.responseText);
                if (this.MRW_showMessages) alert(this.Msg_err);
            }
        });



        //Obtener el producto y cuadro de tarifas que corresponde
        var nodeTarifa = $j(xml).find('Producto').filter(
										function() {
										    return $j(this).attr("Name") == producto;
										}).children().filter(
										function() {
										    return $j(this).attr("Name") == cuadroTarifaNacional;
										});

        if (nodeTarifa[0] == null) {
            if (this.MRW_showMessages) alert(this.Msg_tarifa_noexiste.replace(/PARAM_1/, cuadroTarifaNacional));
            return;
        }

        //Obtener las areas geograficas de la tarifa
        var areasGeograficas = nodeTarifa[0].childNodes[0];

        var nodesRangos = null;
        if (areaGeo == "Internacional") {
            //Buscar Pais en la lista de paises y obtengo el grupo a que pertene el pais

            var PaisExtranjero = null;
            var grupoName = this.ObtenerGrupoPorPais(paisDest, producto);
            //


            if (grupoName == null) {
                if (this.MRW_showMessages) alert(this.Msg_servicio_destino.replace(/PARAM_1/, paisDest));
                $j("#result").attr("value", "El servicio de E-Commerce no admite paquetes a " + paisDest);
                return;
            }
            //Buscamos el grupo
            var listaGrupos = $j(areasGeograficas).find('Grupos')[0];
            nodesRangos = $j(listaGrupos).children().filter(
												function() {
												    return $j(this).attr("Name") == grupoName;
												}).children()[0];

        }
        else {
            //Busco Rangos dependiendo si es Nacional o Provincial
            nodesRangos = $j(areasGeograficas).find(areaGeo)[0].childNodes[0];
        }
        var costeMRW = 0;

        var variableObtener = this.CosteObtener;
        $j(nodesRangos).children().each(
										function() {
										    var rango = $j(this);
										    var minimo = parseFloat(rango.attr("Min"));
										    var maximo = parseFloat(rango.attr("Max"));
										    if ((peso >= minimo) && (peso <= maximo)) {
										        costeMRW = rango.attr(variableObtener);
										    }
										});

        var nodePrestaciones = $j(xml).find('Producto').filter(
										function() {
										    return $j(this).attr("Name") == producto;
										})[0].lastChild.childNodes;

        if (entregaEnSabado) {

            var coste = this.CalcularPrestacion(nodePrestaciones, "EntregaEnSabado", this.CosteObtener);
            costeMRW = parseFloat(costeMRW) + parseFloat(coste);
        }

        if (volumenEnvio != null) {
            var nodeProducto = $j(xml).find('Producto').filter(
										function() {
										    return $j(this).attr("Name") == producto;
										})[0];
            var excesosVolumen = $j(nodeProducto).find('ExcesosVolumen')[0].childNodes;
            var coste = 0;
            $j(excesosVolumen).each(function() {
                var volumen = $j(this);
                var minimo = parseFloat(volumen.attr("Min"));
                var maximo = parseFloat(volumen.attr("Max"));
                if (minimo <= volumenEnvio && maximo >= volumenEnvio) {
                    coste = volumen.attr(variableObtener);
                }
            });
            costeMRW = parseFloat(costeMRW) + parseFloat(coste);
        }

        return this.RoundNumber(costeMRW, 2);
    }

    this.RealizarEnvio = function(atencionDe, entregadoSabado, kilos, NombreDestinatario, observaciones, refCliente, telefonoContacto, codigoPostal, direccion, numeroDireccion, poblacion, restoDireccion, via, departamento, IdAbonado, IdFranquicia, password, TieneReembolso, ImporteReembolso, Volumen, CanalNotificacion, MailSms, Provincia, Pais, Username) {
        var request = this.CrearRequest(atencionDe, entregadoSabado, kilos, NombreDestinatario, observaciones, refCliente, telefonoContacto, codigoPostal, direccion, numeroDireccion, poblacion, restoDireccion, via, departamento, IdAbonado, IdFranquicia, password, TieneReembolso, ImporteReembolso, Volumen, CanalNotificacion, MailSms, Provincia, Pais, Username);
        var url = this.MRW_UrlWebService + "/ServicioLocal.svc/REST/ProcesarEnvio";

        var rtv = null;

        rtv = this.LlamadaWSEnvioMRW(url, request);

        return rtv;
    }

    this.CallTracking = function(abonado, agrupado, esNacional, numeroTracking, password) {

        var request = '{"Abonado":"' + abonado + '","Agrupado":' + agrupado + ',"EsEnvioNacional":' + esNacional + ',"NumeroMRW":"' + numeroTracking + '","Password":"' + password + '"}';

        var url = this.MRW_UrlWebService + "/ServicioLocal.svc/REST/ObtenerTracking";

        var rtv = null;

        rtv = this.LlamadaWSTrackingMRW(url, request);

        return rtv;
    }


    /* FUNCIONES AUXILIARES */

    this.RoundNumber = function(num, dec) {
        var result = Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
        return result;
    }

    this.CalcularPrestacion = function(nodePrestaciones, nombrePrestacion, costeObtener) {
        var coste = 0;
        $j(nodePrestaciones).each(function() {
            var prestacion = $j(this);
            if (prestacion.attr("Name") == nombrePrestacion) {
                coste = prestacion.attr(costeObtener);
            }
        });
        return coste
    }

    this.CalcularAreaGeografica = function(provDest, paisDest, provAlm, paisAlm, producto) {

        var localPaisDest = paisDest;
        var localPaisAlm = paisAlm;

        var esPaisValido = this.EsPaisValido(paisDest, producto);

        if (!esPaisValido) {
            return "NO_VALIDA";
        }

        var areaGeo = null;

        //Portugal, Andorra y gibraltar se consideran como parte de españa, tanto para el envio como para la recogida
        if (localPaisDest == "PRT") {
            localPaisDest = "ESP";
            if (localPaisAlm == "PRT") {
                localPaisAlm == "PRT";
                if (provAlm == provDest) {
                    provAlm = "XX";
                    provDest = "XX";
                } else {
                    provAlm = "XXX";
                    provDest = "XX";
                }
            } else {
                provDest = "XX";
            }
        } else if (localPaisDest == "AND") {
            localPaisDest = "ESP";
            provDest = "ANDORRA";
        } else if (localPaisDest == "GBR" && provDest == "GIBRALTAR") {
            localPaisDest = "ESP";
        }

        if (localPaisAlm == "PRT") {
            localPaisAlm = "ESP";
            if (localPaisDest == "PRT") {
                localPaisDest == "PRT";
                if (provAlm == provDest) {
                    provAlm = "XX";
                    provDest = "XX";
                } else {
                    provAlm = "XXX";
                    provDest = "XX";
                }
            } else {
                provAlm = "XX";
            }
        } else if (localPaisAlm == "AND") {
            localPaisAlm = "ESP";
            provAlm = "ANDORRA";
        } else if (localPaisAlm == "GBR" && provAlm == "GIBRALTAR") {
            localPaisAlm = "ESP";
        }


        //Saber si es tarifa nacional --> Sino es internacional
        if (localPaisDest == localPaisAlm && localPaisAlm == "ESP") {
            areaGeo = "Nacional";
            //Aplicar cuadro tarifario nacional especial
            //segun el destino de provioncias especiales
            //Ceuta
            if ((provDest == "CEUTA") || (provAlm == "CEUTA")) {
                areaGeo = "Ceuta;Nacional";
                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            //Melilla
            else if ((provDest == "MELILLA") || (provAlm == "MELILLA")) {
                areaGeo = "Melilla;Nacional";
                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            //Archipielago Balear
            else if ((provDest == "MALLORCA (BALEARES)") || (provAlm == "MALLORCA (BALEARES)")) {
                areaGeo = "Baleares;Nacional";
                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            else if ((provDest == "MENORCA (BALEARES)") || (provAlm == "MENORCA (BALEARES)")) {
                areaGeo = "Baleares;Nacional";
                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            else if ((provDest == "FORMENTERA (BALEARES)") || (provAlm == "FORMENTERA (BALEARES)")) {
                areaGeo = "Baleares;Nacional";
                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            else if ((provDest == "IBIZA (BALEARES)") || (provAlm == "IBIZA (BALEARES)")) {
                areaGeo = "Baleares;Nacional";
                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            //Archipielago Canario (Gran Canria y Tenerife)
            if ((provDest == "TENERIFE") || (provAlm == "TENERIFE")) {
                areaGeo = "CanariasTenerife;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            if ((provDest == "GRAN CANARIA (LAS PALMAS)") || (provAlm == "GRAN CANARIA (LAS PALMAS)")) {
                areaGeo = "CanariasTenerife;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            //Archipielago Canario (Lanzarote, Fuerteventura, La Palma, La Gomera y El hierro)
            if ((provDest == "LANZAROTE (LAS PALMAS)") || (provAlm == "LANZAROTE (LAS PALMAS)")) {
                areaGeo = "CanariasOtras;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            if ((provDest == "FUERTEVENTURA (LAS PALMAS)") || (provAlm == "FUERTEVENTURA (LAS PALMAS)")) {
                areaGeo = "CanariasOtras;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            if ((provDest == "LA PALMA (TENERIFE)") || (provAlm == "LA PALMA (TENERIFE)")) {
                areaGeo = "CanariasOtras;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            if ((provDest == "LA GOMERA (TENERIFE)") || (provAlm == "LA GOMERA (TENERIFE)")) {
                areaGeo = "CanariasOtras;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }
            if ((provDest == "EL HIERRO (TENERIFE)") || (provAlm == "EL HIERRO (TENERIFE)")) {
                areaGeo = "CanariasOtras;Nacional";

                areaGeo = this.CalcularSaltos(areaGeo, producto, provAlm, provDest);
            }

            //Calculo para saber si es provincial
            if ((provDest == provAlm) && (localPaisDest == localPaisAlm) && (localPaisDest = "ESP")) {
                areaGeo = "Provincial";
            }
            //Envio entre provincias que no se concideran nacionales
            else if ((provDest == "MENORCA (BALEARES)" && provAlm == "FORMENTERA (BALEARES)") || (provDest == "FORMENTERA (BALEARES)" && provAlm == "MENORCA (BALEARES)")) {
                areaGeo = "Provincial";
            }
            else if ((provDest == "CEUTA" && provAlm == "CADIZ") || (provDest == "CADIZ" && provAlm == "CEUTA")) {
                areaGeo = "Provincial";
            }
            else if ((provDest == "MALAGA" && provAlm == "MELILLA") || (provDest == "MELILLA" && provAlm == "MALAGA")) {
                areaGeo = "Provincial";
            }
        }
        else {
            areaGeo = "Internacional"
        }

        return areaGeo;
    }

    this.CalcularSaltos = function(areaGeo, producto, provAlm, provDest) {
        var xml = null;
        $j.ajax({
            type: "GET",
            url: this.MRW_UrlXmlFiles + "/Especiales.xml",
            dataType: "xml",
            async: false,
            success: function(data) {

                xml = data;
            },
            error: function(xhr) {
                //alert('an error occurred: ' + xhr.responseText);
                if (this.MRW_showMessages) alert(this.Msg_err);
            }
        });
        var nodesSaltos = null;
        nodesSaltos = $j(xml).find('Producto').filter(
										function() {
										    return $j(this).attr("Name") == producto;
										}).children().filter(
										function() {
										    return $j(this).attr("Name") == provAlm;
										});

        var saltos = null;
        if (nodesSaltos != null) {
            $j(nodesSaltos).children().filter(
					function() {
					    var destino = $j(this);
					    if (destino.attr("Name") == provDest) {
					        saltos = destino.attr("Tarifa");
					    }
					});
        }

        if (saltos != null) {
            areaGeo = saltos + ";Nacional";
        }

        return areaGeo;
    }

    this.EsPaisValido = function(paisDestino, producto) {

        var xml = null;



        $j.ajax({
            type: "GET",
            url: this.MRW_UrlXmlFiles + "/PaisesProductos.xml",
            dataType: "xml",
            async: false,
            success: function(data) {

                xml = data;
            },
            error: function(xhr) {
                //alert('an error occurred: ' + xhr.responseText);
                if (this.MRW_showMessages) alert(this.Msg_err);
            }
        });

        var listaPaises = $j(xml).find('Producto').filter(
										function() {
										    return $j(this).attr("Name") == producto;
										})[0].childNodes[0]

        //var listaPaises = $j(xml).find('Productos').find('Paises')[0];
        var find = false;
        $j(listaPaises).children().each(
										function() {
										    if ($j(this).attr("Name") == paisDestino) {
										        find = true;
										    }
										});

        return find;

    }

    this.ObtenerGrupoPorPais = function(paisDestino, producto) {
        var xml = null;

        $j.ajax({
            type: "GET",
            url: this.MRW_UrlXmlFiles + "/PaisesProductos.xml",
            dataType: "xml",
            async: false,
            success: function(data) {
                xml = data;
            },
            error: function(xhr) {
                //alert('an error occurred: ' + xhr.responseText);
                if (this.MRW_showMessages) alert(this.Msg_err);
            }
        });

        var listaPaises = $j(xml).find('Producto').filter(
										function() {
										    return $j(this).attr("Name") == producto;
										})[0].childNodes[0];

        //var listaPaises = $j(xml).find('Productos').find('Paises')[0];
        var grupo = null;
        $j(listaPaises).children().filter(
										function() {
										    var pais = $j(this);
										    if (pais.attr("Name") == paisDestino) {
										        grupo = pais.attr("Grupo");
										    }
										});

        return grupo;
    }

    this.GetTodayddMMyyyy = function() {
        var today = new Date();
        var dd = today.getDate();
        var mm = today.getMonth() + 1; //January is 0!
        var yyyy = today.getFullYear();
        if (dd < 10) { dd = '0' + dd }
        if (mm < 10) { mm = '0' + mm }

        return dd + "/" + mm + "/" + yyyy;
    }

    this.CrearRequest = function(AtencionDeValue, EntregaSabadoValue, KilosValue, NombreDestinatarioValue, ObservacionesValue, ReferenciaClienteValue, TelefonoContactoValue, CodigoPostalValue, DireccionValue, NumeroDireccionValue, PoblacionValue, RestoDireccionValue, ViaValue, DepartamentoValue, IdAbonadoValue, IdFranquiciaValue, passwordValue, TieneReembolsoValue, ImporteReembolsoValue, VolumenValue, canalNotificacionValue, mailSmsValue, ProvinciaValue, PaisValue, usernameValue) {

        var request = '{"ALaAtencionDe":"' + AtencionDeValue + '","Bultos":[{"Alto":"","Ancho":"","Dimension":"' + VolumenValue + '","Largo":"","Peso":"' + KilosValue + '","Referencia":"' + ReferenciaClienteValue + '"}],"CodigoMoneda":"","CodigoNaturalezaSeguro":"","CodigoPromocion":"","CodigoServicio":"0800","ConfirmacionInmediata":"N","ContactoEntrega":"","ContactoRecogida":"","DireccionEntrega":{"CodigoDireccion":"","CodigoPais":"' + PaisValue + '","CodigoPostal":"' + CodigoPostalValue + '","CodigoTipoVia":"' + ViaValue + '","Estado":"' + ProvinciaValue + '","Numero":"' + NumeroDireccionValue + '","Poblacion":"' + PoblacionValue + '","Resto":"' + RestoDireccionValue + '","Via":"' + DireccionValue + '"},"DireccionRecogida":{"CodigoDireccion":"","CodigoPais":"","CodigoPostal":"","CodigoTipoVia":"","Estado":"","Numero":"","Poblacion":"","Resto":"","Via":""},"EnFranquicia":"N","Entrega830":"N","EntregaPartirDe":"","EntregaSabado":"' + EntregaSabadoValue + '","Fecha":"' + this.GetTodayddMMyyyy() + '","Frecuencia":"","Gestion":"","HorarioEntrega":{"RangosHorario":[{"Desde":"","Hasta":""}]},"HorarioRecogida":{"RangosHorario":[{"Desde":"","Hasta":""}]},"ImporteReembolso":"' + ImporteReembolsoValue + '","InfoAutentificacionMRW":{"Departamento":"' + DepartamentoValue + '","IdClienteMRW":"' + IdAbonadoValue + '","IdFranquiciaMRW":"' + IdFranquiciaValue + '","Password":"' + passwordValue + '","Username":"' + usernameValue + '"},"NifDestinatario":"","NombreEntrega":"' + NombreDestinatarioValue + '","NombreRecogida":"","Notificaciones":[{"CanalNotificacion":"' + canalNotificacionValue + '","MailSMS":"' + mailSmsValue + '","TipoNotificacion":"4"}],"NumeroPuentes":"","NumeroSobre":"","ObservacionesEntrega":"' + ObservacionesValue + '","ObservacionesRecogida":"","Peso":"","Reembolso":"' + TieneReembolsoValue + '","ReferenciaEntrega":"' + ReferenciaClienteValue + '","Retorno":"N","ServicioEspecial":"","TelefonoEntrega":"' + TelefonoContactoValue + '","TelefonoRecogida":"","TipoMercancia":"","ValorAsegurado":"","ValorDeclarado":"","ValorEstadistico":"","ValorEstadisticoEuros":""}';


        return request;
    }


    /* LLAMADAS AL WEB SERVICE */

    this.LlamadaWSEnvioMRW = function(url, request) {

        var rtv = null;

        $j.ajax(
			{
			    url: url,
			    data: request,
			    type: "POST",
			    contentType: "application/json",
			    dataType: "json",
			    async: false,
			    success: function(data) {

			        rtv = data;
			    },

			    error: function(xhr) {
			        //alert('an error occurred: ' + xhr.responseText);
			        if (this.MRW_showMessages) alert(this.Msg_err);
			    }
			});

        return rtv;
    }

    this.LlamadaWSTrackingMRW = function(url, request) {
        rtv = null;

        $j.ajax(
			{
			    url: url,
			    data: request,
			    type: "POST",
			    contentType: "application/json",
			    dataType: "json",
			    async: false,
			    success: function(data) {

			        rtv = data;
			    },

			    error: function(xhr) {
			        //alert('an error occurred: ' + xhr.responseText);
			        if (this.MRW_showMessages) alert(this.Msg_err);
			    }
			});

        return rtv;
    }


}


/* Autoinstanciamos la clase */
var obj_MRW_Envios = new MRW_Envios();
