Esta es la plantilla con el código HTML, SVG y JavaScript que mostrará el Calendario en el Visor HTML y nos permitirá hacer cambios que se guardan directamente en la tabla de Velneo.

Desde Velneo generamos la información necesaria y la incluímos entre los marcadores <!-- INSERT_VELNEO ...  INSERT_VELNEO -->

Desde el Visor HTML pasamos información a Velneo usando un String JSON que asignamos a la propiedad href de un objeto del HTML (id:"EtiquetaMensaje") . Mediante la función simularClick() forzamos un evento Click en el objeto id:"EtiquetaMensaje" y Velneo podrá capturar ese evento y leer el String JSON de la variable local EVENT_PARAMS[1].

Para la gestión del código svg he usado la librería snap SVG (snap.svg-min.js) que bajo el paradigma de la POO facilita enormemente la creación de elementos SVG así como la transformación y animación de dichos elementos. Es una librería de libre uso, patrocinada por Adobe, muy sencilla y desde luego mucho más productiva, de momento, que usar QML.


<!doctype html>

<html>

<head>

    <style>

         #grafico_marco {

            height: 80%;

            border: 0 solid;

            padding: 20px;

        }

        #calendario {

            margin-top: 0;

        }

    </style>


    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

    <title>Calendario</title>

    <script src="snap.svg-min.js"></script>


    <!-- Opciones iniciales del Calendario (se determinan en Velneo)

       Desde Velneo sustituímos el código entre los marcadores -->

    <!-- INSERT_VELNEO ...  INSERT_VELNEO -->


    <!-- INSERT_VELNEO -->

    <script>

        /////////////////////////////////////////////////////////////////////////////////////

        var cViewBox = "0 0 420 365";

        var cPreserveAspectRatio = "xMidYMin meet";

        var nMes = 3;

        var nAño = 2015;

        var meses = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];

        var aDiasSemana = ["Lun","Mar","Mié","Jue","Vie","Sáb","Dom"];

        var oCitas = {

            D5:["P","O"],

            D10:["L","P"],

            D12:["P","O"],

            D18:["O","O"],

            D19:["P","L"],

            D24:["P","P"],

            D27:["L","P"],

            }

        /////////////////////////////////////////////////////////////////////////////////////

    </script>

    <!-- INSERT_VELNEO -->


    <!-- API snap svg. Código JavaScript que muestra y gestiona los elementos SVG -->

    <script>


        window.addEventListener("load", inicio, false);


        ///////////////// Variables globales

        var cEstiloTexto = "text-anchor:middle;text-align:center;font-family:Arial,sans-serif;cursor:default;"

        var cEstiloTitulo = "font-size:25;" + cEstiloTexto;

        var cEstiloAño = "font-size:15;text-anchor:end;text-align:right;font-family:Arial,sans-serif;cursor:default;"

        var cEstiloDiaSemana = "font-size:15;" + cEstiloTexto;

        var cEstiloCasilla = "font-size:30;font-weight:bold;" + cEstiloTexto;


        var cTitulo = meses[nMes - 1].toUpperCase();

        // Pasar 0 con el mes siguiente, con getDate() obtenemos el Nº de días del mes anterior

        var nDiasMes = new Date(nAño, nMes, 0).getDate();

        // El día de la semana es 0 para el domingo

        var nColumnaDia1 = new Date(nAño, nMes-1, 1).getDay();

        nColumnaDia1 = nColumnaDia1 == 0 ? 7 : nColumnaDia1;

        // nDesplazamiento es la celda correspondiente al día 1 del mes

        var nDesplazamiento = 7 + nColumnaDia1;

        var nDia = 0, nCasilla = 0, nFila = 0, nColumna = 0, nX = 0, nY = 0, nCita = 0;

        var cColor = "", cStyle = "";

        var cColorDia = "Black";

        var cColorFinSemana = "FireBrick";

        var aCitas = ["L","P","O"];

        var cCita = ""

       

        //////// Objeto JSON para enviar Mensajes a JSON

        // Pasamos Año, Mes y Día / Acción EDITAR / Período AM o PM / Citas L,P,O

        var oJSONMensaje = {OBJETO:"CALENDARIO",AÑO:0,MES:0,DIA:0,ACCION:"",PERIODO:"",CITA:""};

        var oLinkEtiqueta = null


        function inicio() {

            var oCanvas = Snap(calendario);

            // Snap("#AM1").click(function(){this.attr({"xlink:href":"#O"});})

            // Snap("#PM1").click(function(){this.attr({"xlink:href":"#P"});})

            cargar_svg(oCanvas)

            // Creamos un elemento Link (<a>) que está por encima del Calendario y

            //     capturará el Link cuando hacemos click en las Citas

            oLinkEtiqueta = oCanvas.el("a",{id:"EtiquetaMensaje","xlink:href":"#"});

        }


        function cargar_svg(oCanvas) {

            // Título del Mes y aspecto del canvas SVG

            oCanvas.attr("viewBox",cViewBox);

            oCanvas.attr("preserveAspectRatio",cPreserveAspectRatio);

            oCanvas.text(210,20,cTitulo).attr({fill:"RoyalBlue",style:cEstiloTitulo});

            oCanvas.text(420,15,nAño).attr({fill:"DimGray",style:cEstiloAño});


            //////////// Definiciones para los símbolos de las Citas

            oCanvas.path("m0,0,60,0,0,25-60,0z").attr({id:"DEF_L",fill:"Chartreuse",cursor:"hand"}).toDefs();

            oCanvas.g(

                    oCanvas.path("m0,0,60,0-60,25z").attr({fill:"LightCoral",cursor:"hand"}),

                    oCanvas.path("m0,25,60,0,0-25z").attr({fill:"Chartreuse",cursor:"hand"})

            ).attr({id:"DEF_P"}).toDefs();

            oCanvas.path("m0,0,60,0,0,25-60,0z").attr({id:"DEF_O",fill:"LightCoral",cursor:"hand"}).toDefs();


            //////////// Definiciones para los recuadros de las Casillas

            oCanvas.g(

                    oCanvas.line(0,25,60,25).attr({stroke:"Gray","stroke-opacity":0.5,"stroke-width":1}),

                    oCanvas.path("m0,0,60,0,0,50-60,0z").attr({stroke:"DarkSlateGray","stroke-width":1,fill:"none"})

            ).attr({id:"ml"}).toDefs();

            oCanvas.path("m0,0,60,0,0,50-60,0z").attr({id:"ms",stroke:"DarkSlateGray","stroke-width":1,fill:"none"}).toDefs();


            //////////// Días de la semana

            var oDiasSemana = oCanvas.g().attr({fill:"#909090",style:cEstiloDiaSemana});

            for (i = 0; i < 7; i++) {

                oDiasSemana.add(oCanvas.text(30+(i*60),50,aDiasSemana[i]))

            }


            //////////// Casillas del Calendario

            var oCasillas = oCanvas.g().attr({style:cEstiloCasilla});

            for (i = 0; i < (nDiasMes); i++) {

                nDia = i + 1;

                nCasilla = i + nDesplazamiento;

                nFila = parseInt(nCasilla / 7) + (nCasilla%7 == 0 ? 0 : 1);

                nColumna = nCasilla%7 == 0 ? 7 : nCasilla%7;

                nX = -30 + (60 * nColumna);

                nY = 50 * nFila;

                if (nColumna < 6) {

                    cStyle = "";

                    cColor = cColorDia;

                    ///////// Rellenamos las Citas del día actual para AM y PM

                    // Seleccionamos un elemento de Defs y lo añadimos al grupo con use()

                   

                    // Buscamos el registro con las Citas de nDia

                    cCita = "L"

                    if (oCitas["D" + nDia]) {

                       cCita = oCitas["D" + nDia][0];

                       poner_cita(nDia,"AM",cCita,nX-30,nY-12-25);

                       cCita = oCitas["D" + nDia][1];

                       poner_cita(nDia,"PM",cCita,nX-30,nY-12);

                    }

                    else {

                       poner_cita(nDia,"AM",cCita,nX-30,nY-12-25);

                       poner_cita(nDia,"PM",cCita,nX-30,nY-12);

                    }


                    // Dibujamos un marco con una línea que separa mañana y tarde

                    oCasillas.append(oCanvas.select("#ml").use().attr({x:nX-30,y:nY-12-25}));

                }

                else {

                    cStyle = "font-weight: normal;";

                    cColor = cColorFinSemana;

                    // Dibujamos un marco sin la línea

                    oCasillas.append(oCanvas.select("#ms").use().attr({x:nX-30,y:nY-12-25}));

                }

                oCasillas.add(oCanvas.text(nX,nY,nDia).attr({fill:cColor,style:cStyle}))

            }


            function poner_cita(nDia,cPeriodo,cCita,nX,nY) {

                var oCita = oCanvas.select("#DEF_" + cCita).use().attr({x:nX,y:nY});

                oCita.data("DIA",nDia)

                oCita.data("PERIODO",cPeriodo)

                oCita.data("CITA",cCita)

                oCita.click(cita_click)

                oCasillas.append(oCita);

            }

           

            function cita_click() {

                // Cambiamos la Cita L -> P -> O -> L

                var csCita = this.data("CITA");

                var cCita = (csCita=="L" ? "P" : (csCita=="P" ? "O" : "L"));

                var nX = this.attr("x");

                var nY = this.attr("y");

                var nDia = this.data("DIA");

                var cPeriodo = this.data("PERIODO");


                var oCita = oCanvas.select("#DEF_" + cCita).use().attr({x:nX,y:nY});

                oCita.data("DIA",nDia)

                oCita.data("PERIODO",cPeriodo)

                oCita.data("CITA",cCita)

                oCita.click(cita_click)

                // Añadimos la nueva Cita y quitamos la actual

                this.after(oCita);

                this.remove();

                // Simulamos el Click sobre la Etiqueta del Shape

                mensaje_JSON(nDia, "editar", cPeriodo, cCita);

            }

        }


        // MENSAJE A VELNEO. Mediante la simulación de un Click en la Cita

        function mensaje_JSON(nDia, cAccion, cPeriodo, cCita) {

            // Usamos la etiqueta oLinkEtiqueta creada encima del Calendario para

            //    simular un click y pasar a Velneo un JSON

            // En href pasamos un JSON para que lo interprete Velneo

            oJSONMensaje.AÑO = nAño;

            oJSONMensaje.MES = nMes;

            oJSONMensaje.DIA = nDia;

            oJSONMensaje.ACCION = cAccion;

            oJSONMensaje.PERIODO = cPeriodo;

            oJSONMensaje.CITA = cCita;

            oLinkEtiqueta.attr("xlink:href",JSON.stringify(oJSONMensaje));

            // Simulamos el Click sobre la Etiqueta

            simularClick("EtiquetaMensaje")

            // alert(JSON.stringify(oJSONMensaje))

        }


        function simularClick(cIDObjeto){

            // Simulamos el evento click sobre el objeto cIDObjeto

            var nouEvent = document.createEvent("MouseEvents");

            nouEvent.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);

            var objecte = document.getElementById(cIDObjeto);

            objecte.dispatchEvent(nouEvent);

        }


    </script>


</head>

<body>


<div id="grafico_marco">

    <svg id="calendario">


    </svg>

</div>


</body>

</html>



Created with the Personal Edition of HelpNDoc: Easily create Web Help sites