diff --git a/src/main/resources/rendering-xslt/interactions/graphicGapMatchInteraction.xsl b/src/main/resources/rendering-xslt/interactions/graphicGapMatchInteraction.xsl index f5fe2c1c9aa22d12a85dfb1324817faa2a10bb08..b80c0a97d1875d65f51121e67f7045956405b415 100644 --- a/src/main/resources/rendering-xslt/interactions/graphicGapMatchInteraction.xsl +++ b/src/main/resources/rendering-xslt/interactions/graphicGapMatchInteraction.xsl @@ -22,7 +22,121 @@ <xsl:variable name="object" select="qti:object" as="element(qti:object)"/> <xsl:variable name="appletContainerId" select="concat('qtiworks_id_appletContainer_', @responseIdentifier)" as="xs:string"/> - <div id="{$appletContainerId}" class="appletContainer"> + <xsl:variable name="hotspots" select="qw:filter-visible(qti:associableHotspot)" as="element(qti:associableHotspot)*"/> + <xsl:variable name="gapImgs" select="qw:filter-visible(qti:gapImg)" as="element(qti:gapImg)*"/> + <xsl:variable name="responseValue" select="qw:get-response-value(/, @responseIdentifier)" as="element(qw:responseVariable)?"/> + + <div id="{$appletContainerId}" class="appletContainer" style="position:relative;"> + <img id="{$appletContainerId}_img" width="{$object/@width}" height="{$object/@height}" src="{qw:convert-link-full($object/@data)}" usemap="#{$appletContainerId}_map"></img> + <map name="{$appletContainerId}_map"> + <xsl:for-each select="$hotspots"> + <!-- @matchGroup, @matchMax --> + <area id="{@identifier}" shape="{@shape}" coords="{@coords}" href="#" title="{@label}" class="area-droppable"></area> + </xsl:for-each> + </map> + <div class="gap_container" style="width:{$object/@width}px; height:50px; background-color:#cccccc;"> + <xsl:for-each select="$gapImgs"> + <!-- @matchGroup, @matchMax, @label --> + <div id="{@identifier}" class="gap_item" style="width:{qti:object/@width}px; height:{qti:object/@height}px; margin:5px; background-image:url('{qw:convert-link-full(qti:object/@data)}');"> </div> + </xsl:for-each> + </div> + + <script type="text/javascript"> + <![CDATA[ + toCoords = function(area) { + var coords = area.attr('coords').split(','); + for (i=0; i < coords.length; i++) { + coords[i] = parseFloat(coords[i]); + } + return coords; + }; + ]]> + <xsl:choose> + <xsl:when test="qw:is-not-null-value($responseValue)"> + + jQuery(function() { + var pairs = '<xsl:value-of select="$responseValue/qw:value" separator=","/>'.split(','); + for(var i=pairs.length; i-->0; ) { + var ids = pairs[i].split(' '); + + var item1 = jQuery('#' + ids[0]); + var item2 = jQuery('#' + ids[1]); + + var gapitem, areaEl; + if(item1.hasClass('gap_item')) { + gapitem = item1; + areaEl = item2; + } else { + gapitem = item2; + areaEl = item1; + } + + var coords = toCoords(areaEl); + gapitem.css('position','absolute'); + gapitem.css('left', coords[0] + 'px'); + gapitem.css('top', coords[1] + 'px'); + gapitem.addClass('oo-choosed'); + } + }); + + </xsl:when> + <xsl:otherwise> + + jQuery(function() { + + jQuery(".gap_item").on('click', function(e, el) { + var gapitem = jQuery(this); + + if(gapitem.hasClass('oo-choosed')) { + gapitem.removeClass('oo-choosed'); + gapitem.css('position','relative'); + gapitem.css('left','auto'); + gapitem.css('top','auto'); + + var gapitemId = gapitem.attr('id'); + //remove + jQuery('#<xsl:value-of select="$appletContainerId"/>').find("input[type='hidden']").each(function(index, el) { + var value = jQuery(el).val(); + if(value.indexOf(gapitemId + ' ') == 0) { + jQuery(el).remove(); + } + }); + } else { + gapitem.css('border','3px solid black'); + gapitem.addClass('oo-selected'); + } + }); + + jQuery("#<xsl:value-of select="$appletContainerId"/> area").on('click', function(e, el) { + var areaEl = jQuery(this); + jQuery(".gap_item.oo-selected").each(function(index, el){ + var gapitem = jQuery(el); + var coords = toCoords(areaEl); + var areaId = areaEl.attr('id'); + var gapitemId = gapitem.attr('id'); + + gapitem.css('position','absolute'); + gapitem.css('left', coords[0] + 'px'); + gapitem.css('top', coords[1] + 'px'); + + gapitem.css('border', 'none'); + gapitem.removeClass('oo-selected'); + gapitem.addClass('oo-choosed'); + + //add + var divContainer = jQuery('#<xsl:value-of select="$appletContainerId"/>'); + var inputElement = jQuery('<input type="hidden"/>') + .attr('name', 'qtiworks_response_RESPONSE') + .attr('value', gapitemId + " " + areaId); + divContainer.prepend(inputElement); + }); + }); + }); + + </xsl:otherwise> + </xsl:choose> + </script> + <!-- <object type="application/x-java-applet" height="{$object/@height + 40}" width="{$object/@width}"> <param name="code" value="BoundedGraphicalApplet"/> <param name="codebase" value="{$appletCodebase}"/> @@ -60,6 +174,7 @@ select="$appletContainerId"/>', ['<xsl:value-of select="@responseIdentifier"/>']); }); </script> + --> </div> </div> </xsl:template>