Source: http://docs.consumoteca.com/documents/preview/225
Timestamp: 2017-07-26 04:27:14+00:00

Document:
Contrato de Alquiler Vivienda España - Genera Documentos Online - DOCXPRESSO
Guardar datos Almacenar localmente
open sans Serif
Color fuenteValor por defecto
Contrato de arrendamiento de vivienda En ciudad, a fecha REUNIDOS De una parte, y como ARRENDADOR, saludo. nombre1, mayor de edad, de estado civil estado-civil1, domiciliado/a en ciudad1, y con NIF nº NIF1. A efectos de comunicaciones, como complemento al domicilio indicado, señala como correo electrónico email1, y el siguiente número de teléfono:telefono1. De otra parte, y como ARRENDATARIO, saludo2. nombre2, mayor de edad, de estado civil estado-civil2, domiciliado en ciudad2, y con NIF nº NIF2. A efectos de comunicaciones, además de la vivienda que es objeto de este contrato, señala como correo electrónico email2, y el siguiente número de teléfono:telefono2. (Añadir, si es el caso, nota 1 del anexo) A los efectos legales oportunos, el arrendatario hace constar que es menor de 30 años de edad, al haber nacido el fecha_de_nacimiento INTERVIENENTodas las partes en su propio nombre y representación.Ambas partes se reconocen la capacidad legalmente necesaria para el otorgamiento del presente contrato de arrendamiento, y a tal efecto, EXPONEN1º. Que saludo. nombre1, es propietario de la vivienda sita en direccion-vivienda, con una superficie aproximada de m2 m2 útiles, inscrita en el Registro de la Propiedad de registro, y con referencia catastral número catastro. La vivienda contiene el mobiliario que se indica en el inventario adjunto. Como anexos que se alquilan junto con la vivienda citada figuran: anexos. (Identificar, si es el caso, una plaza de garaje, trastero, etc.). La vivienda se encuentra en la actualidad libre de ocupantes. 2º. Que teniendo interés saludo. nombre2, en habitar la vivienda en calidad de arrendatario y el ARRENDADOR en arrendar la vivienda, ambas partes acuerdan la celebración del presente CONTRATO DE ARRENDAMIENTO DE VIVIENDA, y ello conforme a las siguientes: C L Á U S U L A S PRIMERA.- El arrendamiento se establece por un plazo de plazo. (el plazo que se acuerde), a contar desde el día fecha-inicio. (fecha del contrato o de la ocupación de la vivienda si es posterior a la primera). De acuerdo con la legislación vigente a la firma de este contrato, el arrendatario tendrá la facultad de su renovación anual hasta que el arrendamiento alcance la duración de 3 años; no habrá lugar a dicha renovación si el arrendatario notificase por escrito la renuncia con al menos 30 días de antelación a la finalización del plazo pactado o cualquiera de sus prórrogas anuales.Una vez finalizado el plazo máximo de tres años, y siempre que no haya sido denunciado el contrato por cualquiera de las partes, este se prorrogará por un periodo de un año. SEGUNDA.- Expresamente se pacta un periodo mínimo de validez del contrato de seis meses. El incumplimiento de dicho plazo por el arrendatario dará lugar a una indemnización dineraria equivalente al periodo de renta que falte por cumplir para llegar al periodo mínimo pactado. Pasado el periodo mínimo, el arrendatario podrá desistir en todo momento del contrato siempre que realice un preaviso con treinta días de antelación. Realizado el preaviso con la antelación pactada, queda convenido el pago por el arrendatario que desiste de una indemnización, en concepto de perjuicios para el propietario, equivalente a un mes de renta por cada año de contrato que reste por cumplir. Los períodos de tiempo inferiores al año darán lugar a la parte proporcional de la indemnización. En el caso de que no se hubiese realizado dicho preaviso en el tiempo convenido, la indemnización a pagar al arrendador se verá incrementada en la cantidad equivalente a un mes de renta. No procederá la prórroga obligatoria del contrato en el caso de que, trascurrido el primer año de contrato, el arrendador necesite la vivienda arrendada para su uso como vivienda permanente para él, o para sus familiares de primer grado de consanguinidad o por adopción, o para su cónyuge en caso de separación, divorcio o nulidad matrimonial. El arrendador deberá comunicar este extremo con al menos dos meses de antelación a la fecha en que la vivienda se vaya a necesitar. En ese caso, el arrendatario estará obligado a entregar la vivienda en el plazo convenido sin que ello genere derecho a indemnización alguna por parte del arrendador. TERCERA.- Como precio del arrendamiento, se fija como renta anual la cantidad de total-anual euros, pagadera mensualmente por meses anticipados, dentro de los siete primeros días de cada mes. El precio del arrendamiento incluye los gastos generales del inmueble, servicios, tributos, cargas y demás responsabilidades no susceptibles de individualización (nota 2), pero no así los gastos por servicios con que cuenta la vivienda arrendada y que se individualicen mediante aparatos contadores, que serán de cuenta exclusiva del arrendatario. Queda expresamente convenido que la tasa municipal anual de basuras sea por cuenta del ARRENDATARIO. La renta se actualizará anualmente, en la fecha en que se cumpla cada año de vigencia de contrato, conforme (nota 3) a la variación del Índice General Nacional de Precios al Consumo (el IPC general) en el período de los 12 meses anteriores a la fecha de celebración (o de ocupación si esta fue posterior) del contrato. Para la primera actualización se toma como mes de referencia el último índice publicado a la fecha de celebración del contrato, que es el del mes de fecha (índice indice). Las sucesivas actualizaciones a partir de la primera se realizarán sobre la renta anteriormente actualizada. La renta actualizada será exigible al arrendatario a partir del mes siguiente a aquel en que la parte interesada lo notifique a la otra parte por escrito, expresando el porcentaje de alteración aplicado. CUARTA.- El pago se realizará mediante ingreso en metálico o transferencia bancaria a favor del Arrendador en la cuenta que a nombre de éste último y con el nº numero_de_cuenta existe en el Banco (Caja) banco, sucursal nº sucursal. Dicho pago se acreditará de manera suficiente mediante el oportuno resguardo del ingreso o transferencia realizados, sin necesidad de expedir recibo alguno por parte del arrendador. QUINTA.- La falta de pago y el retraso en el pago de la renta y en el resto de cantidades debidas se consideran causas expresas de resolución del presente contrato. El arrendatario se obliga en tal caso a restituir inmediatamente el inmueble al arrendador. Expresamente se acuerda que la renta adeudada y no satisfecha generará un interés de demora anual equivalente al interés legal del dinero más dos puntos. Todos los gastos derivados de una reclamación judicial o extrajudicial por incumplimiento serán por cuenta de la parte deudora. SEXTA.- El arrendatario no podrá realizar en la vivienda obras que modifiquen su configuración o la de cualquiera de sus accesorios, o que provoquen una disminución de la estabilidad o seguridad de la misma, sin el permiso de la parte arrendadora expresado por escrito. La contravención de esta cláusula será causa de resolución del presente contrato y el arrendador podrá exigir la reposición de las cosas al estado anterior. Las obras autorizadas se realizarán a expensas del arrendatario y, al término del contrato, quedarán a beneficio de la propiedad sin generar derecho a indemnización alguna. Todas las reparaciones y obras que hayan de realizarse en la vivienda como consecuencia del uso ordinario de la vivienda serán por cuenta del arrendatario salvo las que legalmente le correspondan al arrendador. Este está obligado a realizar, sin derecho a elevar por ello la renta, todas las reparaciones que sean necesarias para conservar la vivienda en condiciones de habitabilidad, salvo que aquellas sean consecuencia de un deterioro imputable al arrendatario, sus dependientes o visitantes, por acción, omisión o negligencia. La realización por el arrendador de obras de mejora transcurridos tres años de duración del contrato le dará derecho a elevar la renta anual en la cuantía que resulte de aplicar al capital invertido en la mejora el tipo de interés legal del dinero en el momento de la terminación de las obras incrementado en tres puntos, sin que pueda exceder el aumento del veinte por ciento de la renta vigente en aquel momento. SÉPTIMA. El arrendatario se compromete y obliga expresamente a (nota 4):– que en la vivienda no se realicen actividades de tipo industrial o actividades molestas, insalubres, nocivas o peligrosas;– no ceder ni subarrendar la vivienda sin el permiso expreso por escrito del arrendador (nota5);– se prohíbe la tenencia de animales peligrosos en el piso, salvo previo permiso expreso por escrito del arrendador.– otras_condiciones La contravención de cualquiera de estas obligaciones, constatada por el arrendador, constituirá causa de resolución del contrato, al igual que el resto de causas de resolución previstas en la ley o en el presente contrato. OCTAVA.- En el momento de la firma de este contrato, el Arrendatario hace entrega del importe de una mensualidad de renta, fianza euros, en concepto de fianza legal. Además, como garantía complementaria, el arrendatario hace entrega igualmente a la firma de este contrato del importe de otras numero-mensualidades mensualidades de renta, fianza euros. Tanto la fianza legal como la garantía complementaria quedan establecidas en garantía de las obligaciones legales y contractuales del arrendatario. El arrendador se compromete a realizar el depósito de la fianza legal según la normativa autonómica aplicable, y entregará copia del resguardo de dicho depósito al arrendatario, a petición de éste. NOVENA.- El arrendatario reconoce la veracidad y certeza del inventario que del mobiliario de la vivienda se relaciona al final del contrato (nota 6), y se compromete a devolver la posesión de la vivienda y todo el mobiliario cuando corresponda, en su integridad y en perfecto estado de conservación. Se conviene la afección de la fianza que se entrega en el acto de la firma como garantía del cumplimiento de esta obligación, y además se compromete el arrendatario a entregar al propietario el importe de los daños causados que sobrepasen esta cuantía (nota 7). En particular, el arrendatario se compromete a facilitar, al término del contrato, los trámites para modificar la titularidad de los suministros, respondiendo de los daños que pueda generar al arrendador, por ejemplo por dar de baja alguno de los contratos sin el acuerdo escrito del arrendador. DÉCIMA.- En caso de venta de la vivienda arrendada, las partes acuerdan la renuncia por parte del arrendatario al derecho de adquisición preferente, de acuerdo con la previsión establecida en el artículo 25.8 de la Ley de Arrendamientos Urbanos. El arrendador se compromete a comunicar al arrendatario su intención de vender la vivienda con una antelación mínima de treinta días a la fecha de formalización del contrato de compraventa. Realizada la venta, en el caso de que el presente contrato no haya sido inscrito en el Registro de la Propiedad por iniciativa de una de las partes, el arrendamiento podrá extinguirse a voluntad del comprador. En ese caso el arrendatario deberá abandonar la vivienda en el plazo de tres meses a contar desde que el adquirente le notifique fehacientemente su propósito. Para este supuesto, las partes fijan como indemnización por daños y perjuicios, que el vendedor deberá pagar al arrendatario, la suma equivalente a un mes de renta por cada año que quede de contrato, o la cantidad proporcional para periodos inferiores al año. UNDÉCIMA.- A los efectos legales oportunos, se hace constar que a la firma del presente contrato el arrendador ha entregado al arrendatario una copia del certificado de eficiencia energética correspondiente al inmueble arrendado. En prueba de total conformidad, las partes firman el presente contrato, que se extiende por duplicado, en el lugar y fecha arriba indicados. Firma EL(LOS) ARRENDADOR(ES), EL(LOS) ARRENDATARIO(S), INVENTARIO QUE ACOMPAÑA AL CONTRATO DE ARRENDAMIENTOde la vivienda sita en direccion-vivienda. de fecha entre D/Dña. nombre1, comoarrendador y D/Dña. nombre2, como arrendatario. EN LA COCINA HAY:inventario1 EN EL SALÓN-COMEDOR HAY:inventario2 EN EL DORMITORIO PRINCIPAL HAY:inventario3 Y en prueba de conformidad, firman el presente a un solo efecto en el lugar y fecha del contrato anexo.NOTAS 1 En la regulación actual del IRPF, el arrendador tiene derecho a una reducción del 100% de la renta si el inquilino tiene entre 18 y 30 años y cumple determinados requisitos. Como deberá justificarlo, conviene dejar constancia en el contrato de este extremo y de la obligación por dicho inquilino de hacerle llegar cada año antes del 31 de marzo, una comunicación firmada sobre el cumplimiento de los requisitos legales. “El arrendatario se obliga a entregar al arrendador antes del 31 de marzo de cada año la declaración firmada que la normativa fiscal prevé para la aplicación por el arrendador de la reducción fiscal aplicable en el Impuesto de la Renta de las Personas Físicas”. 2 En el caso de que estos gastos quieran cargarse al arrendatario, hay que señalar el importe exacto pagado el último año y pactar que se incrementarán anualmente conforme a la variación que experimenten, pero que nunca podrá alcanzar el doble del IPC general; en este caso la cláusula a insertar en sustitución de esta, sería la siguiente: "El arrendatario se obliga a abonar el importe de los impuestos, tasas y arbitrios que sobre la vivienda objeto del contrato recaigan o puedan recaer en el futuro, así como los gastos de los demás servicios no susceptibles de individualización, ya que estos últimos correrán en todo caso por cuenta del arrendatario. En el momento de la formalización del presente contrato, el importe de dichos gastos es el siguiente: - Impuesto sobre Bienes Inmuebles: impuestos euros anuales. - Cuota mensual de Comunidad (ej.): comunidad euros. - Tasa de vado: vado euros anuales. El arrendatario se obliga asimismo a abonar las elevaciones que en estos gastos se produzcan. Durante los tres primeros años del contrato, a las subidas de los gastos distintos de los impuestos se aplicará el límite legal máximo establecido del doble del IPC general". 3 La Ley permite utilizar otras referencias para la actualización. Proponemos el IPC general por ser objetivo, oficial y sujeto, en principio, a variaciones moderadas. 4 En el modelo sólo se reseñan a modo de ejemplo algunas posibles prohibiciones u obligaciones. Deben consignarse todas las prohibiciones que el arrendador desee imponer al arrendatario. De no hacerse así, solo serán causas de resolución las expresamente indicadas en la Ley. Para evitar malentendidos conviene ser muy claros en este punto antes de firmar el contrato. 5 Si así lo desea, el consentimiento, necesariamente escrito, favorable a la cesión o subarriendo de la vivienda por el arrendatario puede otorgarse a través del propio contrato de arrendamiento. En ese caso, debería incluirse una cláusula del estilo de la siguiente:"El arrendador otorga su expreso consentimiento para que el arrendador pueda (ceder) subarrendar de forma parcial la vivienda a las personas que considere conveniente. En cualquier caso, el precio del subarriendo no podrá exceder del que corresponda al arrendamiento". 6 Consideramos conveniente hacer un inventario de todos los bienes de la vivienda, lo cual beneficiará al finalizar el arrendamiento tanto al arrendador como al arrendatario en el caso de posibles problemas. Deben firmar también todas las partes el inventario. 7 Existen muchos tipos de garantías a favor del propietario que pueden incluirse: por ejemplo, la obligatoriedad de suscripción de un seguro multirriesgo del hogar que abone el inquilino y en el que se designe como beneficiario al propietario-arrendador, en la compañía que designe el arrendador. La cláusula a incluir sería similar a la siguiente: " D. nombre2 (arrendatario) se compromete a concertar antes de entrar en la posesión de la vivienda un seguro del tipo multirriesgo que asegure con cobertura suficiente el contenido y continente de la vivienda objeto de alquiler con la compañía de seguros " seguros, S.A.", abonando la prima correspondiente por todo el período de alquiler y designando como beneficiario de la póliza al efecto a D. nombre1 (arrendador de la vivienda)".
Editar el texto Cerrar
Guardar como... Formato
Guardar datos localmente. No recomendado si terceros tienen acceso a este dispositivo.
Enviar enlace por email. Incluya a continuación una dirección valida de email.
').appendTo(sel);
sel.val(other);
sel.parent().find('span.h5p_varspan').text(other);
sel.webuiPopover('destroy');
sel.click(function(){
$(this).next().find('span:first').html($(this).val());
if(data.global){
$('select[data-reference="' + data.name+ '"]').val($(this).val());
$('select[data-reference="' + data.name+ '"]').next().find('span:first').html($(this).val());
toastr.error('Debe incluir un valor no vacío.', 'Aviso');
if ( $(window).scrollTop() > 240 ) {
$('#goTop').fadeIn('slow');
$('#goTop').fadeOut('slow');
$('body, html').animate({scrollTop: 0}, 500);
//Preset saveModal values
//preselect the first available format
$("#saveModal").find('input[type="radio"]:first').prop('checked', true);
skipOutputModal = false;
//special case of preview version
$('#gobacktoHistory').click(function(){
window.location.href=decodeURIComponent('');
// set a variable to hold a reference to the current active
var currentTextArea = null;
//parse GET query
var query = $.parseQuery();
var progressTimer = 2000;
serverData = false;
local = localStorage.getItem("preview_225");
localTime = localStorage.getItem("previewTime_225");
if (local !== null && !serverData) {
$('#loadLocalData').click(function(){
retrieveLocalData();
$('#localModal').modal('show');
if (serverData) {
$('#serverModal').modal('show'); }
var loadedData = 'false';
var preparsedServerData = $('').html(loadedData).text();
var dataToLoadFromServer = JSON.parse(preparsedServerData); toastr.options = {
"timeOut": "7000",
$('.summernoteTextarea').summernote({
$('#saveTextarea').click(function(){
myVar = $('#textareaVar').text();
var textarea = $('.summernoteTextarea').code();
textarea = textarea.replace('', '');
if (dxo[myVar]['global'] === true) {
var varspan = $('.h5p_varspan[data-name="' + myVar + '"]')
var varspan = currentTextArea.find('.h5p_varspan[data-name="' + myVar + '"]')
preparseWYSIWYG(varspan, textarea);
currentTextArea = null;
$('#textareaModal').modal('hide');
$('.summernoteComments').summernote({
['para', ['ul', 'ol']],
//parse RPC data
//jsonp callbacks
function rpc_callback(){
function remoteProcedureCallsDropdowns () {
l = window.rpcs.length;
var val = window.rpcs[j].slice();
populateDropdown(val[0], val[1], val[2], val[3]);
function populateDropdown (name, rpcurl, type, trigger) {
url: rpcurl,
success: function( options ) {
for (var k=0; k < options.length; k++) {
var key = options[k][0];
if (options[k][1] != '') {
var value = options[k][1];
var value = options[k][0];
$('select[data-list="' + name + '"]').each(function(){
$(this).children('option').attr('disabled');
if (value.charAt(0) == '@') {
optionData = '' + key + '';
$(this).parent().find('span.h5p_varspan').html(value);
$(this).append($(optionData));
if (type == 'rpc' && trigger != 0) {
//let us activate the associated rpc trigger
RemoteCallFromDropdown($(this), trigger);
if (serverData && typeof dataToLoadFromServer.varValues[name] !== 'undefined') {
//make sure that the server data is reloaded
var serverValues = {};
serverValues[name] = dataToLoadFromServer.varValues[name];
replaceVars(serverValues, false);
//we have to make sure that there were no previously loaded local data
if (window.localDataLoaded) {
loadSingleVarFromLocal(name);
//alert( "Sorry, there was a problem!" );
function RemoteCallFromDropdown(node, trigger) {
rpcurl = rpcData[trigger]['url'];
rpcurl += '?callback=?&method=' + rpcData[trigger]['method'];
rpcurl += '×tamp=' + rpcData[trigger]['timestamp'];
rpcurl += '&uniqid=' + rpcData[trigger]['uniqid']; rpcurl += '&APIKEY=' + rpcData[trigger]['APIKEY'];
rpcurl += '&' + rpcData[trigger]['params'] + '=' + node.val();
if (typeof data.replaceMode != 'undefined' && data.replaceMode == 'row') {
//find the enclosing tbody element var tbody = node.parents('tbody:first');
if (data.hasOwnProperty(name)){
if (typeof dxo[name] != 'undefined') {
var type = dxo[name]['type'];
var selector = tbody.find('img[data-image="' + name + '"]');
selector.attr('src', data[name]);
var selector = tbody.find('span.h5p_varspan[data-name="' + name + '"]');
selector.html(data[name]);
//set the focus so special variables are updated
//clone the blocks
cloneBlocks(data.blocks);
//replace variables
replaceVars(data.varValues, false);
//replace spacial variables
replaceVars(data.specialVarValues, true); }
//parse general data
json = '{"data":[{"name":"ciudad","label":"ciudad","tip":"ciudad","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1358},{"name":"fecha","label":"fecha","tip":"fecha","comment":"%3Cp%3E%20%3C/p%3E","type":"date","options":"","list":"null","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"date","exp":"mm/dd/yyyy","regex":"%5E%5B0-9%5D%7B2%7D/%5B0-9%5D%7B2%7D/%5B0-9%5D%7B4%7D$","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"saludo","label":"saludo","tip":"saludo","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1359},{"name":"nombre1","label":"nombre1","tip":"nombre1","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1359},{"name":"estado-civil1","label":"estado-civil1","tip":"estado-civil1","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.136},{"name":"ciudad1","label":"ciudad1","tip":"ciudad1","comment":"%3Cp%3E%20%3C/p%3E","type":"list","options":"","list":"1","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","regex":"","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"NIF1","label":"NIF1","tip":"NIF1","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.136},{"name":"email1","label":"email1","tip":"email1","comment":"%3Cp%3E%20%3C/p%3E","type":"text","options":"","list":"null","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"email","regex":"%5E%5B%5E@%5D+@%5B%5E@%5D+%5C.%5B%5E@%5C.%5D+$","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"telefono1","label":"telefono1","tip":"telefono1","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1361},{"name":"saludo2","label":"saludo2","tip":"saludo2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1361},{"name":"nombre2","label":"nombre2","tip":"nombre2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1361},{"name":"estado-civil2","label":"estado-civil2","tip":"estado-civil2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1362},{"name":"ciudad2","label":"ciudad2","tip":"ciudad2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1362},{"name":"NIF2","label":"NIF2","tip":"NIF2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1362},{"name":"email2","label":"email2","tip":"email2","comment":"%3Cp%3E%20%3C/p%3E","type":"text","options":"","list":"null","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"email","regex":"%5E%5B%5E@%5D+@%5B%5E@%5D+%5C.%5B%5E@%5C.%5D+$","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"telefono2","label":"telefono2","tip":"telefono2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1363},{"name":"fecha_de_nacimiento","label":"fecha_de_nacimiento","tip":"fecha_de_nacimiento","comment":"%3Cp%3E%20%3C/p%3E","type":"date","options":"","list":"null","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"date","exp":"mm/dd/yyyy","regex":"%5E%5B0-9%5D%7B2%7D/%5B0-9%5D%7B2%7D/%5B0-9%5D%7B4%7D$","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"direccion-vivienda","label":"direccion-vivienda","tip":"direccion-vivienda","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1364},{"name":"m2","label":"m2","tip":"m2","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1365},{"name":"registro","label":"registro","tip":"registro","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1365},{"name":"catastro","label":"catastro","tip":"catastro","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1365},{"name":"anexos","label":"anexos","tip":"anexos","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1365},{"name":"plazo","label":"plazo","tip":"plazo","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1365},{"name":"fecha-inicio","label":"fecha-inicio","tip":"fecha-inicio","comment":"%3Cp%3E%20%3C/p%3E","type":"date","options":"","list":"null","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"date","exp":"mm/dd/yyyy","regex":"%5E%5B0-9%5D%7B2%7D/%5B0-9%5D%7B2%7D/%5B0-9%5D%7B4%7D$","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"total-anual","label":"total-anual","tip":"total-anual","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1366},{"name":"indice","label":"indice","tip":"indice","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1366},{"name":"numero_de_cuenta","label":"numero_de_cuenta","tip":"numero_de_cuenta","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1366},{"name":"banco","label":"banco","tip":"banco","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1367},{"name":"sucursal","label":"sucursal","tip":"sucursal","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1367},{"name":"otras_condiciones","label":"otras_condiciones","tip":"otras_condiciones","comment":"%3Cp%3E%20%3C/p%3E","type":"text","options":"","list":"null","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","regex":"","addTo":[],"timestamp":1464812399.5182,"trigger":0},{"name":"fianza","label":"fianza","tip":"fianza","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1367},{"name":"numero-mensualidades","label":"numero-mensualidades","tip":"numero-mensualidades","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1368},{"name":"firma_1","label":"firma_1","tip":"firma_1","comment":"%3Cp%3E%20%3C/p%3E","type":"image","source":"signature","format":"preserveWidth","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812399.5182},{"name":"firma_2","label":"firma_2","tip":"firma_2","comment":"%3Cp%3E%20%3C/p%3E","type":"image","source":"signature","format":"preserveWidth","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812399.5182},{"name":"inventario1","label":"inventario1","tip":"inventario1","comment":" ","type":"text","options":"","list":"","rpc":"","global":false,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1368},{"name":"inventario2","label":"inventario2","tip":"inventario2","comment":" ","type":"text","options":"","list":"","rpc":"","global":false,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1368},{"name":"inventario3","label":"inventario3","tip":"inventario3","comment":" ","type":"text","options":"","list":"","rpc":"","global":false,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1368},{"name":"impuestos","label":"impuestos","tip":"impuestos","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1369},{"name":"comunidad","label":"comunidad","tip":"comunidad","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1369},{"name":"vado","label":"vado","tip":"vado","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1369},{"name":"seguros","label":"seguros","tip":"seguros","comment":" ","type":"text","options":"","list":"","rpc":"","global":true,"choice":"dropdown","editable":true,"richText":true,"validation":"none","exp":"","regex":"","addTo":[],"timestamp":1464812395.1369}],"groups":[{"type":"list","bookmark":"","active":true,"groupId":"5d304e49277378d5707fad2b47c8b84d","variables":["inventario1"],"display":"show","toggleWith":null,"toggleValues":null,"timestamp":1464812395.137},{"type":"list","bookmark":"","active":true,"groupId":"723400658f22a2777bda8ecbd1c06d50","variables":["inventario2"],"display":"show","toggleWith":null,"toggleValues":null,"timestamp":1464812395.137},{"type":"list","bookmark":"","active":true,"groupId":"798dff06423a6dd910a3642ddd6e6c54","variables":["inventario3"],"display":"show","toggleWith":null,"toggleValues":"","timestamp":1464812399.5182}],"special":[],"signatures":[],"settings":{"numberFormat":".,","outputFormat":["odt","pdf","doc","docx","doc-legacy","rtf"],"outputComments":0,"timestamp":1464812395.1372},"rpcs":{"onRequest":[],"onLoad":"","onUpload":""},"attachments":[]}';
docxpressoData = JSON.parse(json);
console.log(docxpressoData);
numData = docxpressoData.data.length;
numGroups = docxpressoData.groups.length;
console.log(numGroups);
numSpecial = docxpressoData.special.length;
//get the number format as an array
preformat = docxpressoData.settings.numberFormat;
window.format = preformat.split('');
//we need to retrieve the default values for validation in case we
//load some server data
ref = '{"ciudad":"ciudad","fecha":"fecha","saludo":"saludo","nombre1":"nombre1","estado-civil1":"estado-civil1","ciudad1":"ciudad1","NIF1":"NIF1","email1":"email1","telefono1":"telefono1","saludo2":"saludo2","nombre2":"nombre2","estado-civil2":"estado-civil2","ciudad2":"ciudad2","NIF2":"NIF2","email2":"email2","telefono2":"telefono2","fecha_de_nacimiento":"fecha_de_nacimiento","direccion-vivienda":"direccion-vivienda","m2":"m2","registro":"registro","catastro":"catastro","anexos":"anexos","plazo":"plazo","fecha-inicio":"fecha-inicio","total-anual":"total-anual","indice":"indice","numero_de_cuenta":"numero_de_cuenta","banco":"banco","sucursal":"sucursal","otras_condiciones":"otras_condiciones","fianza":"fianza","numero-mensualidades":"numero-mensualidades","firma_1":"firma_1","firma_2":"firma_2","inventario1":"inventario1","inventario2":"inventario2","inventario3":"inventario3","impuestos":"impuestos","comunidad":"comunidad","vado":"vado","seguros":"seguros"}';
refData = JSON.parse(ref);
var dxoGroups = {};
var dxoSpecial = {};
//we first need to parse block dependencies for (j = 0; j < numGroups; j++) {
dataGroup = docxpressoData.groups[j];
if (dataGroup.toggleWith !== null) {
if (typeof window.dependencies[dataGroup.toggleWith] == 'undefined') {
window.dependencies[dataGroup.toggleWith] = {};
window.dependencies[dataGroup.toggleWith][dataGroup.groupId] = dataGroup.toggleValues;
delete dataGroup;
//generate dxoGroups for the data parsing
for (j = 0; j < numGroups; j++) {
dxoGroups[docxpressoData.groups[j].groupId] = docxpressoData.groups[j];
console.log('***dxoGroups***');
console.log(dxoGroups);
//parse now the general data
$.each(docxpressoData.data, function(index) {
dxo[docxpressoData.data[index].name] = docxpressoData.data[index];
var decorate = true;
if (window.prefix != '') {
//check if the variable name starts with window.prefix + '_'
var varname = docxpressoData.data[index].name;
var blockPrefix = window.prefix + '_';
if (varname.indexOf(blockPrefix) != 0) {
decorate = false;
dxo[docxpressoData.data[index].name]['editable'] = false;
if (docxpressoData.data[index].type == 'text') {
decorateTextVar(docxpressoData.data[index], 'text', decorate);
} else if (docxpressoData.data[index].type == 'multilineText') {
decorateTextVar(docxpressoData.data[index], 'multilineText', decorate);
} else if (docxpressoData.data[index].type == 'textarea') {
decorateTextVar(docxpressoData.data[index], 'textarea', decorate);
} else if (docxpressoData.data[index].type == 'date') {
decorateDateVar(docxpressoData.data[index], decorate);
} else if (docxpressoData.data[index].type == 'options') {
decorateOptionsVar(docxpressoData.data[index], decorate);
} else if (docxpressoData.data[index].type == 'list') {
decorateListVar(docxpressoData.data[index], 'list', decorate);
} else if (docxpressoData.data[index].type == 'rpc') {
decorateListVar(docxpressoData.data[index], 'rpc', decorate);
} else if (docxpressoData.data[index].type == 'image') {
decorateImageVar(docxpressoData.data[index], decorate);
//parse Groups
if (docxpressoData.groups[j].type == 'table') {
decorateTable(docxpressoData.groups[j].groupId, docxpressoData.groups[j].active);
} else if (docxpressoData.groups[j].type == 'list') {
decorateList(docxpressoData.groups[j].groupId, docxpressoData.groups[j].active);
} else if (docxpressoData.groups[j].type == 'block') {
decorateBlock(docxpressoData.groups[j]);
//populate "remote dropdowns"
remoteProcedureCallsDropdowns();
//decorate multiselects
$('select[multiple]').multiselect({
onChange: function(option, checked, select) {
reference = $(this)[0]['$select'].data('reference');
window.multiselects[reference] = $('select[data-reference="' + reference + '"]').val();
//remove the first selected value in multiselects
$('select[multiple]').each(function(){
var label = decodeURI($(this).data('label'));
$(this).multiselect('deselect', label);
$(this).next().find('input[value="' + label + '"]').prop('disabled', true);
for (j = 0; j < numSpecial; j++) {
if (typeof dxoSpecial[docxpressoData.special[j].name] == 'undefined') {
decorateSpecial(docxpressoData.special[j]);
dxoSpecial[docxpressoData.special[j].name] = docxpressoData.special[j];
} //Text variables
function decorateTextVar (data, type, decorate) {
span = $('span.h5p_varspan[data-name="' + data.name + '"]');
span.each(function(){
if (data.validation == 'email'){
if (window.emails.indexOf(data.name) < 0){
window.emails.push(data.name);
if (data.editable && decorate) {
if (data.global) {
$(this).attr('data-global', '1');
if (typeof data.value !== 'undefined') {
$(this).html(decodeDXO(data.value));
$(this).html(decodeDXO(data.label));
spanParent = $(this).parents('span.spanWrapper:first');
//enforce original span CSS props
parentTag = $(spanParent).parent();
parentTagName = $(parentTag).prop('tagName');
if (parentTagName.toLowerCase() == 'span') {
var classes = $(parentTag).attr('class');
if (typeof classes == 'string' && classes != '') {
$(span).attr('class', classes + ' h5p_varspan');
if (type == 'textarea') {
$(' ').prependTo(spanParent);
spanParent.addClass('spanWrapperBackground');
spanParent.addClass('spanWrapperIcon');
//$(' ').prependTo(spanParent);
spanParent.data('label', data.label);
spanParent.data('name', data.name);
spanParent.data('type', type);
$(this).removeAttr('contenteditable');
span.attr('style', 'display: inline-block');
}); console.log(window.emails);
//Date variables
function decorateDateVar (data, decorate) {
if (typeof data.exp === 'undefined') {
data.exp = 'dd/mm/yyyy';
$(spanParent).datepicker({format: data.exp, todayHighlight: true, autoclose: true, language: 'es'});
$(spanParent).on("changeDate", function(event) {
$(this).children('span:first').html(
$(this).datepicker('getFormattedDate') );
//Select variables
function decorateListVar (data, type, decorate) {
$.each(span, function(){
if (data.editable && decorate){
spanParent.css('display', 'none');
var selectData = '';
selectData += '' + decodeDXO(data.label) + '';
selectData += '';
spanParent.before(selectData);
spanParent.prev().click(function(){
if (typeof window.dependencies[data.name] != 'undefined') {
spanParent.prev().change(function(){
modifyBlockVisibility(data.name, $(this).val());
//get the options from the resource
//this condition is to avoid loading the same resource more than once
var rpcurl = "http://docs.consumoteca.com/auxdata/resourcedata?callback=?&id=" + data.list;
rpc = window.rpcData[data.rpc];
var rpcurl = rpc.url;
defaultParamValues = [];
if (typeof rpc.params !== 'undefined') {
params = rpc.params.split(';');
if (typeof rpc.defaultParamValues !== 'undefined') {
defaultParamValues = rpc.defaultParamValues.split(';');
getParams = '?callback=?&method=' + rpc.method;
getParams += '×tamp=' + rpc.timestamp;
getParams += '&uniqid=' + rpc.uniqid; getParams += '&APIKEY=' + rpc.apikey;
getParams = '&';
len = params.length;
getParams += params[n] + "="; if(typeof query[params[n]] == 'undefined'){
if (typeof defaultParamValues[n] !== 'undefined' && defaultParamValues[n] !== '') {
message = rpc.prompt.replace('%param%', params[n]);
answer = prompt(message, defaultParamValues[n]);
answer = prompt('Por favor, inserte el valor requerido', params[n]);
if (answer !== null){
getParams += answer;
} else if (typeof defaultParamValues[n] !== 'undefined' ){
getParams += defaultParamValues[n];
getParams += 'undefined';
getParams += query[params[n]];
getParams += '&';
rpcurl += getParams;
if (typeof rpc.trigger != 'undefined') {
trigger = rpc.trigger;
window.rpcs.push([data.name, rpcurl, type, trigger]);
//change visibility on load
}); } function decorateOptionsVar (data, decorate) {
if (typeof data.choice === 'undefined' || data.choice === 'dropdown' || data.choice === 'multipleSelect'){
optionStr = decodeDXO(data.options);
options = optionStr.split(';');
if (options[k].charAt(0) == '@') {
opt = options[k].substring(1);
selectData += '' + opt + '';
$(this).html(opt);
} else if (options[k].charAt(0) == '#') {
selectData += '' + options[k] + '';
if (typeof window.dependencies[data.name] !== 'undefined') {
} //change visibility on load
modifyBlockVisibility(data.name, spanParent.prev().val());
}); } else if (data.choice === 'radio' || data.choice === 'checkbox') {
olength = options.length;
span.each(function(index){
$(this).addClass('choice');
$(this).attr('contenteditable', false);
opt = options[index % olength];
if (opt.charAt(0) == '@') {
opt = opt.substring(1);
choice = $(element).appendTo($(this));
choice.change(function(){
choices = $('input[name="' + data. name + '"]:checked');
choices.each(function(){
modifyBlockVisibility(data.name, '--toggle--it');
} } function updateSelects(){
$('select[data-reference]').each(function(){
selData = $(this).next().find('.h5p_varspan').text();
if (selData != decodeURIComponent($(this).attr('data-reference')) && selData != '') {
//the first condition is to avoid trying to update the select to its placeholder value
$(this).val(selData);
$('select[data-reference][multiple]').each(function(){
var name = $(this).attr('data-reference');
if (typeof window.multiselects[name] !== 'undefined')
$(this).val(window.multiselects[name]);
//image variables
function decorateImageVar (data, decorate) {
img = $('img[data-image="' + data.name + '"]');
$(this).attr('src', data.value);
} //populate the original images object with the original value on pre-load
imageValue = img.attr('src');
if (window.originalImages.hasOwnProperty(data.name)) {
window.originalImages[data.name].push(imageValue);
window.originalImages[data.name] = [];
window.originalImages[data.name][0] = imageValue;
inputImage = $('');
$(this).before(inputImage);
preImageNode = ' ';
$(preImageNode).insertBefore(this);
$(inputImage).change(function() {
var fileReader = new FileReader(),
files = this.files,
if (/^image\/\w+$/.test(file.type)) {
if(dxo[data.name]['global']) {
$('img[data-image="' + data.name + '"]').attr('src', this.result); } else {
$(input).parent().children('img[data-image="' + data.name + '"]').attr('src', this.result);
//take care of potential resizing
format = dxo[data.name]['format'];
if (format == 'preserveWidth') {
$('img[data-image="' + data.name + '"]').css('height', 'auto');
$('img[data-image="' + data.name + '"]').parent().css('height', 'auto');
} else if (format == 'preserveHeight') {
$('img[data-image="' + data.name + '"]').css('width', 'auto');
$('img[data-image="' + data.name + '"]').parent().css('width', 'auto');
} else if (format == 'redimension') {
//because images can be hidden grab now its size
window.imageSize[name] = {};
window.imageSize[name]['width'] = $('img[data-image="' + data.name + '"]').css('width');
window.imageSize[name]['height'] = $('img[data-image="' + data.name + '"]').css('height');
toastr.error('por favor, escoja un archivo tipo imagen.', 'Aviso');
//special variable
function decorateSpecial (data) {
span = $('span.h5p_varspecial[data-name="' + data.name + '"]');
spanParent = $(this).parents('span.spanWrapperSpecial:first');
$(span).attr('class', classes + ' h5p_varspecial');
//block visibility
function modifyBlockVisibility(name, value){
for (blocks in window.dependencies[name]) {
groupId = blocks;
values = window.dependencies[name][groupId];
var tmp = values.split(';');
display = dxoGroups[groupId]['display'];
div = $('*[data-id="' + groupId + '"]');
if (tmp.indexOf(encodeURI(value.trim())) > -1 || tmp.indexOf(value.trim()) > -1){
//toggle visibility
if (display === 'show') {
//recover original state
//transform tables into responsive tables
function decorateTable (groupId, active){
//we should also check that there is at least an editable variable within
var editable = false;
var innerVars = dxoGroups[groupId].variables;
var n = innerVars.length;
if (dxo[innerVars[j]].editable){
//run over the variables inside the group to check that there is at least an editable one
if (active == false || editable == false) {
$( "table[data-id='" + groupId + "'] tbody.h5p_clone_row_group > tr.h5p_rowgroup" ).removeClass('h5p_rowgroup');
$( "table[data-id='" + groupId + "'] tbody.h5p_clone_row_group" ).eq(0).removeClass('h5p_clone_row_group');
TB = $( "table[data-id='" + groupId + "'] tbody.h5p_clone_row_group" );
//insert the buttons and handlers
leftTools = '';
leftTools += ' ';
leftTools += '';
$(leftTools).prependTo(TB).css('min-height', TB.css('height')); rightTools = '';
rightTools += ' ';
rightTools += '';
$(rightTools).prependTo(TB).css('min-height', TB.css('height'));
$('.h5p_clone_row_button').click(function(){
destroyListeners();
toClone = $(this).parents('tbody:first');
cloned = toClone.clone(true, true).insertBefore(toClone);
//set the focus on the first contenteditable node so special vars
//are updated (if any)
toClone.find('[contenteditable]').each(function(){
}); updateSelects();
refreshListeners();
$('tbody.h5p_clone_row_group').mouseover(function(event){
$('div.h5p_leftTools').hide();
$('div.h5p_rightTools').hide();
$(this).find('div.h5p_leftTools:first').css('min-height', $(this).css('height')).show();
$(this).find('div.h5p_rightTools:first').css('min-height', $(this).css('height')).show();
$('tbody.h5p_clone_row_group').mouseleave(function(event){
//The setTimeOut is a hack because some versions of Chrome have
//a bug in the rndering of tables with merged cells: a gap is
//left on the right end of the table
setTimeout(function(){ if ($('tbody.h5p_clone_row_group:hover').length == 0) {
$('.h5p_delete_row_button').click(function(){
//check that there is at least one row left before
//removing this element
tbs = $(this).parents('table:first').children('tbody.h5p_clone_row_group').length;
if (tbs > 1) {
//we should take care first if there are some variables that affect
//a mathematical operation
//list the variables that are going to be removed and check which
//special variables, if any, are affected
var removedVars = [];
$(this).parents('tbody:first').find('.h5p_varspan').each(function(){
removedVars.push($(this).attr('data-name'));
//removed the element
$(this).parents('tbody:first').remove(); //start the updating of the special vars
var num = removedVars.length;
for(var j = 0; j < num; j++) {
//check for any special variable depending on it
var addTo = dxo[removedVars[j]]['addTo'];
len = addTo.length;
for (k = 0; k < len; k++) {
addTmp = decodeDXO(addTo[k]);
add = addTmp.split('|||');
addName = add[0];
addType = add[1];
//let us find the corresponding special vars nodes for a given name and type
var formula = dxoSpecial[addName]['formula'];
window.updateVars[addName] = {};
if (addType === 'Row'){
continue; } else if (addType === 'Column'){
window.updateVars[addName]['nodeList'] = $(node).parents('table:first').find('[data-name="'+ addName + '"]');
window.updateVars[addName]['nodeList'] = $('[data-name="'+ addName + '"]');
window.updateVars[addName]['type'] = addType;
window.updateVars[addName]['dependsOn'] = dxoSpecial[addName]['dependsOn'];
window.updateVars[addName]['precision'] = dxoSpecial[addName]['precision'];
window.updateVars[addName]['formula'] = formula;
for (sVar in window.updateVars) {
var formula = window.updateVars[sVar]['formula'];
var type = window.updateVars[sVar]['type'];
var dependsOn = window.updateVars[sVar]['dependsOn'];
var precision = window.updateVars[sVar]['precision'];
$(window.updateVars[sVar]['nodeList']).each(function(){
$(this).text(specialValue($(this), formula, type, dependsOn, precision));
toastr.error('No puede eliminar todas las filas.', 'Aviso');
function decorateList (groupId, active){
$( "li[data-id='" + groupId + "']" ).removeClass('h5p_listitem');
//h5p_listTools
LIP = $( "li[data-id='" + groupId + "'] > p" );
//TODO: check that there is always a p tag
insertTools(LIP, 'list');
$('.h5p_clone_list_button').click(function(){
toClone = $(this).parents('li:first');
toClone.clone(true, true).insertBefore(toClone);
$('li.h5p_listitem').mouseover(function(event){
$('li.h5p_listitem').mouseleave(function(event){
setTimeout(function(){ if ($('li.h5p_listitem:hover').length == 0) {
$('.h5p_delete_list_button').click(function(){
//check that there is at least one item left before
lis = $(this).parents('ul:first').children('li.h5p_listitem').length;
if (lis > 1) {
$(this).parents('li:first').remove(); } else {
toastr.error('No puede eliminar todos los items de la lista.', 'Aviso');
function decorateBlock (data){
var innerVars = dxoGroups[data.groupId].variables;
if (data.active == false || editable == false) {
$( "div[data-id='" + data.groupId + "']" ).removeClass('h5p_wrappingdiv');
DIV = $( "div[data-id='" + data.groupId + "']" );
insertTools(DIV, 'block');
//check for visibility and dependencies
if (data.display == 'show') {
$(DIV).css('display', 'block');
$(DIV).css('display', 'none');
$('.h5p_clone_block_button').click(function(){
toClone = $(this).parents('div.h5p_wrappingdiv:first');
$('div.h5p_wrappingdiv').mouseover(function(event){
//recompute the height and show
$(this).children('div.h5p_leftTools:first').css('min-height', $(this).css('height')).show();
$(this).children('div.h5p_rightTools:first').css('min-height', $(this).css('height')).show();
$('div.h5p_wrappingdiv').mouseleave(function(event){
$(this).children('div.h5p_rightTools').hide();
$(this).children('div.h5p_leftTools').hide();
$('.h5p_delete_block_button').click(function(){
divs = $(this).parents('div.h5p_container_div:first').children('div.h5p_wrappingdiv').length;
if (divs > 1) {
$(this).parents('div.h5p_wrappingdiv:first').remove(); } else {
toastr.error('No puede eliminar todos los bloques de contenido.', 'Aviso');
function destroyListeners(){
CONTAINER= $( "div[data-id]" ).parents('div:first');
CONTAINER.each(function(){
if ($(this).hasClass('ui-sortable')){
T = $( "table[data-id]" );
T.each(function(){
UL = $('ul').has( "li[data-id]" );
UL.each(function(){
function refreshListeners(){
items: "> div.h5p_wrappingdiv",
//tolerance: "intersect",
placeholder: "h5p_placeholder",
cancel: '[contenteditable],select',
items: '> tbody.h5p_clone_row_group',
ui.find('td').each(function() {
//what follows is a hack that should be avoided in Firefox
ui.css('position','absolute');
return ui;},
$('.keyvalue').each(function() {
});}, start: function(e, ui){
beforeStop: function(e, ui){
ui.item.css('position','');
items: ">li.h5p_listitem",
//takes into account select options with an associated input field
var tmp = 'sel_' + (Math.random() + "").split('.')[1];
$(this).attr('data-tmp', tmp);
var title = decodeURIComponent($(this).attr('data-label'));
var selOption = $(this).children('option:selected');
var contents = '' + selOption.val()+ ': ';
contents += ' ';
var dataSelect = selOption.attr('data-select');
$(this).webuiPopover('destroy');
if (typeof dataSelect === 'undefined' || dataSelect == 'undefined') {
$(this).webuiPopover({title: title, content: contents, cache: false, closeable: true});
//tooltips and helpers
$('[contenteditable]').focus
if ($(this).data('global') == "1") {
varname = $(this).data('name');
clearInterval(window.keylogger);
setTimeout(function(){ window.keylogger = setInterval(function() {
valvar = $(node).html();
$('[data-name = "' + varname + '"]').not($(node)).html(valvar);
valvar = $(this).html();
$('[data-name = "' + varname + '"]').not($(this)).html(valvar);
//let us now take care of the linked special vars if any
//first get the variable name
name = $(this).attr('data-name');
if (name != 'undefined') {
var addTo = dxo[name]['addTo'];
window.updateVars[addName]['nodeList'] = $(node).parents('tr').eq(0).find('[data-name="'+ addName + '"]'); } else if (addType === 'Column'){
$('[contenteditable]').blur(function(){
if ($(this).text().trim() == '') {
//recover the label because the variable can not be left empty
$(this).html(decodeDXO(dxo[name]['label']));
updateSpecialVars();
window.updateVars = {};
$('span.spanWrapper, *[data-list], button.btn-docxpresso').mouseover(function(){
$('#h5p-tooltip-wrapper').hide();
$('.h5p-help').remove();
h5pChild = $(this).find('.h5p_varspan:first');
x = $(this).offset().left;
if (h5pChild.length > 0) {
y = h5pChild.offset().top;
y = $(this).offset().top;
tagover = $(this).prop("tagName");
if (tagover.toLowerCase() == 'span') {
var tagname = $(this).data('name');
} else if (tagover.toLowerCase() == 'button') {
var tagname = $(this).parents('span:first').children('select').data('list');
var tagname = $(this).data('list');
tip = decodeDXO(dxo[tagname]['tip']);
if (typeof tip !== 'undefined' && tip.length > 1){
$('#h5p-tooltip').text(tip);
$('#h5p-tooltip-wrapper').css('left', x).css('top', y - 24).show();
helper = ' ';
helper += decodeDXO(dxo[tagname]['label']);
helper += '';
helper += decodeDXO(dxo[tagname]['comment']);
page = $(this).parents('.h5p_page:first');
z = page.offset().top;
if ($('' + decodeDXO(dxo[tagname]['comment']) + '').text().trim() != ''){
$(helper).prependTo(page);
$('.h5p-help').css('top', y - z + 5).show();
$('span.spanWrapper, *[data-list], button.btn-docxpresso').mouseleave(function(){
$('span.spanWrapper, *[data-list], button.btn-docxpresso').keypress(function(){
$('span.spanWrapper, *[data-list]').click(function(){
if ($(this).data('type') == 'textarea') {
currentTextArea = $(this);
varspan = $(this).children('.h5p_varspan');
$('#textareaVar').html(varspan.attr('data-name'));
$(".summernoteTextarea").code(varspan.html());
$('#textareaModal').modal('show');
//prevent carriage returns in variables that are not multiline text
$('span.spanWrapper').on('keydown', function(e){
if (e.which===13 && $(this).data('type') != 'multilineText') {
} else if (e.which===13 && $(this).data('type') == 'multilineText') {
e.preventDefault(); if (window.getSelection) {
var lineBreak = document.createElement("br");
range.insertNode(lineBreak);
$('img[data-image]').mouseover(function(){
tip = decodeDXO(dxo[$(this).data('image')]['tip']);
source = decodeDXO(dxo[$(this).data('image')]['source']); helper = ' ';
helper += decodeDXO(dxo[$(this).data('image')]['label']);
helper += decodeDXO(dxo[$(this).data('image')]['comment']);
if ($('' + decodeDXO(dxo[$(this).data('image')]['comment']) + '').text().trim() != ''){
$('.h5p-help').css('top', y - z + 5).show(); });
$('img[data-image]').mouseleave(function(){
$('img[data-image]').click(function(){
imageName = $(this).data('image');
source = dxo[$(this).data('image')]['source'];
var global = dxo[$(this).data('image')]['global'];
var editable = dxo[$(this).data('image')]['editable'];
if (source == 'signature' && editable) {
canvas = document.querySelector("#signatureModal canvas");
$("#signatureModal").modal('show');
$('#saveSignature').click(function(){
signature = signaturePad.toDataURL();
$('img[data-image="' + imageName + '"]').attr('src', signature);
$(img).attr('src', signature);
$("#signatureModal").modal('hide');
format = dxo[imageName]['format'];
$('img[data-image="' + imageName + '"]').css('height', 'auto');
$('img[data-image="' + imageName + '"]').parent().css('height', 'auto');
$('img[data-image="' + imageName + '"]').css('width', 'auto');
$('img[data-image="' + imageName + '"]').parent().css('width', 'auto');
$('#loadSignature').off();
$('#loadSignature').click(function(){
$('#saveSignature').off('click');
$('input[data-image="' + imageName + '"]').click();
} else if (editable) {
//activate the associated input file type field
var el = $(this).parent().children("input");
//special variables
$('span.spanWrapperSpecial').mouseover(function(){
tip = decodeDXO(dxoSpecial[$(this).data('name')]['tip']);
helper += decodeDXO($(this).data('label'));
helper += decodeDXO(dxoSpecial[$(this).data('name')]['comment']);
helper += ''
if ($('' + decodeDXO(dxoSpecial[$(this).data('name')]['comment']) + '').text().trim() != ''){
$('.h5p-help').css('top', y - 75).show();
$('span.spanWrapperSpecial').mouseleave(function(){
$('span.spanWrapperSpecial').click(function(){
$('*[data-proc]').click(function(){
cmd = $(this).data('proc');
if (typeof $(this).data('value') !== 'undefined') {
} document.execCommand(cmd, false, value);
$('.loadFile').click(function(){
$('input[name="' + $(this).attr('data-file') + '"]').click();
$('input.fileAttached').change(function(){
$('small[data-file="' + name + '"]').html($(this)[0].files[0].name);
window.attachments[name]['file'] = $(this)[0].files[0].name;
$('#saveContinue').click(function(){
$("#attachmentModal").modal('hide'); if (skipOutputModal == true){
$('#saveAndDownload').click(); } else {
$("#saveModal").modal('show'); }
radioClass: 'iradio_square-green'
$("#cancelModal").modal('show');
$('#cancelGo').click(function(){
window.warning = false;
//window.location.href = 'http://docs.consumoteca.com/documents/show/225';
$('#process').click(function(){
window.location.href = 'http://docs.consumoteca.com/documents/process/225';
$('#attachPane').click(function(){
openAttachmentPad();
//parsing the HTML
$('#validate').click(function(){
validateModal(true, true); });
//check if the required data has been included and if it is valid or function validata() {
var totalFields = 0;
var validations = {};
var attachs = {};
var filled = {};
var valid = {};
//check for attachments
for (var file in window.attachments) {
if (window.attachments.hasOwnProperty(file)){
if (window.attachments[file]['active']){
if (typeof window.attachments[file]['file'] !== 'undefined' && window.attachments[file]['file'] != ''){
attachs[file] = true;
attachs[file] = false;
//check for variables
for (j = 0; j < numData; j++) {
filled[docxpressoData.data[j].name] = [];
valid[docxpressoData.data[j].name] = [];
if ( docxpressoData.data[j].editable && (docxpressoData.data[j].type == 'options' && (typeof docxpressoData.data[j].choice !== 'undefined' && docxpressoData.data[j].choice == 'radio'))) { input = $('input[type="radio"][data-name="' + docxpressoData.data[j].name + '"]');
if (input.length > 0) {
if (inactiveFieldset($(this))) {
radioValue = $("input:radio[name ='" + docxpressoData.data[j].name + "']:checked").val();
if (typeof radioValue !== 'undefined' && radioValue != '' ) {
filled[docxpressoData.data[j].name][counter] = true;
//then the value is automatically valid
valid[docxpressoData.data[j].name][counter] = true;
filled[docxpressoData.data[j].name][counter] = false;
} else if ( docxpressoData.data[j].editable && (docxpressoData.data[j].type == 'options' && (typeof docxpressoData.data[j].choice !== 'undefined' && docxpressoData.data[j].choice == 'checkbox'))) { input = $('input[type="checkbox"][data-name="' + docxpressoData.data[j].name + '"]');
//The checkboxes may preserve their default value because they do not need to be checked
value += $(this).val() + ';'
var validVar = isValid(value, decodeURI(docxpressoData.data[j].regex));
if (validVar) {
valid[docxpressoData.data[j].name][counter] = false;
counter++; } else if (docxpressoData.data[j].editable && docxpressoData.data[j].type != 'bookmark' && docxpressoData.data[j].type != 'image') { span = $('span.h5p_varspan[data-name="' + docxpressoData.data[j].name + '"]');
//we need a little hack for compatibility with some MAC systems that do not
//properly update data comming from a dropdown for unknown reasons
if (docxpressoData.data[j].type == 'list' || docxpressoData.data[j].type == 'options'
|| docxpressoData.data[j].type == 'rpc') {
var dropval = $(this).parents('p:first').find('select[data-list="' + docxpressoData.data[j].name + '"]').val();
if ($(this).html() != dropval) {
//console.log(docxpressoData.data[j].name + ': enforce updating to ' + dropval);
$(this).html(dropval);
//console.log('no upgrading necessary');
//exclude the case where validation is set explicitely to none
if(docxpressoData.data[j].validation == 'novalidation') {
if ($(this).html() == decodeDXO(refData[docxpressoData.data[j].name]) ) {
var validVar = isValid($(this).html(), decodeURI(docxpressoData.data[j].regex));
} else if (docxpressoData.data[j].editable && docxpressoData.data[j].type == 'image') {
img = $('img[data-image="' + docxpressoData.data[j].name + '"]');
if($(this).attr('src') == window.originalImages[docxpressoData.data[j].name][counter] ){
filled[docxpressoData.data[j].name][counter] = false; } else {
if($(this).attr('src').substring(0,10) == 'data:image'){
valid[docxpressoData.data[j].name][counter] = true; } else {
validations.filled = filled;
validations.valid = valid;
validations.attachs = attachs;
return validations;
function inactiveFieldset (node) {
var fsparent = node.parents('div.h5p_wrappingdiv, table[data-type]:first, div[data-type]:first');
fsparent.each(function(){
}); return skip;
function isValid(val, regex) {
str = val.trim();
str = $('').html(str).text();
//hack to remove htmlentities from the regular expression
rx = $('').html(regex).text();
pattern = new RegExp(rx);
res = pattern.test(str);
function validateModal(showAll, open){
$('#ignoreAndDownload').show();
$('#ignoreAndDownload').click(function(){
$('#validateModal').modal('hide');
saveAndDownload();
//we are in testing mode so we deactivate the ignore button
$('#ignoreAndDownload').hide();
var validations = validata();
var valHTML = '';
var emptyFields = 0;
var validated = 1;
for (prop in validations.filled) {
if (validations.filled.hasOwnProperty(prop) && dxo[prop]['editable'] && dxo[prop]['type'] != 'bookmark') {
totalFields++;
if (dxo[prop]['global'] || validations.filled[prop].length == 1) {
if (!validations.filled[prop][0]){
valHTML += '';
valHTML += ' ';
if (decodeDXO(dxo[prop]['tip']).trim() != '') {
valHTML += decodeDXO(dxo[prop]['tip']);
valHTML += decodeDXO(dxo[prop]['label']);
valHTML += ' : todavía tiene el valor por defecto.';
emptyFields++;
} else if (!validations.valid[prop][0]){
valHTML += ' : el valor introducido no es válido.';
validated = 0;
} else if (showAll) {
valHTML += ' : el valor introducido parece correcto.';
preHTML = '';
var len = validations.filled[prop].length;
for(var j=0; j < len; j++) {
if (!validations.filled[prop][j]){
preHTML += '';
preHTML += ' ';
preHTML += decodeDXO(dxo[prop]['tip']);
preHTML += decodeDXO(dxo[prop]['label']);
preHTML += ' [' + (j + 1) +']';
preHTML += ' : todavía tiene el valor por defecto.';
} else if (!validations.valid[prop][j]){
preHTML += ' : el valor introducido no es válido.';
validated = 0
preHTML += ' : el valor introducido parece correcto.';
if (preHTML != '') {
valHTML += 'Dato clonado';
valHTML += preHTML;
var attachHTML = '';
for (prop in validations.attachs) {
if (validations.attachs.hasOwnProperty(prop)){
if (validations.attachs[prop] === false){
attachHTML += '';
attachHTML += ' ';
attachHTML += decodeDXO(prop);
attachHTML += ' : no hay ningún archivo seleccionado.';
attachHTML += ' : hay un archivo seleccionado.';
if (attachHTML != '') {
attHTML = ' Archivos adjuntos'
attHTML = '';
$('#validation-pad').html(valHTML + attHTML + attachHTML);
$('#validation-pad button').click(function(){
if($(this).attr('data-valtype') == 'list' || $(this).attr('data-valtype') == 'options' || $(this).attr('data-valtype') == 'rpc'){
selStr = 'select[data-list="' + $(this).attr('data-valname') + '"]:eq(' + $(this).attr('data-num') + ')';
selStr += ', input[data-list="' + $(this).attr('data-valname') + '"]:eq(' + $(this).attr('data-num') + ')';
selector = $(selStr);
} else if($(this).attr('data-pad') == 'open'){ $("#validateModal").modal('hide');
} else if($(this).attr('data-valtype') != 'image'){
selector = $('.h5p_varspan[data-name="' + $(this).attr('data-valname') + '"]:eq(' + $(this).attr('data-num') + ')');
selector = $('img[data-image="' + $(this).attr('data-valname') + '"]:eq(' + $(this).attr('data-num') + ')');
//when there are tabs things get a little more complex because
//we need to "show" the correct tab first
if (typeof docxpressoData['settings']['tabs'] !== 'undefined'
&& docxpressoData['settings']['tabs'] == 1) {
section = selector.parents('section:first');
num = section.attr('data-order');
//trigger a click on the corresponding tab
$('a[data-order="' + num + '"]').click();
$("#validateModal").modal('hide');
$.scrollTo(selector, 500, {offset: -80});
//flash the variable that should be edited again
originalBColor = selector.css('background-color');
originalColor = selector.css('color');
selector.css('background-color', '#ffff99')
.css('color', '#b70000')
.fadeOut('slow').fadeIn('slow')
.fadeOut('fast').fadeIn('fast')
.fadeOut('fast').fadeIn('fast', function(){
selector.css('background-color', originalBColor);
selector.css('color', originalColor);
console.log('**********validations**********');
console.log(totalFields);
console.log(emptyFields);
console.log(validated);
console.log('********************');
if (totalFields > 0){
var percentage = parseInt(100* (totalFields - emptyFields)/totalFields);
var percentage = 100;
$('#percentComp').val(percentage);
$('#validated').val(validated);
$("#validateModal").modal('show');
function parseBlocks(node) {
var blocks = {};
var step = function(node, blocks) {
var currentBlock = '';
if (node.nodeType == 1){
if (node.getAttribute('data-type')){
if (node.getAttribute('data-h5p') != currentBlock) {
currentBlock = node.getAttribute('data-h5p');
counter= 0;
} blocks[node.getAttribute('data-h5p') + '::' + counter] = {};
if(node.hasChildNodes()){
step(node.firstChild, blocks[node.getAttribute('data-h5p') + '::' + counter]);
} else if (node.hasChildNodes()){
step(node.firstChild, blocks);
while (node = node.nextSibling);
step(node, blocks);
function parseVars() {
if (docxpressoData.data[j].type == 'options' && (docxpressoData.data[j].choice == 'radio' || docxpressoData.data[j].choice == 'checkbox')) {
vars[docxpressoData.data[j].name] = [];
choice = $('input[data-list="' + docxpressoData.data[j].name + '"]');
choice.each(function(){
vars[docxpressoData.data[j].name].push(encodeDXO($(this).val()));
vars[docxpressoData.data[j].name].push('');
} else if (docxpressoData.data[j].type == 'options' && docxpressoData.data[j].choice == 'multipleSelect') {
vars[docxpressoData.data[j].name].push(window.multiselects[docxpressoData.data[j].name]);
} else if (docxpressoData.data[j].type != 'bookmark' && docxpressoData.data[j].type != 'image') {
span = $('span.h5p_varspan[data-name="' + docxpressoData.data[j].name + '"]');
if (docxpressoData.data[j].validation == 'email' || docxpressoData.data[j].validation == 'URL') {
var newLink = linkDressUp ($(this).html(), docxpressoData.data[j].validation);
vars[docxpressoData.data[j].name].push(encodeDXO(newLink));
vars[docxpressoData.data[j].name].push(encodeDXO($(this).html()));
//console.log(docxpressoData.data[j].name + ': ' + $(this).html());
} else if (docxpressoData.data[j].type == 'image') {
vars[docxpressoData.data[j].name].push($(this).attr('src'));
if (typeof window.imageSize[docxpressoData.data[j].name] !== 'undefined') {
dxo[docxpressoData.data[j].name]['width'] = window.imageSize[docxpressoData.data[j].name]['width'];
dxo[docxpressoData.data[j].name]['width'] = $('img[data-image="' + docxpressoData.data[j].name + '"]').css('width');
dxo[docxpressoData.data[j].name]['height'] = window.imageSize[docxpressoData.data[j].name]['height'];
dxo[docxpressoData.data[j].name]['height'] = $('img[data-image="' + docxpressoData.data[j].name + '"]').css('height');
function parseSpecialVars() {
var svars = {};
svars[docxpressoData.special[j].name] = [];
span = $('span.h5p_varspecial[data-name="' + docxpressoData.special[j].name + '"]');
svars[docxpressoData.special[j].name].push(encodeDXO($(this).html()));
return svars;
if (typeof docxpressoData.attachments !== 'undefined' && typeof docxpressoData.attachments.files !== 'undefined' ) {
numAttachments = docxpressoData.attachments.files.length;
for (j = 0; j < numAttachments; j++) {
name = docxpressoData.attachments['files'][j]['name'];
counter += verifyAttachment(name, j);
function verifyAttachment(name, j){
if (typeof window.attachments[name] == 'undefined' ){
window.attachments[name] = {};
if(docxpressoData.attachments['files'][j]['dependsOn'] == ''){
window.attachments[name]['active'] = true;
$('div.attachedFile[data-file="' + name + '"]').show();
$('div.attachedFile[data-file="' + name + '"]').next('div.hr-line-dashed').show();
$('input[name="' + name + '"]').prop('disabled', false);
//get the variable value
dependsOn = docxpressoData.attachments['files'][j]['dependsOn'];
value = docxpressoData.attachments['files'][j]['value'];
var tmp = value.split(';');
//console.log('valores a comprobar')
vars= [];
if (dxo[dependsOn].type == 'options' && (dxo[dependsOn].choice == 'radio' || dxo[dependsOn].choice == 'checkbox')) {
choice = $('input[data-list="' + dependsOn + '"]');
vars.push($(this).val());
span = $('span.h5p_varspan[data-name="' + dependsOn + '"]');
vars.push(encodeDXO($(this).html()));
varLen = vars.length;
for (var n = 0; n < varLen; n++) {
if (tmp.indexOf(vars[n].trim()) > -1 || tmp.indexOf(encodeURI(vars[n].trim())) > -1){
window.attachments[name]['active'] = false;
//hide and disable this attachment
$('div.attachedFile[data-file="' + name + '"]').hide();
$('div.attachedFile[data-file="' + name + '"]').next('div.hr-line-dashed').hide();
$('input[name="' + name + '"]').prop('disabled', true);
function openAttachmentPad () {
attachmentsNumber = checkAttachments();
if (attachmentsNumber > 0){
$('#saveContinue').hide();
$("#attachmentModal").modal('show');
toastr.error('No hay archivos adjuntos asociados a este documento.', 'Aviso');
$('#download').click(function(){
if (attachmentsNumber > 0) { $('#saveContinue').show();
if (skipOutputModal == true){
$('#continueLater').click(function(){
$("#saveContinueModal").modal('show'); });
$('#emailLinkValue').keyup(function(){
$('#emailLink').iCheck('check');
$('#submitContinueLater').click(function(){
//check if we should send a link by email
if($('#emailLink').prop('checked')){
var email = $('#emailLinkValue').val();
var valid_email = function(email) { return /^.+@.+\..+$/.test(email); }
if (valid_email(email)) {
toastr.error('El email no es válido.', 'Aviso');
//check if data should be saved locally
if($('#localdata').prop('checked')){
saveLocally(); };
$("#saveContinueModal").modal('hide'); $('#download').click();
$('#saveAndDownload').click(function(){
$("#saveModal").modal('hide');
var validations;
var repair = false
validations = validata();
//check if a variable does not validate
//first check that the variable is editable
if (dxo[prop]['editable']){
if (validations.filled.hasOwnProperty(prop)){
if ((typeof validations.filled[prop][0] !== 'undefined' && !validations.filled[prop][0]) || (typeof validations.valid[prop][0] !== 'undefined' && !validations.valid[prop][0])){
if ((typeof validations.filled[prop][j] !== 'undefined' && !validations.filled[prop][j]) || (typeof validations.valid[prop][j] !== 'undefined' && !validations.valid[prop][j])){
//look for empty attachments
//console.log('attachments');
//console.log(window.attachments);
//console.log(window.attachments[file]['file']);
if (typeof window.attachments[file]['file'] === 'undefined' || window.attachments[file]['file'] == ''){
if (repair) {
validateModal(false, true); } else {
validateModal(false, false);
saveAndDownload(); }
function parseData() {
docxpressoData.blocks = parseBlocks(document.body);
docxpressoData.varValues = parseVars();
docxpressoData.specialVarValues = parseSpecialVars();
docxpressoData.dependencies = window.dependencies;
//also send the blocks that should be removed for simplicity
$('div[data-type="block"]').each(function(){
remove.push($(this).attr('data-h5p'));
$('table[data-type="table"]').each(function(){
docxpressoData.remove = remove;
function saveAndDownload() {
$('#uploadingModal').modal('show');
//fake motion progress bar
progressBar = setInterval(function() {
if (bar > 99) {
clearInterval(progressBar);
$('#uploadVar').css('width', bar + '%');
}, progressTimer/50);
$('#docFormat').val($('input[name=format]:checked').val());
$('#comments').val($('.summernoteComments').code());
json = JSON.stringify(docxpressoData);
console.log('sent:');
//take care of simple quotes
json = json.replace(/\'/g, "&apos;");
$('#data').val(json);
//save to local and recover
$('#localStorage').click(function(){
saveLocally();
$('#retrieveLocalData').click(function(){
$('#removeLocalData').click(function(){
removeLocalData();
function saveLocally () {
//store with local storage
localStorage.setItem("preview_225", json);
localStorage.setItem("previewTime_225", new Date().getTime());
function removeLocalData () {
localStorage.removeItem("preview_225");
localStorage.removeItem("previewTime_225");
toastr.success('Los metadatos salvados localmente han sido eliminados.', 'Datos locales eliminados');
function retrieveLocalData () {
raw = localStorage.getItem("preview_225");
storedTime = localStorage.getItem("previewTime_225");
if (raw !== null) {
data = JSON.parse(localStorage.getItem("preview_225"));
replaceVars(data.specialVarValues, true);
toastr.error('No hay datos locales asociados a este documento', 'Aviso');
function cloneBlocks(blocks, node){
if (typeof node === 'undefined') {
node = $('body');
if (typeof blocks !== 'undefined') {
var childBlocks = [];
//run over the childs
for (block in blocks) {
if (blocks.hasOwnProperty(block)){
var temp = block.split('::');
var blockName = temp[0];
if (typeof childBlocks[blockName] === 'undefined') {
childBlocks[blockName] = 1;
childBlocks[blockName]++;
for (child in childBlocks) {
toClone = node.find('*[data-h5p ="{{' + child + '}}"] , *[data-h5p="' + child + '"]');
//remove precloned objects
toClone.each(function(index){
//start the cloning
for (var n = 0; n < childBlocks[child]-1; n++) {
toClone.eq(0).clone(true, true).insertBefore(toClone.eq(0));
var subBlocks = blocks[block];
var subBlockCount = Object.keys(subBlocks).length;
if (subBlockCount > 0) {
var nTemp = block.split('::');
var bName = nTemp[0];
var order = nTemp[1]
var newNode = node.find('*[data-h5p ="{{' + bName + '}}"] , *[data-h5p="' + bName + '"]').eq(order);
cloneBlocks(subBlocks, newNode);
function replaceVars (data, special) {
var len = data[name].length;
var selector = $('span.h5p_varspecial[data-name="' + name + '"]');
selector.eq(k).html(decodeDXO(data[name][k]));
//let us protect the case where only var values are
//sent assuming they are standard text variables
if (typeof dxo[name] !== 'undefined' && typeof dxo[name]['type'] !== 'undefined') { var type = dxo[name]['type'];
if (type == 'options' && typeof dxo[name]['choice'] !== 'undefined' ) {
var choice = dxo[name]['choice'];
var choice = 'dropdown';
var selector = $('img[data-image="' + name + '"]');
selector.eq(k).attr('src', data[name][k]);
} else if (type == 'list' || (type == 'options' && choice == 'dropdown') || type == 'rpc') {
var selector = $('select[data-list="' + name + '"]');
if (decodeDXO(data[name][k]) != '') {
selector.eq(k).val(decodeDXO(data[name][k]));
//we also have to update the associated span
var selector = $('span.h5p_varspan[data-name="' + name + '"]');
//update block visibility
if (typeof window.dependencies[name] !== 'undefined') {
modifyBlockVisibility(name, decodeDXO(data[name][k]));
} else if(type == 'options' && choice == 'multipleSelect') {
selector.eq(k).val(data[name][0]);
selector.multiselect('refresh');
window.multiselects[name] = data[name][0];
} else if(type == 'options' && choice != 'dropdown') {
var selector = $('input[data-list="' + name + '"]');
selector.eq(k).prop("checked", true);
selector.eq(k).prop("checked", false);
//if the value has been left empty load the label
if (data[name][k] != '') {
selector.eq(k).html(decodeDXO(dxo[name]['label']));
window.localDataLoaded = true;
function loadSingleVarFromLocal(name) {
var raw = localStorage.getItem("preview_225");
var data = JSON.parse(localStorage.getItem("preview_225"));
vals[name] = data.varValues[name];
replaceVars(vals, false);
//load server data if any
var bar = 38;
if (bar > 98) {
$('#loadVar').css('width', bar + '%');
}, progressTimer/80);
if (typeof dataToLoadFromServer.blocks != 'undefined' ) {
cloneBlocks(dataToLoadFromServer.blocks);
if (typeof dataToLoadFromServer.varValues != 'undefined' ) {
replaceVars(dataToLoadFromServer.varValues, false);
if (typeof dataToLoadFromServer.specialVarValues != 'undefined' ) {
replaceVars(dataToLoadFromServer.specialVarValues, true);
setTimeout(function(){ $('#serverModal').modal('hide'); }, progressTimer);
function preparseWYSIWYG (varspan, HTMLdata) {
//get the font styles
var color = varspan.css('color');
var family = varspan.css('font-family');
var size = varspan.css('font-size');
varspan.html(HTMLdata);
varspan.find('p, li').each(function(){
var styleArray = $(this).attr('style');
if (typeof styleArray === 'undefined') {
styleArray = [];
var prop = '';
var numStyles = styleArray.length;
for (var j = 0; j < numStyles; j++) {
prop = styleArray[j].split(':');
styles[$.trim(prop[0].replace('-',''))] = $.trim(prop[1]);
if( typeof styles.color === 'undefined') {
if( typeof styles.fontsize === 'undefined') {
$(this).css('font-size', size);
if( typeof styles.fontfamily === 'undefined') {
$(this).css('font-family', family);
function linkDressUp(linkable, type) {
var linkedData = linkable;
str = $('').html(linkable).text();
if (str == linkable){
linkedData = '';
linkedData += linkable;
linkedData += '';
} else if (type == 'URL') {
//we need a further check because if the URL does not start
//with http:// or https:// MS Word fails to open the
var http = linkable.substring(0,7);
var https = linkable.substring(0,8);
if (http == 'http://' || https == 'https://') {
} return linkedData;
function signatureSelect() {
if (window.emails.length > 0){
$('#selectemail').empty();
for (em in window.emails){
var name = window.emails[em];
span = $('span.h5p_varspan[data-name="' + name + '"]');
var opt = '' + value + '';
$('#selectemail').append(opt);
if (counter == 0) {$('#inputemail').val(value);}
$('#selectemail').append('Other email');
$('#signatureSel').hide();
$('#signatureInput').show();
$('#selectemail').change(function(){
if ($(this).val() == 0){
$('#inputemail').val($(this).val());
//Usage modal
$('#usageData').click(function(){
$('#referenceValue').val($('#reference').val());
$('#identifierVars').append('Insert variable');
for (var prop in dxo) {
$('#identifierVars').append('' + prop + '');
if(typeof docxpressoData['settings']['identifier'] !== 'undefined'){
$('#identifierVars').val($('#identifier').val());
$('#usageModal').modal('show');
$('#saveReferences').click(function(){
$('#reference').val($('#referenceValue').val());
$('#identifier').val($('#identifierVars').val());
$('#usageModal').modal('hide'); });
ga('create', 'UA-78544782-1', 'auto');

References: resolución 
 resolución 
 resolución 
 resolución 
 artículo 25
 resolución