X-Git-Url: https://dev.renevier.net/gitweb.cgi?p=syp.git;a=blobdiff_plain;f=js%2Fsyp.js;h=ddd47c9a084fda07ae6784d4662fdde0788736de;hp=40735c791cbb516ea273c0fe40a0e85d58ecb28b;hb=c69464951ab0f02221360e6cfb7765935c75109a;hpb=3b38ca36fc18d34999073625a9c66dc2f05747a3 diff --git a/js/syp.js b/js/syp.js index 40735c7..ddd47c9 100644 --- a/js/syp.js +++ b/js/syp.js @@ -111,8 +111,8 @@ var SYP = { } var map = this.map; - if (map.getControlsByClass("OpenLayers.Control.ArgParser")[0].lat - == undefined) { // map center was not set in ArgParser control. + if (map.getControlsByClass("OpenLayers.Control.ArgParser")[0].center + == null) { // map center was not set in ArgParser control. var orig = this.Utils.mbr (this.dataLayer); var centerBounds = new OpenLayers.Bounds(); @@ -184,10 +184,25 @@ var SYP = { var popup = feature.popup; var popupPos = null; - if (sypSettings.popupNearfeature) { - popupPos = feature.geometry.getBounds().getCenterLonLat(); - } else { - popupPos = SYP.Utils.brCorner(map, 8); + switch (sypSettings.popupPos) { + case 0: + popupPos = feature.geometry.getBounds().getCenterLonLat(); + break; + case 1: + popupPos = SYP.Utils.tlCorner(map, 8); + break; + case 2: + popupPos = SYP.Utils.trCorner(map, 8); + break; + case 3: + popupPos = SYP.Utils.brCorner(map, 8); + break; + case 4: + popupPos = SYP.Utils.blCorner(map, 8); + break; + default: + popupPos = SYP.Utils.brCorner(map, 8); + break; } // we cannot reuse popup; we need to recreate it in order for IE @@ -197,8 +212,9 @@ var SYP = { } var contentHTML; if (feature.cluster[0].attributes.name) { + // escaping name is necessary because it's not enclosed in another html tag. contentHTML = "

" + - feature.cluster[0].attributes.name + + SYP.Utils.escapeHTML(feature.cluster[0].attributes.name) + "

