<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
<!ATTLIST svg
xmlns:attrib CDATA #IMPLIED
xmlns:batik CDATA #IMPLIED
>
<!ATTLIST g
batik:static CDATA #IMPLIED
>
]>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:batik="http://xml.apache.org/batik/ext" width="100%" height="100%" viewBox="0 0 1000 700" onload="init()">
<title>Example of SVG Scrollbars</title>
<script type="text/ecmascript" xlink:href="resources/mapApp.js"></script>
<script type="text/ecmascript" xlink:href="resources/helper_functions.js"></script>
<script type="text/ecmascript" xlink:href="resources/timer.js"></script>
<script type="text/ecmascript" xlink:href="resources/button.js"></script>
<script type="text/ecmascript" xlink:href="resources/scrollbar.js"></script>
<script type="text/ecmascript">
<![CDATA[
var mapApp;
var scrolledObject1;
var scrolledObject2;
function init() {
myMapApp = new mapApp(false,undefined);
//scrollbar styles
var scrollbarStyles = {"fill":"whitesmoke","stroke":"dimgray","stroke-width":1};
var scrollerStyles = {"fill":"lightgray","stroke":"dimgray","stroke-width":1};
var triangleStyles = {"fill":"dimgray"};
var highlightStyles = {"fill":"dimgray","stroke":"dimgray","stroke-width":1};
//button styles
var buttonTextStyles = {"font-family":"Arial,Helvetica","fill":"dimgray","font-size":12};
var buttonStyles = {"fill":"gainsboro"};
var shadeLightStyles = {"fill":"white"};
var shadeDarkStyles = {"fill":"dimgray"};
//create scrolledObjects to react on scrollbar
scrolledObject1 = new scrolledObject("content1",0,-2707,0,-220.5,"sb1horiz","sb1vert");
scrolledObject2 = new scrolledObject("content2",0,-2660.75,0,-489,"sb2horiz","sb2vert");
//id,parentNode,x,y,width,height,startValue,endValue,initialWidthPerc,initialOffset,scrollButtonLocations,scrollbarStyles,scrollerStyles,triangleStyles,highlightStyles,functionToCall
myMapApp.scrollbars["sb1horiz"] = new scrollbar("sb1horiz","scrollbars1",50.5,250.5,899,15,scrolledObject1.maxX,scrolledObject1.minX,0.2495,0,0.005,"top_bottom",scrollbarStyles,scrollerStyles,triangleStyles,highlightStyles,scrolledObject1);
myMapApp.scrollbars["sb1vert"] = new scrollbar("sb1vert","scrollbars1",950.5,50.5,15,199,scrolledObject1.maxY,scrolledObject1.minY,0.4756,0,0.025,"top_bottom",scrollbarStyles,scrollerStyles,triangleStyles,highlightStyles,scrolledObject1);
myMapApp.scrollbars["sb2horiz"] = new scrollbar("sb2horiz","scrollbars2",50.5,550.5,899,10,scrolledObject2.maxX,scrolledObject2.minX,0.2528,0,0.005,"bottom_bottom",scrollbarStyles,scrollerStyles,triangleStyles,highlightStyles,scrolledObject2);
myMapApp.scrollbars["sb2vert"] = new scrollbar("sb2vert","scrollbars2",950.5,350.5,10,199,scrolledObject2.maxY,scrolledObject2.minY,0.2903,0,0.02,"bottom_bottom",scrollbarStyles,scrollerStyles,triangleStyles,highlightStyles,scrolledObject2);
//create buttons
myMapApp.buttons["showHideButton2"] = new button("showHideButton2","buttons",scrolledObject2,"rect","Hide Scrollbar",undefined,50,580,110,20,buttonTextStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,1);
myMapApp.buttons["removeButton2"] = new button("removeButton2","buttons",scrolledObject2,"rect","Remove Scrollbar",undefined,170,580,110,20,buttonTextStyles,buttonStyles,shadeLightStyles,shadeDarkStyles,1);
}
//this object controls the panning and scrolling of the svg elements (panoramas)
function scrolledObject(contentId,maxX,minX,maxY,minY,sbXId,sbYId) {
this.content = document.getElementById(contentId);
this.transX = 0;
this.transY = 0;
this.maxX = maxX;
this.minX = minX;
this.maxY = maxY;
this.minY = minY;
this.sbXId = sbXId;
this.sbYId = sbYId;
this.panActive = false;
this.parent = this.content.parentNode;
}
scrolledObject.prototype.scrollbarChanged = function(id,changeType,valueAbs,valuePerc) {
if (changeType == "scrollChange" || "scrolledStep") {
if (id.match(/horiz/gi)) {
this.transX = valueAbs;
}
if (id.match(/vert/gi)) {
this.transY = valueAbs;
}
this.content.setAttributeNS(null,"transform","translate("+this.transX+","+this.transY+")");
}
}
scrolledObject.prototype.handleEvent = function(evt) {
if (evt.type == "mousedown") {
this.coords = myMapApp.calcCoord(evt,this.parent);
this.panActive = true;
}
if (evt.type == "mousemove" && this.panActive) {
var coords = myMapApp.calcCoord(evt,this.parent);
this.transX += coords.x - this.coords.x;
this.transY += coords.y - this.coords.y;
if (this.transX < this.minX) {
this.transX = this.minX;
}
if (this.transX > this.maxX) {
this.transX = this.maxX;
}
if (this.transY < this.minY) {
this.transY = this.minY;
}
if (this.transY > this.maxY) {
this.transY = this.maxY;
}
this.content.setAttributeNS(null,"transform","translate("+this.transX+","+this.transY+")");
//set scrollbars
if (myMapApp.scrollbars[this.sbXId]) {
myMapApp.scrollbars[this.sbXId].scrollToValue(this.transX);
}
if (myMapApp.scrollbars[this.sbYId]) {
myMapApp.scrollbars[this.sbYId].scrollToValue(this.transY);
}
this.coords = coords;
}
if (evt.type == "mouseup" || evt.type == "mouseout") {
this.panActive = false;
}
}
scrolledObject.prototype.buttonPressed = function(id,evt,buttonText) {
if (id.match(/removeButton/)) {
myMapApp.scrollbars[this.sbXId].remove();
myMapApp.scrollbars[this.sbXId] = undefined;
myMapApp.scrollbars[this.sbYId].remove();
myMapApp.scrollbars[this.sbYId] = undefined;
myMapApp.buttons[id].deactivate();
//get id number
var sbId = id.substr(id.length-1);
myMapApp.buttons["showHideButton"+sbId].deactivate();
}
else {
if (buttonText == "Hide Scrollbar") {
myMapApp.buttons[id].setTextValue("Show Scrollbar");
myMapApp.scrollbars[this.sbXId].hide();
myMapApp.scrollbars[this.sbYId].hide();
}
else {
myMapApp.buttons[id].setTextValue("Hide Scrollbar");
myMapApp.scrollbars[this.sbXId].show();
myMapApp.scrollbars[this.sbYId].show();
}
}
}
]]>
</script>
<rect id="bgRect" x="-1000" y="-1000" width="5000" height="5000" pointer-events="fill" fill="none" stroke="none" />
<text x="50" y="30" font-weight="bold" font-size="20" font-family="Arial,Helvetica">Demonstration of the SVG Scrollbar</text>
<text font-size="15" font-family="Arial,Helvetica" text-anchor="end" x="950" y="30">One can also drag the images and the scrollbars will adopt.</text>
<svg id="svg1" x="50" y="50" width="900" height="200" viewBox="0 0 900 200">
<g id="content1" cursor="move" batik:static="true" onmousedown="scrolledObject1.handleEvent(evt)" onmousemove="scrolledObject1.handleEvent(evt)" onmouseup="scrolledObject1.handleEvent(evt)" onmouseout="scrolledObject1.handleEvent(evt)">
<image id="image1" x="0" y="0" width="3607" height="420.5" xlink:href="images/zervreilasee_vals_panorama_low_res.jpg" />
<g id="labeling" pointer-events="none" font-size="15" font-family="Arial,Helvetica" fill="white">
<text text-anchor="middle" x="456" y="88.8">Furggeltihorn</text>
<text text-anchor="middle" x="593.8" y="98.8">P 2821</text>
<text text-anchor="middle" x="635" y="79.8">Zervreilahorn</text>
<text text-anchor="middle" x="805" y="112.8">Plattenberg</text>
<text text-anchor="middle" x="2220.9" y="178.8">Piz Fess</text>
<text text-anchor="middle" x="2291.4" y="162.6">Crap Grisch</text>
<text text-anchor="middle" x="2412.7" y="149.6">Piz Tomül</text>
<text text-anchor="middle" x="1762.6" y="112.6" fill="black">Fruntalp</text>
<text text-anchor="middle" x="1003.8" y="386.5" fill="black">Zervreilasee</text>
</g>
</g>
</svg>
<g id="scrollbars1" />
<text font-size="12" font-family="Arial,Helvetica" text-anchor="end" x="950" y="280">Panorama Zervreilastausee, Vals, Graubünden, Switzerland, taken 2006-02-04 (© A. Neumann)</text>
<svg id="svg2" x="50" y="350" width="900" height="200" viewBox="0 0 900 200">
<g id="content2" cursor="move" batik:static="true" onmousedown="scrolledObject2.handleEvent(evt)" onmousemove="scrolledObject2.handleEvent(evt)" onmouseup="scrolledObject2.handleEvent(evt)" onmouseout="scrolledObject2.handleEvent(evt)">
<image id="image2" x="0" y="0" width="3560.75" height="689" xlink:href="images/chalchtrittli_tierfed_panorama_low_res.jpg" />
</g>
</svg>
<g id="scrollbars2" />
<text font-size="12" font-family="Arial,Helvetica" text-anchor="end" x="950" y="575">Panorama Chalchtrittli, Tierfed, Linthal, Glarus, Switzerland, taken 2005-09-03 (© A. Neumann)</text>
<g id="buttons" />
</svg>