// // ------------------------------------------------------------------- function SSf_AntiFrames(){ // Bloquea la navegación bajo iframes try{ v=top.location.href; // si esto provoca error es que está bajo otro dominio } catch(err){ x=self.location; self.location="http:/"+"/nop"; top.location=x; }; };; // ------------------------------------------------------------------- function SSf_Favoritos(title,url) { // Añadir a FAVORITOS. *REVISAR* // CUIDADO CON LOS ELSE IF ... PARA QUE EL PROTECTOR NO GENERE ERRORES HAY QUE COLOCARLOS ASÍ if(document.all){ window.external.AddFavorite(url, title); // Internet Explorer }else if (window.sidebar.addPanel){ window.sidebar.addPanel(title, url, ""); // Firefox }else if (window.opera && window.print) { var elem = document.createElement('a'); // Opera elem.setAttribute('href',url); elem.setAttribute('title',title); elem.setAttribute('rel','sidebar'); elem.click(); }else{ alert("Pulsa Ctrl + D para guardar esta web en Favoritos"); // Google Chrome y RESTO } };; // ------------------------------------------------------------------- function SSf_ValidaFecha(txt){ // Devuelve true si es correcta o false si no lo es if(typeof(txt)==SSv_Nd) {return false;} var patt=/^\d{2}-\d{2}-\d{4}$/g; if(!patt.test(txt)){alert("Formato de fecha no válido (dd-mm-aaaa)");return false;} var dia = parseInt(txt.substring(0,2),10); var mes = parseInt(txt.substring(3,5),10); var anio = parseInt(txt.substring(6),10); switch(mes){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDias=31; break; case 4: case 6: case 9: case 11: numDias=30; break; case 2: if(SSf_ValidaFechaBisiesto(anio)){numDias=29;} else { numDias=28;}; break; default: alert("Fecha introducida errónea"); return false; } if (dia>numDias || dia==0){alert("Fecha introducida errónea"); return false;} return true; };; // ------------------------------------------------------------------- function SSf_ValidaFechaBisiesto(anio){ if ( ( anio % 100 != 0) && ((anio % 4 == 0) || (anio % 400 == 0))) {return true;} return false; };; // ------------------------------------------------------------------- function SSf_CargaGets(){ // Evaluamos los parámetros GET convirtíendolos en variables javascript DE TEXTO var f,fA,fA2,t; if(location.search){ fA=location.search.substr(1).split("&"); for(f in fA){ fA2=fA[f].split("="); fA2[1]=typeof(fA2[1])==SSv_Nd?"":fA2[1]; t= unescape(fA2[0]) + "='" + unescape(fA2[1]) + "';"; eval(t); }; }; };; // ------------------------------------------------------------------- function SSf_EsMovil(){ // Identifica inequívocamente que es un Móvil (o que no puede generar ventanas resizables) // (debe llamarse durante un evento de pulsación onclick de botón o de enlace) var em1,em2,em; /* mediante chequeo del evento TOUCH */ em1=true; try{document.createEvent("TouchEvent");} catch(e){em1=false;} /* mediante User Agent */ em2=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); /* ESTE DETECTOR NO FUNCIONA BIEN EN LOS DISPOSITIVOS MOVILES MODERNOS try{ var ventana=window.open("","SS_MOVIL","resizable=yes,top=1,left=1,width=100,height=100"); var ancho1=ventana.outerWidth; ventana.resizeBy(+1,+1); var ancho2=ventana.outerWidth; ventana.close(); em=(ancho1==ancho2); } catch(err) { em=true; } */ em=em1 && em2; // devolverá verdadero solo si pasó ambos tests, de lo contrario devolverá falso return em; } // ------------------------------------------------------------------- function SSf_CookieCheck(){ // Para las sesiones, chequea si el navegador acepta cookies y retorna booleano return (document.cookie!=""); } // ------------------------------------------------------------------- function SSf_CookieSet(key,value,diascaduca){ // caducidad en días (si no, serán 365 días) var expires = new Date(); var diascaduca=typeof(diascaduca)==SSv_Nd?365:diascaduca; var sumatiempo=diascaduca * 24 * 60 * 60 * 1000; expires.setTime(expires.getTime() + sumatiempo); // días x horas x minutos x segundos x 1000 milisegundos document.cookie = key + '=' + value + ';path=/;expires=' + expires.toUTCString(); } // ------------------------------------------------------------------- function SSf_CookieGet(key) { var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)'); return keyValue ? keyValue[2] : null; } // ------------------------------------------------------------------- function SSf_Imprimir(wobj){ // IMPRIMIR() = boolean // - Imprime la actual ventana. Retorna false si el explorador no admite la // impresión automática. var WebBrowser,wobj; if(typeof(wobj)==SSv_Nd){wobj=self;}; if(wobj.print){ wobj.print(); } else { if(SSv_Nav_IE){ // para los EXPLORER 4. WebBrowser = ''; wobj.document.body.insertAdjacentHTML('beforeEnd', WebBrowser); wobj.alert("Prepare la impresora y pulse aceptar para imprimir el documento"); wobj.document.WebBrowser1.ExecWB(6, 2); wobj.document.WebBrowser1.outerHTML = ""; } else { wobj.alert("Deberá imprimir este documento manualmente desde su navegador"); }; }; };; // ------------------------------------------------------------------- function SSf_Correo(asunto,cuerpo,datos_sw){ // CORREO(asunto[txt],cuerpo[txt],datos_sw) = boolean // - El parámetro datos_sw=puede ser true o false y determina si se solicitarán datos // - Genera un mensaje de correo abriendo el programa cliente predeterminado. // - Se usa \n como salto de línea standard // - recordar escapar antes de construir el link (que resulte máx. 2048 caracteres) var dominio="estores.es"; var DOMINIO="ESTORES.ES"; datos_sw=typeof(datos_sw)==SSv_Nd?(typeof(cuerpo)==SSv_Nd?true:false):datos_sw; // con cuerpo no predeterminamos la plantilla (fácilmente excedería los 2018 caracteres) asunto=typeof(asunto)==SSv_Nd?escape("Mensaje para WWW."+DOMINIO):escape(asunto); cuerpo=typeof(cuerpo)==SSv_Nd?"\n\n\n":cuerpo; var tpld =""; // plantilla para desktop var tplm =""; // plantilla para movil tplm+="WWW."+DOMINIO+" (recuerda indicar tu Cod.Postal)...%0A%0A"; if(datos_sw==true){ tpld+="PLANTILLA DE COMUNICACIÓN (rellene la información siguiente)\n"; tpld+="______________________________________________________\n"; tpld+="- Referencia (si hay)... \n"; tpld+="- Nombre/Empresa*....... \n"; tpld+="- Localidad*............ \n"; tpld+="- Código Postal......... \n"; tpld+="- Provincia*............ \n"; tpld+="- País*................. \n"; tpld+="- Teléfono/s............ \n"; tpld+="- Email de contacto*.... \n"; tpld+="______________________________________________________\n"; tpld+="- MENSAJE*...\n"; } tpld+=cuerpo+"\n"; tpld+="______________________________________________________\n"; if(datos_sw==true){ tpld+=" ·Los nombres de campos con \' * \' son obligatorios de rellenar.\n"; tpld+=" ·No efectuamos mediciones ni instalaciones, el cliente deberá ocuparse de esa labor.\n"; tpld+=" ·Si indica medidas distinga unas de otras e incluya la unidad de medida (mm,cm,mts...)\n"; tpld+=" ·En comunicaciones sobre un pedido/presupuesto, recuerde indicar la referencia.\n"; } tpld+=" ·El remitente ACEPTA expresamente la política de privacidad que mostramos en la web.\n"; tpld+="______________________________________________________\n"; tpld+="Este correo electrónico y cualquier fichero que pudiera adjuntar, contiene información de carácter confidencial exclusivamente dirigida a sus destinatarios. Queda prohibida su divulgación, copia y/o distribución a terceros sin la previa autorización por escrito del remitente. Si usted no es el destinatario de este mensaje o lo ha recibido por error recuerde que esta totalmente prohibida cualquier divulgacion, distribucion o reproduccion de la misma. Rogamos nos lo notifique inmediatamente.\n"; var tpl=SSf_EsMovil()?tplm:tpld; var cta,url; var nop=''; tpld=escape(tpld); tpl=SSv_MovilSw=="1"?tplm:tpld; cta="info"; url="mai"+"lto:"+nop; url+=cta+nop; url+=nop; url+="@"+nop; url+=dominio+nop+"?sub"+nop+"ject="+nop+asunto+nop+"&bo"+"dy="+nop+tpl; window.location.href=url; };; // ------------------------------------------------------------------- function SSf_Whatsapp(){ // WHATSAPP(asunto[txt],cuerpo[txt]) = boolean //- Genera un mensaje de correo abriendo el programa cliente predeterminado. //- Se usa \n como salto de línea standard //- recordar escapar antes de construir el link (que resulte máx. 2048 caracteres) var url,win,tpl; dominio="estores.es"; DOMINIO="ESTORES.ES"; tpl="WWW."+DOMINIO+" (recuerda indicar tu Cod.Postal)... "; // el subdominio de esta url dependerá de el ancho de la página ("api" hasta md y "web" si es mayor) if(SSv_MovilSw=="1"){ url="https://API.whatsapp.com/send?phone=34* consultar *&text="+tpl; } else { url="https://WEB.whatsapp.com/send?phone=34* consultar *&text="+tpl; } win=open(url,"SS_WIN2"); };; // ------------------------------------------------------------------- function SSf_Telefono(){ // TELEFONO() = boolean //- Abre la aplicación de llamar por teléfono var url,win,tpl; dominio="estores.es"; DOMINIO="ESTORES.ES"; tpl="WWW."+DOMINIO+" (recuerda indicar tu Cod.Postal)... "; // el subdominio de esta url dependerá de el ancho de la página ("api" hasta md y "web" si es mayor) if(SSv_MovilSw=="1"){ url="https://API.whatsapp.com/send?phone=34* consultar *&text="+tpl; } else { url="https://WEB.whatsapp.com/send?phone=34* consultar *&text="+tpl; } url="callto:0034* consultar *"; win=open(url,"SS_WIN2"); };; // ------------------------------------------------------------------- function SSf_Sonido(n,forzarSw){ // emite el sonido correspondiente al número del parámetro // SONIDOS: 0=beep, 1=tip, 2=tecleo máq. antígua, 3=chuik forzarSw=(typeof(forzarSw)==SSv_Nd)?false:forzarSw; if(forzarSw || SSv_SonidoSw) {snd[n].pause();snd[n].play();} };; // ------------------------------------------------------------------- function SSf_SonidoPausa(n,forzarSw){ // emite el sonido correspondiente al número del parámetro // SONIDOS: 0=beep, 1=tip, 2=tecleo máq. antígua, 3=chuik forzarSw=(typeof(forzarSw)==SSv_Nd)?false:forzarSw; if(forzarSw || SSv_SonidoSw) {snd[n].pause();} };; //-------------------------------------------------------------------- function SSf_Beep(){ // emite sonido siempre (independientemente de la configuración SSf_Sonido(0,true); };; //-------------------------------------------------------------------- function SSf_SonidoSw(sw){ // Activa o desactiva el sonido y su botón de la barra de navegación de la plantilla principal if(!$("#SSi_headerNav1DespSound").length){return false;} var altsw=(typeof(sw)==SSv_Nd); // alternar var ssw=altsw?!SSv_SonidoSw:sw; // si no se indica, se niega el actual estado (swap) if(ssw){ $("a").click(function(){SSf_Sonido(1);}); $("button").click(function(){SSf_Sonido(1);}); $("#SSi_headerNav1DespSound")[0].innerHTML='
Silencio'; } else { $("a").unbind( "click" ); $("button").unbind( "click" ); $("#SSi_headerNav1DespSound")[0].innerHTML='
Sonidos'; } SSv_SonidoSw=ssw; if(altsw){ document.forms['SS_formUpdateSess'].Z_ENTORNO_sonidosw.value=(ssw?"1":"0"); SSf_UpdateSess(); } return false; };; //-------------------------------------------------------------------- function SSf_Delay(milisegs){ // DELAY(milisegs[num]) = void //- Genera una pausa en milisegundos. var milisegs,then,now; then=new Date().getTime(); now=then; while((now-then)0;i--){ for(j=n;j>0;j--){self.moveBy(0,i); self.moveBy(i,0); self.moveBy(0,-i); self.moveBy(-i,0);}; }; }; };; //-------------------------------------------------------------------- function SSf_MuestraVar(variable,o_mays){ // MUESTRAVAR(variable[var],mayúsculas[bool]) = void // - Muestra el contenido de una variable general var variable,o_mays; if(typeof(variable)==SSv_Nd){return;}; o_mays=typeof(o_mays)!="boolean"?false:o_mays; variable=o_mays?variable.toUpperCase():variable; document.open(); document.write(variable); document.close(); };; //-------------------------------------------------------------------- function SSf_Trim(txt){ // TRIM(txt) = string // - Hace un TRIM delantero y trasero de un texto (elimina espacios sobrantes) var txt,result; txt=typeof(txt)==SSv_Nd?"":txt; result=txt.replace(/^\s*/,""); result=result.replace(/\s*$/,""); return result; };; //-------------------------------------------------------------------- function SSf_ChkInputInt(obj,o_warn){ // Chequea si un control INPUT (this) contiene un número entero // Globales: SSv_Nd,SSv_Nav_IE var obj,o_warn,ret,val; if(typeof(obj)==SSv_Nd){return false;}; o_warn=typeof(o_warn)!="boolean"?false:o_warn; val=obj.value;ret=true; if(isNaN(val)){ret=false;}; if(val.indexOf(".")>=0){ret=false;}; if(!ret && o_warn){ alert("Debe indicar un número entero (sin decimales)"); if(SSv_Nav_IE){WINSELECT(obj);WINFOCUS(obj);} else {obj.value="";}; }; return ret; };; //-------------------------------------------------------------------- function SSf_ChkInputFloat(obj,o_warn){ // Chequea si un control INPUT (this) contiene un número flotante. // Globales: SSv_Nd,SSv_Nav_IE var obj,o_warn,ret,val; if(typeof(obj)==SSv_Nd){return false;}; o_warn=typeof(o_warn)!="boolean"?false:o_warn; val=obj.value;obj.value=val.replace(/,/,"."); val=obj.value;ret=true; if(isNaN(val)){ret=false;}; if(!ret && o_warn){ alert("Debe indicar un número"); if(SSv_Nav_IE){WINSELECT(obj);WINFOCUS(obj);} else {obj.value="";}; }; return ret; };; //-------------------------------------------------------------------- function SSf_CheckMailServer(x){ // Chequea el servidor de una dirección email para comprobar si existe var resultado; $.ajax({ async: false, type:"GET", url : "/global/php/checkmail.php?e="+x, error: function(data){alert("CHKMAIL_SERVER: ERROR");resultado=false;}, success: function(data){resultado=(data=="");} }); return resultado; };; //-------------------------------------------------------------------- function SSf_CheckMailSyntax(x) { // Chequea la sintaxis de una dirección email para comprobar si es correcta var otro = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i; var regex = /^([a-z0-9_.+-])+\@(([a-z0-9-])+\.)+([a-z]{2,4})+$/i; return regex.test(x); };; //-------------------------------------------------------------------- function SSf_UpdateSess(destroySw,informoSw){ // ACTUALIZA LA SESIÓN MEDIANTE AJAX // Usa librería jQuery v.3.2.1 // Postea el formulario "SS_formUpdateSess" mediante AJAX para asentar la sesión actual // Si se incluye el parámetro recargaSw, después de actualizar recargará la página // Si se incluye el parámetro destroySw como "true" entonces destruye la sesión. // Si se incluye además, el parámetro informoSw, entonces notificará la destrucción. // Forzamos la redirección a la página index (si destruimos en el carrito o pedidos genera errores) var destroy=typeof(destroySw)==SSv_Nd?false:destroySw; var informo=typeof(informoSw)==SSv_Nd?false:informoSw; var dparam=destroy?"?DESTROY":""; var formId="SS_formUpdateSess"; $.ajax({ async: false, type:"POST", url : "/global/php/updatesess.php"+dparam, data: $("#"+formId).serialize(), contentType: "application/x-www-form-urlencoded; charset=utf-8", error: function(data){alert("SSf_UpdateSess [ERROR-01]\\n"+data);return false;}, success: function(data){ switch(data){ case "KO": alert("SSf_UpdateSess [ERROR-02]\\n"+data); break; case "OK": SSf_Beep(); if(destroy && informo){ $('#SSi_headerCartItems').html(''); // limpiamos el carrito alert("TODOS SUS DATOS HAN SIDO ELIMINADOS"); } location.href="/index.html"; // evita errores en la página del carrito y pedidos break; default: SSf_Beep(); alert("SSf_UpdateSess [ERROR-03]\\n"+data) } } }); };; //-------------------------------------------------------------------- function SSf_UrlExists(url) {/* NOP // Comprueba si un archivo url existe // Globales: - if(!url){return false;}; var req= new GETXMLHTTP(); // XMLHttpRequest object try { req.open("HEAD", url, false); req.send(null); return req.status== 200 ? true : false; } catch(er){ return false; }; */};; //-------------------------------------------------------------------- function ERRORJS(msj,url,linea){/* NOP // Envía error por e-mail // Globales: X_DOMINIO, ERRORJS_URI, ERRORJS_AJAX, ERRORJS_SW ERRORJS_ANT=window.onerror; // guardamos el actual controlador de errores var txt=escape(msj+"···"+url+"···"+linea+"···"+X_DOMINIO); ERRORJS_AJAX.open("GET", ERRORJS_URI+"?id="+txt); //Enviamos el error ERRORJS_AJAX.onreadystatechange = ERRORJS2; ERRORJS_AJAX.send(''); return true; */};; //-------------------------------------------------------------------- function ERRORJS2(){/* NOP if(typeof(ERRORJS_AJAX)=="undefined"){return true;}; // si el evento se dispara fuera de ventana if(ERRORJS_AJAX.readyState==4){ var txt=ERRORJS_AJAX.responseText; if(txt!="" && ERRORJS_SW==true){alert(txt);}; }; window.onerror=ERRORJS_ANT; // recuperamos el anterior controlador de errores */};; //-------------------------------------------------------------------- function SSf_AbreModal(idUri,fId,nMod,titTxt,pieTxt){ // Abre ventanas modal de forma secuencial sin necesidad de usar el data-toggle="modal" // Si se especifica "nMod" (1-3) entonces abrirá la solicitada // Parámetros: -idUri = Id del contenedor html a volcar o una URI para carga AJAX (si contiene "?" será petición GET, de lo contrario POST) // -fId = Id del formulario (sólo obligatorio si es una petición POST) // -nMod = número expreso de ventana modal (1-3) o false // -tituloTxt = html de encabezamiento // -pieTxt = html que sustituirá al botón cerrar // IMPORTANTE: -Los contenedores principales de las modales (de destino) deben ubicarse antes que los accionadores y contenedores de origen pues al clonar el innerHTML se duplican los Ids (y eso genera errores de interpretación) var m1sw,m2sw,m3sw,n; if(typeof(idUri)==SSv_Nd) {alert("SSf_AbreModal: falta id");return false;} nMod=typeof(nMod)==SSv_Nd?false:nMod; pieTxt=typeof(pieTxt)==SSv_Nd?false:pieTxt; m1sw=$('#SSi_modal1').hasClass('show'); m2sw=$('#SSi_modal2').hasClass('show'); m3sw=$('#SSi_modal3').hasClass('show'); if(m3sw){alert("SSf_AbreModal: no se pueden abrir más modales");return false;} if(!nMod){ if(m2sw){ // si ya está abierta la 2, abriremos la 3 nMod=3; } else if(m1sw) { // si solo está abierta la 1, abriremos la 2 nMod=2; } else { // si no hay ninguna abierta, abrimos la 1 nMod=1; } } if(!SSf_LlenaModal(idUri,fId,nMod,titTxt,pieTxt)){alert("SSf_AbreModal: error al llenar la modal");return false;} // cargamos la modal con la información if(nMod>1){ // eventos necesarios para cuando cerramos las ventanas 2 y 3 $("#SSi_modal"+nMod).on('hidden.bs.modal', function (e) { $("body").addClass("modal-open"); // recupera clase que oculta scroll $("#SSi_modal"+nMod).css("overflow-y","auto"); // recupera scroll $("#SSi_modal"+nMod).off('hidden.bs.modal'); // desactiva el evento }); } else {// desactivamos el scroll de body antes de abrir la modal para mantener el foco en el sitio $("#SSi_modal"+nMod).on('show.bs.modal',function(e){$("body").css("overflow-y","hidden");}); // apaga el scroll en body $("#SSi_modal"+nMod).on('hidden.bs.modal',function(e){$("body").css("overflow-y","auto");}); // vuelvo a encender el scroll en body } // mostramos el contenido $("#SSi_modal"+nMod).modal("show"); };; //-------------------------------------------------------------------- function SSf_LlenaModal(idUri,fId,nMod,titTxt,pieTxt){ // Asigna el contenido del idUri (ID o de la URI) a la ventana modal // Parámetros: -idUri = Id del contenedor html a volcar o una URI para carga AJAX (si contiene "?" será petición GET, de lo contrario POST) // -fId = Id del formulario (sólo obligatorio si es una petición POST) // -nMod = número de ventana modal (1-3) // -tituloTxt = html de encabezamiento // -pieTxt = html que sustituirá al botón cerrar // IMPORTANTE: -Si se indica una URI y su contenido tiene ###etiquetasWTS### sin traducir las mostrará tal cual. var titTxt=typeof(titTxt)==SSv_Nd?false:titTxt; var pieTxt=typeof(pieTxt)==SSv_Nd?false:pieTxt; if(typeof(idUri)==SSv_Nd) {alert("SSf_LlenaModal: falta idUri");return false;} if(typeof(nMod)==SSv_Nd) {alert("SSf_LlenaModal: falta nMod");return false;} // determinamos el tipo de ID/URI if(idUri.indexOf("/")==-1){ // si es un Id HTML var obj=document.getElementById(idUri); var buffer=obj.innerHTML; titTxt=titTxt?titTxt:obj.title; document.getElementById("SSi_modalBody"+nMod).innerHTML=buffer; } else { // si es una carga de una URL var isget=idUri.indexOf("?")>-1; // determinamos el tipo de petición dependiendo si lleva un "?" al final de la url if(typeof(fId)==SSv_Nd && !isget) {alert("SSf_LlenaModal: falta fId");return false;} // necesario para peticiones POST var tipo=isget?"GET":"POST"; var datos=isget?"":($("#"+fId).serialize()); titTxt=titTxt?titTxt:idUri; $.ajax({ async:false, type:tipo, url:idUri, data: datos, contentType: "application/x-www-form-urlencoded; charset=utf-8", error: function(data){alert("SSf_LlenaModal [ERROR-01]\n"+data); return false;}, // OTROS ERRORES success:function(data){ if(data.indexOf(" on line ")>=0){ alert("SSf_LlenaModal [ERROR-02]\n"+data); return false; // ERRORES PHP } else { document.getElementById("SSi_modalBody"+nMod).innerHTML=data; SSf_Sonido(2); } } }); } // cargamos el contenido del título if(titTxt) {document.getElementById("SSi_modalTitle"+nMod).innerHTML = titTxt;} // colocamos el pie predeterminado o el pasado por parámetros var pieTxtPred =' '; pieTxt=pieTxt?pieTxt:pieTxtPred; document.getElementById("SSi_modalFooter"+nMod).innerHTML = pieTxt; return true; } //-------------------------------------------------------------------- function XXXSSf_LlenaModalGET(url,botonCerrar,titulo){/* PARA ELIMINAR // Asigna el contenido de un fichero cargado por GET a la ventana modal var id,botonCerrar,titulo,bc,tt,buffer; bc=typeof(botonCerrar)==SSv_Nd?true:botonCerrar; tt=typeof(titulo)==SSv_Nd?false:titulo; document.getElementById("SSi_modalFooter").style.display = (bc?"block":"none"); if(tt) document.getElementById("SSi_modalTitle").innerHTML=titulo; $.ajax({ async:false, type:"GET", url:url, error: function(data){alert("SSf_LlenaModalGET [ERROR-01]\n"+data);}, // OTROS ERRORES success:function(data){ if(data.indexOf(" on line ")>=0){ alert("SSf_LlenaModalGET [ERROR-02]\n"+data); // ERRORES PHP } else { document.getElementById("SSi_modalBody").innerHTML=data; } } }); */};; //-------------------------------------------------------------------- function XXXSSf_LlenaModalPOST(formId,url,botonCerrar,titulo){/* PARA ELIMINAR // Asigna el contenido de un fichero cargado por POST a la ventana modal var formId,botonCerrar,titulo,bc,tt,buffer; bc=typeof(botonCerrar)==SSv_Nd?true:botonCerrar; tt=typeof(titulo)==SSv_Nd?false:titulo; document.getElementById("SSi_modalFooter").style.display = (bc?"block":"none"); if(tt) document.getElementById("SSi_modalTitle").innerHTML=titulo; $.ajax({ async:false, type:"POST", url:url, data: $("#"+formId).serialize(), contentType: "application/x-www-form-urlencoded; charset=utf-8", error: function(data){alert("SSf_LlenaModalPOST [ERROR-01]\n"+data);}, // OTROS ERRORES success:function(data){ if(data.indexOf(" on line ")>=0){ alert("SSf_LlenaModalPOST [ERROR-02]\n"+data); // ERRORES PHP } else { document.getElementById("SSi_modalBody").innerHTML=data; SSf_Sonido(2); } } }); */};; //-------------------------------------------------------------------- function SSf_ModalAncha(){ // la ventana modal se mostrará en toda la anchura del display y se auto ejecutará el impresor $(".modal-dialog").css("width","100%"); $(".modal-dialog").css("max-width","1200px"); $(".modal-dialog").css("margin","0px auto 0px auto"); // al cerrarse, las modales recuperarán la anchura standard $('.modal').on('hidden.bs.modal',function (e){ $(".modal-dialog").css("width",""); $(".modal-dialog").css("max-width",""); $(".modal-dialog").css("margin",""); }); };; //-------------------------------------------------------------------- function SSf_ModalPrint(){ $('.modal').on('shown.bs.modal',function (e){ $('#SSi_modal1').css("padding","1px"); //$("body").css("padding","0px"); SSf_Imprimir(self); }); // al cerrarse, recupera el estado que tenía $('.modal').on('hidden.bs.modal',function (e){ $('#SSi_modal1').css("padding",""); //$("body").css("padding",""); }); };; //-------------------------------------------------------------------- function SSf_Mensaje(html,tipo){ // Muestra un mensaje de servicio (id SSi_msg) del tipo solicitado // Si no incluye parámetros, entonces cierra (elimina) el mensaje existente var tc,html,tipo; html=typeof(html)==SSv_Nd?false:html; if(!html){ $("#SSi_msgCont").alert('close'); // elimina el contenedor } else { tipo=typeof(tipo)==SSv_Nd?0:tipo; switch(tipo){ case 2: tc="alert-secondary"; break; case 3: tc="alert-success"; break; case 4: tc="alert-info"; break; case 5: tc="alert-warning"; break; case 6: tc="alert-danger"; break; case 7: tc="alert-light"; break; case 7: tc="alert-dark"; break; default: tc="alert-primary"; } $("#SSi_msg").html(''); // restaura el contenedor limpio $("#SSi_msgHTML").html(html); $("#SSi_msgCont").addClass(tc); $("#SSi_msgCont").addClass("show"); } };; //-------------------------------------------------------------------- function SSf_ModalMensaje(html,tipo){ // Muestra un mensaje de servicio (id SSi_modalMsg) del tipo solicitado dentro una ventana modal // Si no incluye parámetros, entonces cierra (elimina) el mensaje existente var tc,html,tipo,cClick; html=typeof(html)==SSv_Nd?false:html; if(!html){ $("#SSi_modalMsgCont").alert('close'); // elimina el contenedor } else { tipo=typeof(tipo)==SSv_Nd?0:tipo; switch(tipo){ case 2: tc="alert-secondary"; break; case 3: tc="alert-success"; break; case 4: tc="alert-info"; break; case 5: tc="alert-warning"; break; case 6: tc="alert-danger"; break; case 7: tc="alert-light"; break; case 7: tc="alert-dark"; break; default: tc="alert-primary"; } $("#SSi_modalMsg").html('
'); // restaura el contenedor limpio $("#SSi_modalMsgHTML").html(html); // que desaparezca con cualquier click (NO funciona para el mensaje de gracias por comprar) // $("#SSi_modal1").on('click',function(e){return false;}); // $("#SSi_modal1").on('click',function(e){ // $("#SSi_modalMsgCont").alert('close'); // SSf_Sonido(1); // $("#SSi_modal1").off('click'); // }); } };; //-------------------------------------------------------------------- function SSf_FormAplica(myform){ // APLICADOR DE FORMULARIOS // Evita el problema de que los formularios HTML no seleccionan automáticamente los selects, radios ni // checkboxes según los valores de entrada. // Préviamente en los e colocaremos los valores en // el atributo "title", y así activará las opciones, radios y casillas de verificación correspondientes. //------------------------------------- // Ej-1: //------------------------------------- // Ej-2: ... si no coincide lo muestra desactivado // ... si coincide lo marca //------------------------------------- // Ej-3: ... se marcará si el title contiene "SI" // Además, en lugar de enviar (o no enviar), enviará SI o enviará NO for(f in myform){ if(!myform[f]) continue; if(myform[f].tagName=="SELECT"){for(g in myform[f]){if(myform[f][g]){ myform[f][g].selected = (myform[f][g].value==myform[f].title); myform[f].onmouseover=function(){titlesaved=this.title; this.title="";}; myform[f].onmouseout=function(){this.title=titlesaved;}; // evita que muestre el title }}} if(myform[f].tagName=="INPUT" && myform[f].type=="radio"){for(g in myform[f]){if(myform[f][g]){ myform[f][g].checked = (myform[f][g].value==myform[f].title); myform[f].onmouseover=function(){titlesaved=this.title; this.title="";}; myform[f].onmouseout=function(){this.title=titlesaved;}; // evita que muestre el title }}} if(myform[f].tagName=="INPUT" && myform[f].type=="checkbox"){ var ihd= document.createElement("INPUT"); ihd.type="hidden"; ihd.name=myform[f].name; myform[f].checked = (myform[f].title.toUpperCase()=="SI"); // activado si el title contiene "SI" ihd.value=myform[f].checked?"SI":"NO"; // el campo hidden contendrá SI o NO (dependiendo) myform[f].form.appendChild(ihd); // añadimos un campo hidden con el mismo nombre myform[f].onchange=function(){ihd.value=this.checked?"SI":"NO";}; // el campo hidden cambiará cuando el checkbox cambie myform[f].name="Y"+myform[f].name.substr(1); // convierte el nombre del control original en un campo efímero "Y_" myform[f].onmouseover=function(){titlesaved=this.title; this.title="";}; myform[f].onmouseout=function(){this.title=titlesaved;}; // evita que muestre el title } } };; //-------------------------------------------------------------------- // Activa el evento Onload que activará el evento OnSubmit que ejecutará un chequeo del formulario, del campo referencia y de las direcciones email function SSf_FeedIni(myform,refsw,emailsw){ //NOP 'use strict'; window.addEventListener('load', function() { // WINDOW.ONLOAD var forms = document.getElementsByClassName('needs-validation'); // formulario que requiere validación var validation = Array.prototype.filter.call(forms, function(form) { form.addEventListener('submit', function(event) { // on submit // EL CHEQUEADOR DE EMAIL GENERA ERROR Y LO HE TENIDO QUE DESHABILITAR TANTO EN ESTE _libreria.phjs COMO EN pedidos1.html if(form.checkValidity()===false || (refsw && !SSf_FeedValidaRef(myform)) || (emailsw && !SSf_FeedValidaEmail(myform)) || (emailsw && !SSf_FeedValidaEmailB(myform))){ event.preventDefault(); event.stopPropagation(); // cancela el evento submit y su propagación } form.classList.add('was-validated'); // añade la clase de que está validado },false); }); }, false); };; //-------------------------------------------------------------------- // si el valor del motivo de la consulta comienza con un caracter "_" entonces es obligatorio que escriba la referencia function SSf_FeedValidaRef(myform){ var fMo=myform.SSi_formMotivo.selectedIndex; // option seleccionado var fMov=myform.SSi_formMotivo[fMo].value; // valor del option seleccionado var fR=myform.SSi_formRef; if(fR.value=="" && fMov.substr(0,1)=="_"){fR.setCustomValidity("Debe indicar la Referencia del pedido/presupuesto.");return false;} fR.setCustomValidity("");return true; }; //-------------------------------------------------------------------- // muestra/oculta campos según el motivo seleccionado function SSf_FeedCheckMotivo(myform){ var fMo=myform.SSi_formMotivo.selectedIndex; // option seleccionado var fMov=myform.SSi_formMotivo[fMo].value; // valor del option seleccionado if(fMov.substr(0,1)=="_"){ $("#SSi_formBloqueRef").removeClass("d-none"); $("#SSi_formBloqueProductos").addClass("d-none"); } else if(fMov=="Presupuesto" || fMov=="Contratar" || fMov=="Comprar"){ $("#SSi_formBloqueProductos").removeClass("d-none"); $("#SSi_formBloqueRef").addClass("d-none"); } else { $("#SSi_formBloqueRef").addClass("d-none"); $("#SSi_formBloqueProductos").addClass("d-none"); } return true; }; //-------------------------------------------------------------------- function SSf_FeedValidaEmail(myform){ var v1=myform.SSi_formEmail; f=v1.value; v1.value=f.toLowerCase(); if(SSf_CheckMailSyntax(v1.value)===false){SSi_formEmailMsg.innerHTML="Dirección email incorrecta."; v1.setCustomValidity("Dirección email incorrecta.");return false;} if(!SSf_CheckMailServer(v1.value)){SSi_formEmailMsg.innerHTML="Esta dirección email no funciona."; v1.setCustomValidity("Esta dirección email no funciona.");return false;} v1.setCustomValidity(""); return true; }; //-------------------------------------------------------------------- function SSf_FeedValidaEmailB(myform){ var v1=myform.SSi_formEmail; var v2=myform.SSi_formEmailB; f=v1.value; v1.value=f.toLowerCase(); f=v2.value; v2.value=f.toLowerCase(); if(v1.value!=v2.value){v2.setCustomValidity("Repita correctamente su email.");return false;} v2.setCustomValidity(""); return true; }; //-------------------------------------------------------------------- function SSf_Calculador_Refresh(esto,codigo,idfocus){ // refresca vía AJAX el formulario calculador EN LA MODAL-1 // llamada desde un control del formulario '; ftxt=ftxt+' '; ftxt=ftxt+' '; ftxt=ftxt+''; if(document.forms[esto.form.id][0].value==10){ // X_ESTADO será siempre el primer input del form // incrementamos el contador del carrito (visualmente, para no tener que recargar la página) var f=$('#SSi_headerCartItems').html(); var c=f==""?0:parseInt(f); c = c + 1; $('#SSi_headerCartItems').html(String(c)); ftxt='

¡¡¡MUCHAS GRACIAS!!!

ESTE PRODUCTO HA SIDO AÑADIDO AL CARRITO'+ftxt; SSf_ModalMensaje(ftxt,3); } else { // por algún motivo esto no funciona ftxt='

¡¡¡MUCHAS GRACIAS!!!

ESTE PRODUCTO HA SIDO SUMADO AL QUE TIENES EN EL CARRITO'+ftxt; SSf_ModalMensaje(ftxt,3); } $("#SSi_modalMsgCont").click(function() {$("#SSi_modalMsgCont").alert('close');}); return true; };; //-------------------------------------------------------------------- function SSf_Calculador_Swap(esto){ // Si se teclea algo, eliminamos el importe y el botón de carrito y mostramos el de calcular // retorna si ya fue pulsada una tecla en este control esto.pulsadosw=typeof(esto.pulsadosw)!=SSv_Nd; if(esto.pulsadosw){return false;} var sys=SSv_SS?"ss":"lcp"; // sistema de tienda (LCP o SS) SSf_Beep(); //document.getElementById("SSi_calculadorssT_Fcarrito").className document.getElementById('SSi_calculador'+sys+'T_Fcarrito').className="d-none"; document.getElementById('SSi_calculador'+sys+'T_Ftotal').className="d-none"; document.getElementById('SSi_calculador'+sys+'T_Fcontactar').className="d-none"; document.getElementById('SSi_calculador'+sys+'T_Fcalcular').classList.add("d-block"); //if(document.getElementById('SSi_calculador'+sys+'T_Finfocalc')===null){} else {document.getElementById('SSi_calculador"+sys+"T_Finfocalc').className="d-none";} };; //-------------------------------------------------------------------- function SSf_Calculador_Events(){ // crea los eventos de bloqueo y corrección de teclado para el formulario if(!SSv_SS){ // sólo debe aceptar números del teclado horizontal y numérico $("input.SSc_Mm").keydown(function(e){ // var t=e.which; // if(t>=32 && (t<96 || t>105) && (t<48 || t>57)){SSf_Sonido(0);return false;} SSf_Sonido(2); }); // sólo presentará comas y números // tanto si pulsas punto como si pulsas coma siempre debe salir coma // sólo permite incluir un decimal $("input.SSc_Cm").keydown(function(e){ // var t=e.which; // if((t<96 || t>105) && t!=190) {SSf_Sonido(0);return false;} SSf_Sonido(2); }); // sólo presentará comas y números // tanto si pulsas punto como si pulsas coma siempre debe salir coma // sólo permite incluir dos decimales $("input.SSc_Mt").keydown(function(e){ // var t=e.which; // if((t<96 || t>105) && t!=190) {SSf_Sonido(2);return false;} SSf_Sonido(1); }); } else {} };; //-------------------------------------------------------------------- function SSf_carritoH_Eliminar(asiento){ var df=document.getElementById("SSi_carritoH_form"); var t="Vamos a proceder a ELIMINAR ESTE PRODUCTO, desea continuar?"; if(confirm(t)){df.X_ESTADO.value="2"; df.X_DATO.value=asiento; SSf_Sonido(3); df.submit();} };; //-------------------------------------------------------------------- function SSf_carritoH_Actualizar(foco){ var df=document.getElementById("SSi_carritoH_form"); df.X_ESTADO.value="3"; df.action="#"+foco; df.submit(); };; //-------------------------------------------------------------------- function SSf_carritoH_Vaciar(){ var df=document.getElementById("SSi_carritoH_form"); var t="Vamos a proceder a VACIAR TODO EL CARRITO, desea continuar?"; if(confirm(t)){df.X_ESTADO.value="4"; SSf_Sonido(3); df.submit();} };; //-------------------------------------------------------------------- function SSf_carritoH_CheckPais(){ var f=document.getElementById('SSi_carritoH_Fenviopais'); if(f.selectedIndex==0){ alert('SELECCIONE EL PAIS/ZONA');f.focus(); return false; } else { return true; } };; //-------------------------------------------------------------------- function SSf_pedidos1H_Ini(){ SSf_pedidos1H_DatosCliente(); SSf_pedidos1H_FormaPago(); };; //-------------------------------------------------------------------- function SSf_pedidos1H_DatosCliente(){ // si hay algún campo rellenado, entonces despliega el collapse var df=document.getElementById("SSi_pedidos1H_form"); var dsw=df.Z_FACTURA_nombre.value+ df.Z_FACTURA_direccion.value+ df.Z_FACTURA_codigopostal.value+ df.Z_FACTURA_localidad.value+ df.Z_FACTURA_provincia.value+ df.Z_FACTURA_pais.value+ df.Z_FACTURA_nifdni.value+ df.Z_FACTURA_telefono.value; dsw=dsw.trim(); if(dsw!=""){ df.Z_FACTURA_nombre.setAttribute("required", "true"); df.Z_FACTURA_direccion.setAttribute("required", "true"); df.Z_FACTURA_codigopostal.setAttribute("required", "true"); df.Z_FACTURA_localidad.setAttribute("required", "true"); df.Z_FACTURA_provincia.setAttribute("required", "true"); df.Z_FACTURA_pais.setAttribute("required", "true"); df.Z_FACTURA_nifdni.setAttribute("required", "true"); $('#SSi_pedidos1H_datosCliente').addClass('show'); $('#SSi_pedidos1H_datosClienteIcon').toggleClass('fa-chevron-down'); return true; } else { df.Z_FACTURA_nombre.removeAttribute("required"); df.Z_FACTURA_direccion.removeAttribute("required"); df.Z_FACTURA_codigopostal.removeAttribute("required"); df.Z_FACTURA_localidad.removeAttribute("required"); df.Z_FACTURA_provincia.removeAttribute("required"); df.Z_FACTURA_pais.removeAttribute("required"); df.Z_FACTURA_nifdni.removeAttribute("required"); $('#SSi_pedidos1H_datosCliente').addClass('hide'); $('#SSi_pedidos1H_datosClienteIcon').toggleClass('fa-chevron-up'); return false; } };; //-------------------------------------------------------------------- function SSf_pedidos1H_FormaPago(){ // si pago x Paypal no se permite fraccionado (previamente debe haberse permitido el pago fraccionado según país, importe...etc) var df=document.getElementById("SSi_pedidos1H_form"); var dfracc=document.getElementById("SSi_formPagoFraccionadoShow"); if(df.Z_PAGO_forma.value=="Paypal"){ dfracc.style.display="none"; df.Z_PAGO_fraccionado.value='NO'; if(df.Y_PAGO_fraccionado) df.Y_PAGO_fraccionado.checked=false; // (el innerHTML puede haber sido eliminado) } else { dfracc.style.display="block"; // si el innerHTML fue eliminado, no mostrará nada } };; //-------------------------------------------------------------------- function SSf_pedidos3H_CambioXBanco(){ // trabajamos con el índicie ['antreferencia] pues la página elimina ['referencia'] var asunto ="CAMBIO DE FORMA DE PAGO - PEDIDO "; var cuerpo ="Les informo pagaré ... PEDIDO "+" ... mediante ingreso/transferencia bancaria."; SSf_Correo(asunto,cuerpo,false); };; //-------------------------------------------------------------------- function SSf_pedidos3H_TPVcodigoPago(){ var f=new Date; var codm=("0"+String(f.getMinutes())).slice (-2); var cods=("0"+String(f.getSeconds())).slice (-2); return codm + cods + ""; };; //-------------------------------------------------------------------- function SSf_pedidos3H_TPVConexionPago(){ var url,datos; SSv_pedidos3H_ventana=open("/global/web/loading.html","SS_WIN2"); if(SSv_pedidos3H_TPVc>0){SSf_pedidos3H_TPVcargaDatos();} // a partir de la segunda vez url ="https://www.estores.es/global/php/tpvpay/tpv_genkey.php"; datos=Base64.encode(SSv_pedidos3H_TPVdatos); //vdebug=window.open(url+"?datos="+datos,"SS_WINDEBUG"); return; // para probar la petición con método GET $.ajax({ async:false, type: "POST", url: url, data: "datos="+datos, contentType: "application/x-www-form-urlencoded; charset=utf-8", error: function(data){alert("SSf_pedidos3H_TPVconexionPago [ERROR-01]" + data);}, // OTROS ERRORES success:function(data){ if(data.indexOf(" on line ")>=0){ alert("SSf_pedidos3H_TPVconexionPago [ERROR-02]"); // ERRORES PHP } else { datos2=unescape(data); var Adatos = datos2.split("***"); // evitamos error de conversión de etiquetas var df=document.forms.SSi_pedidos3H_form; df.Ds_MerchantParameters.value = Adatos[0]; // cargamos los parámetros df.Ds_Signature.value = Adatos[1]; // cargamos la firma setTimeout("SSf_pedidos3H_TPVconexionPago2()",2000); } } }); return true; };; //-------------------------------------------------------------------- function SSf_pedidos3H_TPVconexionPago2(){ var df=document.forms.SSi_pedidos3H_form; df.action="https://sis.redsys.es/sis/realizarPago"; df.method="post"; df.target="SS_WIN2"; SSv_pedidos3H_TPVsw=true; df.submit(); SSf_Focus(SSv_pedidos3H_ventana); SSv_pedidos3H_TPVc+=1; };; //-------------------------------------------------------------------- function SSf_pedidos3H_PaypalConexionPago(){ SSv_pedidos3H_ventana=open("/global/web/loading.html","SS_WIN2"); var f=setTimeout("SSf_pedidos3H_PaypalConexionPago2()",2000); }; //-------------------------------------------------------------------- function SSf_pedidos3H_PaypalConexionPago2(){ var df=document.forms.SSi_pedidos3H_form; df.action="https://www.paypal.com/cgi-bin/webscr"; df.method="post"; df.target="SS_WIN2"; df.submit(); SSf_Focus(SSv_pedidos3H_ventana); } //-------------------------------------------------------------------- function SSf_Focus(obj){ // intenta poner el foco en un objeto y si no lo consigue no pasa nada try{obj.focus();} catch(err){return false;}; return true; };; //-------------------------------------------------------------------- // Create Base64 Object var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}} // encodedString = Base64.encode(string); decodedString = Base64.decode(encodedString);