" + feature.cluster[0].attributes.description; } else { @@ -226,11 +242,12 @@ var SYP = { }, showBigImage: function (href) { - try { - document.getElementById('bigimg_container').style.display = "table"; - } catch(e) { + if (OpenLayers.Util.getBrowserName() == "msie") { document.getElementById('bigimg_container').style.display = "block"; + } else { + document.getElementById('bigimg_container').style.display = "table"; } + var maxHeight = document.body.clientHeight * 0.9; var maxWidth = document.body.clientWidth * 0.9; document.getElementById('bigimg').style.height = ""; @@ -238,10 +255,6 @@ var SYP = { document.getElementById('bigimg').style.maxHeight = maxHeight + "px"; document.getElementById('bigimg').style.maxWidth = maxWidth + "px"; document.getElementById('bigimg').onload = function () { - var icon = document.getElementById('bigimg_close'); - icon.style.top = this.offsetTop; - icon.style.left = this.offsetLeft + this.clientWidth - icon.clientWidth; - var heightRatio = this.clientHeight / parseInt(this.style.maxHeight); var widthRatio = this.clientWidth / parseInt(this.style.maxWidth); if (heightRatio > 1 || widthRatio > 1) { @@ -252,6 +265,10 @@ var SYP = { } } + var icon = document.getElementById('bigimg_close'); + icon.style.top = this.offsetTop; + icon.style.left = this.offsetLeft + this.clientWidth - icon.clientWidth; + }; document.getElementById('bigimg').src = href; }, @@ -263,13 +280,36 @@ var SYP = { }, Utils: { + tlCorner: function(map, margin) { + var bounds = map.calculateBounds(); + var corner = new OpenLayers.LonLat(bounds.left, bounds.top); + var cornerAsPx = map.getPixelFromLonLat(corner); + cornerAsPx = cornerAsPx.add( +margin, +margin); + return map.getLonLatFromPixel(cornerAsPx); + }, + + trCorner: function(map, margin) { + var bounds = map.calculateBounds(); + var corner = new OpenLayers.LonLat(bounds.right, bounds.top); + var cornerAsPx = map.getPixelFromLonLat(corner); + cornerAsPx = cornerAsPx.add( -margin, +margin); + return map.getLonLatFromPixel(cornerAsPx); + }, + brCorner: function(map, margin) { var bounds = map.calculateBounds(); var corner = new OpenLayers.LonLat(bounds.right, bounds.bottom); var cornerAsPx = map.getPixelFromLonLat(corner); cornerAsPx = cornerAsPx.add( -margin, -margin); - corner = map.getLonLatFromPixel(cornerAsPx); - return corner; + return map.getLonLatFromPixel(cornerAsPx); + }, + + blCorner: function(map, margin) { + var bounds = map.calculateBounds(); + var corner = new OpenLayers.LonLat(bounds.left, bounds.bottom); + var cornerAsPx = map.getPixelFromLonLat(corner); + cornerAsPx = cornerAsPx.add( +margin, -margin); + return map.getLonLatFromPixel(cornerAsPx); }, /* minimum bounds rectangle containing all feature locations. @@ -345,6 +385,18 @@ var SYP = { } div.style.display = "block"; div.appendChild(textNode); + }, + + escapeHTML: function (str) { + if (!str) { + return ""; + } + return str. + replace(/&/gm, '&'). + replace(/'/gm, '''). + replace(/"/gm, '"'). + replace(/>/gm, '>'). + replace(/" + + this.contentDiv.innerHTML + + ""; + + var containerElement = (this.map) ? this.map.layerContainerDiv + : document.body; + var realSize = OpenLayers.Util.getRenderedDimensions( + preparedHTML, null, { + displayClass: this.displayClass, + containerElement: containerElement + } + ); + + /* + * XXX: next four lines are added by SYP! + */ + if (this.contentDiv) { + realSize.w = Math.max (realSize.w, this.contentDiv.scrollWidth); + realSize.h = Math.max (realSize.h, this.contentDiv.scrollHeight); + } + + // is the "real" size of the div is safe to display in our map? + var safeSize = this.getSafeContentSize(realSize); + + var newSize = null; + if (safeSize.equals(realSize)) { + //real size of content is small enough to fit on the map, + // so we use real size. + newSize = realSize; + + } else { + + //make a new OL.Size object with the clipped dimensions + // set or null if not clipped. + var fixedSize = new OpenLayers.Size(); + fixedSize.w = (safeSize.w < realSize.w) ? safeSize.w : null; + fixedSize.h = (safeSize.h < realSize.h) ? safeSize.h : null; + + if (fixedSize.w && fixedSize.h) { + //content is too big in both directions, so we will use + // max popup size (safeSize), knowing well that it will + // overflow both ways. + newSize = safeSize; + } else { + //content is clipped in only one direction, so we need to + // run getRenderedDimensions() again with a fixed dimension + var clippedSize = OpenLayers.Util.getRenderedDimensions( + preparedHTML, fixedSize, { + displayClass: this.contentDisplayClass, + containerElement: containerElement + } + ); + + //if the clipped size is still the same as the safeSize, + // that means that our content must be fixed in the + // offending direction. If overflow is 'auto', this means + // we are going to have a scrollbar for sure, so we must + // adjust for that. + // + var currentOverflow = OpenLayers.Element.getStyle( + this.contentDiv, "overflow" + ); + if ( (currentOverflow != "hidden") && + (clippedSize.equals(safeSize)) ) { + var scrollBar = OpenLayers.Util.getScrollbarWidth(); + if (fixedSize.w) { + clippedSize.h += scrollBar; + } else { + clippedSize.w += scrollBar; + } + } + + newSize = this.getSafeContentSize(clippedSize); + } + } + this.setSize(newSize); }