]> git.openstreetmap.org Git - rails.git/blobdiff - public/lib/OpenLayers/Popup/Anchored.js
openlayers madness
[rails.git] / public / lib / OpenLayers / Popup / Anchored.js
diff --git a/public/lib/OpenLayers/Popup/Anchored.js b/public/lib/OpenLayers/Popup/Anchored.js
new file mode 100644 (file)
index 0000000..90db912
--- /dev/null
@@ -0,0 +1,125 @@
+/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
+ * text of the license. */
+// @require: OpenLayers/Popup.js\r
+\r
+/**\r
+* @class\r
+*/\r
+OpenLayers.Popup.Anchored = Class.create();\r
+OpenLayers.Popup.Anchored.prototype =\r
+   Object.extend( new OpenLayers.Popup(), {\r
+\r
+    /** "lr", "ll", "tr", "tl" - relative position of the popup.\r
+     * @type String */\r
+    relativePosition: null,\r
+\r
+    /** Object which must have expose a 'size' (OpenLayers.Size) and \r
+     *                                 'offset' (OpenLayers.Pixel) \r
+     * @type Object */\r
+    anchor: null,\r
+\r
+    /** \r
+    * @constructor\r
+    * \r
+    * @param {String} id\r
+    * @param {OpenLayers.LonLat} lonlat\r
+    * @param {OpenLayers.Size} size\r
+    * @param {String} contentHTML\r
+    * @param {Object} anchor  Object which must expose a \r
+    *                         - 'size' (OpenLayers.Size) and \r
+    *                         - 'offset' (OpenLayers.Pixel) \r
+    *                         (this is generally an OpenLayers.Icon)\r
+    */\r
+    initialize:function(id, lonlat, size, contentHTML, anchor) {\r
+        var newArguments = new Array(id, lonlat, size, contentHTML);\r
+        OpenLayers.Popup.prototype.initialize.apply(this, newArguments);\r
+\r
+        this.anchor = (anchor != null) ? anchor \r
+                                       : { size: new OpenLayers.Size(0,0),\r
+                                           offset: new OpenLayers.Pixel(0,0)};\r
+    },\r
+\r
+    /** \r
+    * @param {OpenLayers.Pixel} px\r
+    * \r
+    * @returns Reference to a div that contains the drawn popup\r
+    * @type DOMElement\r
+    */\r
+    draw: function(px) {\r
+        if (px == null) {\r
+            if ((this.lonlat != null) && (this.map != null)) {\r
+                px = this.map.getLayerPxFromLonLat(this.lonlat);\r
+            }\r
+        }\r
+        \r
+        //calculate relative position\r
+        this.relativePosition = this.calculateRelativePosition(px);\r
+        \r
+        return OpenLayers.Popup.prototype.draw.apply(this, arguments);\r
+    },\r
+    \r
+    /** \r
+     * @private\r
+     * \r
+     * @param {OpenLayers.Pixel} px\r
+     * \r
+     * @returns The relative position ("br" "tr" "tl "bl") at which the popup\r
+     *           should be placed\r
+     * @type String\r
+     */\r
+    calculateRelativePosition:function(px) {\r
+        var lonlat = this.map.getLonLatFromLayerPx(px);        \r
+        \r
+        var extent = this.map.getExtent();\r
+        var quadrant = extent.determineQuadrant(lonlat);\r
+        \r
+        return OpenLayers.Bounds.oppositeQuadrant(quadrant);\r
+    }, \r
+\r
+    /**\r
+    * @param {OpenLayers.Pixel} px\r
+    */\r
+    moveTo: function(px) {\r
+        \r
+        var newPx = this.calculateNewPx(px);\r
+        \r
+        var newArguments = new Array(newPx);        \r
+        OpenLayers.Popup.prototype.moveTo.apply(this, newArguments);\r
+    },\r
+    \r
+    /**\r
+    * @param {OpenLayers.Size} size\r
+    */\r
+    setSize:function(size) { \r
+        OpenLayers.Popup.prototype.setSize.apply(this, arguments);\r
+\r
+        if ((this.lonlat) && (this.map)) {\r
+            var px = this.map.getLayerPxFromLonLat(this.lonlat);\r
+            this.moveTo(px);\r
+        }\r
+    },  \r
+    \r
+    /** \r
+     * @private \r
+     * \r
+     * @param {OpenLayers.Pixel} px\r
+     * \r
+     * @returns The the new px position of the popup on the screen\r
+     *           relative to the passed-in px\r
+     * @type OpenLayers.Pixel\r
+     */\r
+    calculateNewPx:function(px) {\r
+        var newPx = px.offset(this.anchor.offset);\r
+\r
+        var top = (this.relativePosition.charAt(0) == 't');\r
+        newPx.y += (top) ? -this.size.h : this.anchor.size.h;\r
+        \r
+        var left = (this.relativePosition.charAt(1) == 'l');\r
+        newPx.x += (left) ? -this.size.w : this.anchor.size.w;\r
+\r
+        return newPx;   \r
+    },\r
+\r
+    CLASS_NAME: "OpenLayers.Popup.Anchored"\r
+});\r