',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
\ No newline at end of file
diff --git a/htdocs/js/lib/google-map/keydragzoom.js b/htdocs/js/lib/google-map/keydragzoom.js
new file mode 100644
index 00000000..7bc03086
--- /dev/null
+++ b/htdocs/js/lib/google-map/keydragzoom.js
@@ -0,0 +1,856 @@
+/**
+ * @name KeyDragZoom for V3
+ * @version 2.0.5 [December 8, 2010]
+ * @author: Nianwei Liu [nianwei at gmail dot com] & Gary Little [gary at luxcentral dot com]
+ * @fileoverview This library adds a drag zoom capability to a V3 Google map.
+ * When drag zoom is enabled, holding down a designated hot key (shift | ctrl | alt)
+ * while dragging a box around an area of interest will zoom the map in to that area when
+ * the mouse button is released. Optionally, a visual control can also be supplied for turning
+ * a drag zoom operation on and off.
+ * Only one line of code is needed: google.maps.Map.enableKeyDragZoom();
+ *
+ * NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3 since, unlike with V2,
+ * it causes a context menu to appear when running on the Macintosh.
+ *
+ * Note that if the map's container has a border around it, the border widths must be specified
+ * in pixel units (or as thin, medium, or thick). This is required because of an MSIE limitation.
+ *
NL: 2009-05-28: initial port to core API V3.
+ * NL: 2009-11-02: added a temp fix for -moz-transform for FF3.5.x using code from Paul Kulchenko (http://notebook.kulchenko.com/maps/gridmove).
+ * NL: 2010-02-02: added a fix for IE flickering on divs onmousemove, caused by scroll value when get mouse position.
+ * GL: 2010-06-15: added a visual control option.
+ */
+/*!
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function () {
+ /*jslint browser:true */
+ /*global window,google */
+ /* Utility functions use "var funName=function()" syntax to allow use of the */
+ /* Dean Edwards Packer compression tool (with Shrink variables, without Base62 encode). */
+
+ /**
+ * Converts "thin", "medium", and "thick" to pixel widths
+ * in an MSIE environment. Not called for other browsers
+ * because getComputedStyle() returns pixel widths automatically.
+ * @param {string} widthValue The value of the border width parameter.
+ */
+ var toPixels = function (widthValue) {
+ var px;
+ switch (widthValue) {
+ case "thin":
+ px = "2px";
+ break;
+ case "medium":
+ px = "4px";
+ break;
+ case "thick":
+ px = "6px";
+ break;
+ default:
+ px = widthValue;
+ }
+ return px;
+ };
+ /**
+ * Get the widths of the borders of an HTML element.
+ *
+ * @param {Node} h The HTML element.
+ * @return {Object} The width object {top, bottom left, right}.
+ */
+ var getBorderWidths = function (h) {
+ var computedStyle;
+ var bw = {};
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ computedStyle = h.ownerDocument.defaultView.getComputedStyle(h, "");
+ if (computedStyle) {
+ // The computed styles are always in pixel units (good!)
+ bw.top = parseInt(computedStyle.borderTopWidth, 10) || 0;
+ bw.bottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
+ bw.left = parseInt(computedStyle.borderLeftWidth, 10) || 0;
+ bw.right = parseInt(computedStyle.borderRightWidth, 10) || 0;
+ return bw;
+ }
+ } else if (document.documentElement.currentStyle) { // MSIE
+ if (h.currentStyle) {
+ // The current styles may not be in pixel units so try to convert (bad!)
+ bw.top = parseInt(toPixels(h.currentStyle.borderTopWidth), 10) || 0;
+ bw.bottom = parseInt(toPixels(h.currentStyle.borderBottomWidth), 10) || 0;
+ bw.left = parseInt(toPixels(h.currentStyle.borderLeftWidth), 10) || 0;
+ bw.right = parseInt(toPixels(h.currentStyle.borderRightWidth), 10) || 0;
+ return bw;
+ }
+ }
+ // Shouldn't get this far for any modern browser
+ bw.top = parseInt(h.style["border-top-width"], 10) || 0;
+ bw.bottom = parseInt(h.style["border-bottom-width"], 10) || 0;
+ bw.left = parseInt(h.style["border-left-width"], 10) || 0;
+ bw.right = parseInt(h.style["border-right-width"], 10) || 0;
+ return bw;
+ };
+
+ // Page scroll values for use by getMousePosition. To prevent flickering on MSIE
+ // they are calculated only when the document actually scrolls, not every time the
+ // mouse moves (as they would be if they were calculated inside getMousePosition).
+ var scroll = {
+ x: 0,
+ y: 0
+ };
+ var getScrollValue = function (e) {
+ scroll.x = (typeof document.documentElement.scrollLeft !== "undefined" ? document.documentElement.scrollLeft : document.body.scrollLeft);
+ scroll.y = (typeof document.documentElement.scrollTop !== "undefined" ? document.documentElement.scrollTop : document.body.scrollTop);
+ };
+ getScrollValue();
+
+ /**
+ * Get the position of the mouse relative to the document.
+ * @param {Event} e The mouse event.
+ * @return {Object} The position object {left, top}.
+ */
+ var getMousePosition = function (e) {
+ var posX = 0, posY = 0;
+ e = e || window.event;
+ if (typeof e.pageX !== "undefined") {
+ posX = e.pageX;
+ posY = e.pageY;
+ } else if (typeof e.clientX !== "undefined") { // MSIE
+ posX = e.clientX + scroll.x;
+ posY = e.clientY + scroll.y;
+ }
+ return {
+ left: posX,
+ top: posY
+ };
+ };
+ /**
+ * Get the position of an HTML element relative to the document.
+ * @param {Node} h The HTML element.
+ * @return {Object} The position object {left, top}.
+ */
+ var getElementPosition = function (h) {
+ var posX = h.offsetLeft;
+ var posY = h.offsetTop;
+ var parent = h.offsetParent;
+ // Add offsets for all ancestors in the hierarchy
+ while (parent !== null) {
+ // Adjust for scrolling elements which may affect the map position.
+ //
+ // See http://www.howtocreate.co.uk/tutorials/javascript/browserspecific
+ //
+ // "...make sure that every element [on a Web page] with an overflow
+ // of anything other than visible also has a position style set to
+ // something other than the default static..."
+ if (parent !== document.body && parent !== document.documentElement) {
+ posX -= parent.scrollLeft;
+ posY -= parent.scrollTop;
+ }
+ // See http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/4cb86c0c1037a5e5
+ // Example: http://notebook.kulchenko.com/maps/gridmove
+ var m = parent;
+ // This is the "normal" way to get offset information:
+ var moffx = m.offsetLeft;
+ var moffy = m.offsetTop;
+ // This covers those cases where a transform is used:
+ if (!moffx && !moffy && window.getComputedStyle) {
+ var matrix = document.defaultView.getComputedStyle(m, null).MozTransform ||
+ document.defaultView.getComputedStyle(m, null).WebkitTransform;
+ if (matrix) {
+ if (typeof matrix === "string") {
+ var parms = matrix.split(",");
+ moffx += parseInt(parms[4], 10) || 0;
+ moffy += parseInt(parms[5], 10) || 0;
+ }
+ }
+ }
+ posX += moffx;
+ posY += moffy;
+ parent = parent.offsetParent;
+ }
+ return {
+ left: posX,
+ top: posY
+ };
+ };
+ /**
+ * Set the properties of an object to those from another object.
+ * @param {Object} obj The target object.
+ * @param {Object} vals The source object.
+ */
+ var setVals = function (obj, vals) {
+ if (obj && vals) {
+ for (var x in vals) {
+ if (vals.hasOwnProperty(x)) {
+ obj[x] = vals[x];
+ }
+ }
+ }
+ return obj;
+ };
+ /**
+ * Set the opacity. If op is not passed in, this function just performs an MSIE fix.
+ * @param {Node} h The HTML element.
+ * @param {number} op The opacity value (0-1).
+ */
+ var setOpacity = function (h, op) {
+ if (typeof op !== "undefined") {
+ h.style.opacity = op;
+ }
+ if (typeof h.style.opacity !== "undefined" && h.style.opacity !== "") {
+ h.style.filter = "alpha(opacity=" + (h.style.opacity * 100) + ")";
+ }
+ };
+ /**
+ * @name KeyDragZoomOptions
+ * @class This class represents the optional parameter passed into google.maps.Map.enableKeyDragZoom.
+ * @property {string} [key] The hot key to hold down to activate a drag zoom, shift | ctrl | alt.
+ * The default is shift. NOTE: Do not use Ctrl as the hot key with Google Maps JavaScript API V3
+ * since, unlike with V2, it causes a context menu to appear when running on the Macintosh. Also note that the
+ * alt hot key refers to the Option key on a Macintosh.
+ * @property {Object} [boxStyle] An object literal defining the css styles of the zoom box.
+ * The default is {border: "4px solid #736AFF"}.
+ * Border widths must be specified in pixel units (or as thin, medium, or thick).
+ * @property {Object} [veilStyle] An object literal defining the css styles of the veil pane
+ * which covers the map when a drag zoom is activated. The previous name for this property was
+ * paneStyle but the use of this name is now deprecated.
+ * The default is {backgroundColor: "gray", opacity: 0.25, cursor: "crosshair"}.
+ * @property {boolean} [visualEnabled] A flag indicating whether a visual control is to be used.
+ * The default is false.
+ * @property {string} [visualClass] The name of the CSS class defining the styles for the visual
+ * control. To prevent the visual control from being printed, set this property to the name of
+ * a class, defined inside a @media print rule, which sets the CSS
+ * display style to none.
+ * @property {ControlPosition} [visualPosition] The position of the visual control.
+ * The default position is on the left side of the map below other controls in the top left
+ * — i.e., a position of google.maps.ControlPosition.LEFT_TOP.
+ * @property {Size} [visualPositionOffset] The width and height values provided by this
+ * property are the offsets (in pixels) from the location at which the control would normally
+ * be drawn to the desired drawing location. The default is (35,0).
+ * @property {number} [visualPositionIndex] The index of the visual control.
+ * The index is for controlling the placement of the control relative to other controls at the
+ * position given by visualPosition; controls with a lower index are placed first.
+ * Use a negative value to place the control before any default controls. No index is
+ * generally required; the default is null.
+ * @property {String} [visualSprite] The URL of the sprite image used for showing the visual control
+ * in the on, off, and hot (i.e., when the mouse is over the control) states. The three images
+ * within the sprite must be the same size and arranged in on-hot-off order in a single row
+ * with no spaces between images.
+ * The default is http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png.
+ * @property {Size} [visualSize] The width and height values provided by this property are
+ * the size (in pixels) of each of the images within visualSprite.
+ * The default is (20,20).
+ * @property {Object} [visualTips] An object literal defining the help tips that appear when
+ * the mouse moves over the visual control. The off property is the tip to be shown
+ * when the control is off and the on property is the tip to be shown when the
+ * control is on.
+ * The default values are "Turn on drag zoom mode" and "Turn off drag zoom mode", respectively.
+ */
+ /**
+ * @name DragZoom
+ * @class This class represents a drag zoom object for a map. The object is activated by holding down the hot key
+ * or by turning on the visual control.
+ * This object is created when google.maps.Map.enableKeyDragZoom is called; it cannot be created directly.
+ * Use google.maps.Map.getDragZoomObject to gain access to this object in order to attach event listeners.
+ * @param {Map} map The map to which the DragZoom object is to be attached.
+ * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters.
+ */
+ function DragZoom(map, opt_zoomOpts) {
+ var me = this;
+ var ov = new google.maps.OverlayView();
+ ov.onAdd = function () {
+ me.init_(map, opt_zoomOpts);
+ };
+ ov.draw = function () {
+ };
+ ov.onRemove = function () {
+ };
+ ov.setMap(map);
+ this.prjov_ = ov;
+ }
+ /**
+ * Initialize the tool.
+ * @param {Map} map The map to which the DragZoom object is to be attached.
+ * @param {KeyDragZoomOptions} [opt_zoomOpts] The optional parameters.
+ */
+ DragZoom.prototype.init_ = function (map, opt_zoomOpts) {
+ var i;
+ var me = this;
+ this.map_ = map;
+ opt_zoomOpts = opt_zoomOpts || {};
+ this.key_ = opt_zoomOpts.key || "shift";
+ this.key_ = this.key_.toLowerCase();
+ this.borderWidths_ = getBorderWidths(this.map_.getDiv());
+ this.veilDiv_ = [];
+ for (i = 0; i < 4; i++) {
+ this.veilDiv_[i] = document.createElement("div");
+ // Prevents selection of other elements on the webpage
+ // when a drag zoom operation is in progress:
+ this.veilDiv_[i].onselectstart = function () {
+ return false;
+ };
+ // Apply default style values for the veil:
+ setVals(this.veilDiv_[i].style, {
+ backgroundColor: "gray",
+ opacity: 0.25,
+ cursor: "crosshair"
+ });
+ // Apply style values specified in veilStyle parameter:
+ setVals(this.veilDiv_[i].style, opt_zoomOpts.paneStyle); // Old option name was "paneStyle"
+ setVals(this.veilDiv_[i].style, opt_zoomOpts.veilStyle); // New name is "veilStyle"
+ // Apply mandatory style values:
+ setVals(this.veilDiv_[i].style, {
+ position: "absolute",
+ overflow: "hidden",
+ display: "none"
+ });
+ // Workaround for Firefox Shift-Click problem:
+ if (this.key_ === "shift") {
+ this.veilDiv_[i].style.MozUserSelect = "none";
+ }
+ setOpacity(this.veilDiv_[i]);
+ // An IE fix: If the background is transparent it cannot capture mousedown
+ // events, so if it is, change the background to white with 0 opacity.
+ if (this.veilDiv_[i].style.backgroundColor === "transparent") {
+ this.veilDiv_[i].style.backgroundColor = "white";
+ setOpacity(this.veilDiv_[i], 0);
+ }
+ this.map_.getDiv().appendChild(this.veilDiv_[i]);
+ }
+
+ this.visualEnabled_ = opt_zoomOpts.visualEnabled || false;
+ this.visualClass_ = opt_zoomOpts.visualClass || "";
+ this.visualPosition_ = opt_zoomOpts.visualPosition || google.maps.ControlPosition.LEFT_TOP;
+ this.visualPositionOffset_ = opt_zoomOpts.visualPositionOffset || new google.maps.Size(35, 0);
+ this.visualPositionIndex_ = opt_zoomOpts.visualPositionIndex || null;
+ this.visualSprite_ = opt_zoomOpts.visualSprite || "http://maps.gstatic.com/mapfiles/ftr/controls/dragzoom_btn.png";
+ this.visualSize_ = opt_zoomOpts.visualSize || new google.maps.Size(20, 20);
+ this.visualTips_ = opt_zoomOpts.visualTips || {};
+ this.visualTips_.off = this.visualTips_.off || "Turn on drag zoom mode";
+ this.visualTips_.on = this.visualTips_.on || "Turn off drag zoom mode";
+
+ this.boxDiv_ = document.createElement("div");
+ // Apply default style values for the zoom box:
+ setVals(this.boxDiv_.style, {
+ border: "4px solid #736AFF"
+ });
+ // Apply style values specified in boxStyle parameter:
+ setVals(this.boxDiv_.style, opt_zoomOpts.boxStyle);
+ // Apply mandatory style values:
+ setVals(this.boxDiv_.style, {
+ position: "absolute",
+ display: "none"
+ });
+ setOpacity(this.boxDiv_);
+ this.map_.getDiv().appendChild(this.boxDiv_);
+ this.boxBorderWidths_ = getBorderWidths(this.boxDiv_);
+
+ this.listeners_ = [
+ google.maps.event.addDomListener(document, "keydown", function (e) {
+ me.onKeyDown_(e);
+ }),
+ google.maps.event.addDomListener(document, "keyup", function (e) {
+ me.onKeyUp_(e);
+ }),
+ google.maps.event.addDomListener(this.veilDiv_[0], "mousedown", function (e) {
+ me.onMouseDown_(e);
+ }),
+ google.maps.event.addDomListener(this.veilDiv_[1], "mousedown", function (e) {
+ me.onMouseDown_(e);
+ }),
+ google.maps.event.addDomListener(this.veilDiv_[2], "mousedown", function (e) {
+ me.onMouseDown_(e);
+ }),
+ google.maps.event.addDomListener(this.veilDiv_[3], "mousedown", function (e) {
+ me.onMouseDown_(e);
+ }),
+ google.maps.event.addDomListener(document, "mousedown", function (e) {
+ me.onMouseDownDocument_(e);
+ }),
+ google.maps.event.addDomListener(document, "mousemove", function (e) {
+ me.onMouseMove_(e);
+ }),
+ google.maps.event.addDomListener(document, "mouseup", function (e) {
+ me.onMouseUp_(e);
+ }),
+ google.maps.event.addDomListener(window, "scroll", getScrollValue)
+ ];
+
+ this.hotKeyDown_ = false;
+ this.mouseDown_ = false;
+ this.dragging_ = false;
+ this.startPt_ = null;
+ this.endPt_ = null;
+ this.mapWidth_ = null;
+ this.mapHeight_ = null;
+ this.mousePosn_ = null;
+ this.mapPosn_ = null;
+
+ if (this.visualEnabled_) {
+ this.buttonDiv_ = this.initControl_(this.visualPositionOffset_);
+ if (this.visualPositionIndex_ !== null) {
+ this.buttonDiv_.index = this.visualPositionIndex_;
+ }
+ this.map_.controls[this.visualPosition_].push(this.buttonDiv_);
+ this.controlIndex_ = this.map_.controls[this.visualPosition_].length - 1;
+ }
+ };
+ /**
+ * Initializes the visual control and returns its DOM element.
+ * @param {Size} offset The offset of the control from its normal position.
+ * @return {Node} The DOM element containing the visual control.
+ */
+ DragZoom.prototype.initControl_ = function (offset) {
+ var control;
+ var image;
+ var me = this;
+
+ control = document.createElement("div");
+ control.className = this.visualClass_;
+ control.style.position = "relative";
+ control.style.overflow = "hidden";
+ control.style.height = this.visualSize_.height + "px";
+ control.style.width = this.visualSize_.width + "px";
+ control.title = this.visualTips_.off;
+ image = document.createElement("img");
+ image.src = this.visualSprite_;
+ image.style.position = "absolute";
+ image.style.left = -(this.visualSize_.width * 2) + "px";
+ image.style.top = 0 + "px";
+ control.appendChild(image);
+ control.onclick = function (e) {
+ me.hotKeyDown_ = !me.hotKeyDown_;
+ if (me.hotKeyDown_) {
+ me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + "px";
+ me.buttonDiv_.title = me.visualTips_.on;
+ me.activatedByControl_ = true;
+ google.maps.event.trigger(me, "activate");
+ } else {
+ me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + "px";
+ me.buttonDiv_.title = me.visualTips_.off;
+ google.maps.event.trigger(me, "deactivate");
+ }
+ me.onMouseMove_(e); // Updates the veil
+ };
+ control.onmouseover = function () {
+ me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 1) + "px";
+ };
+ control.onmouseout = function () {
+ if (me.hotKeyDown_) {
+ me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 0) + "px";
+ me.buttonDiv_.title = me.visualTips_.on;
+ } else {
+ me.buttonDiv_.firstChild.style.left = -(me.visualSize_.width * 2) + "px";
+ me.buttonDiv_.title = me.visualTips_.off;
+ }
+ };
+ control.ondragstart = function () {
+ return false;
+ };
+ setVals(control.style, {
+ cursor: "pointer",
+ marginTop: offset.height + "px",
+ marginLeft: offset.width + "px"
+ });
+ return control;
+ };
+ /**
+ * Returns true if the hot key is being pressed when an event occurs.
+ * @param {Event} e The keyboard event.
+ * @return {boolean} Flag indicating whether the hot key is down.
+ */
+ DragZoom.prototype.isHotKeyDown_ = function (e) {
+ var isHot;
+ e = e || window.event;
+ isHot = (e.shiftKey && this.key_ === "shift") || (e.altKey && this.key_ === "alt") || (e.ctrlKey && this.key_ === "ctrl");
+ if (!isHot) {
+ // Need to look at keyCode for Opera because it
+ // doesn't set the shiftKey, altKey, ctrlKey properties
+ // unless a non-modifier event is being reported.
+ //
+ // See http://cross-browser.com/x/examples/shift_mode.php
+ // Also see http://unixpapa.com/js/key.html
+ switch (e.keyCode) {
+ case 16:
+ if (this.key_ === "shift") {
+ isHot = true;
+ }
+ break;
+ case 17:
+ if (this.key_ === "ctrl") {
+ isHot = true;
+ }
+ break;
+ case 18:
+ if (this.key_ === "alt") {
+ isHot = true;
+ }
+ break;
+ }
+ }
+ return isHot;
+ };
+ /**
+ * Returns true if the mouse is on top of the map div.
+ * The position is captured in onMouseMove_.
+ * @return {boolean}
+ */
+ DragZoom.prototype.isMouseOnMap_ = function () {
+ var mousePosn = this.mousePosn_;
+ if (mousePosn) {
+ var mapPosn = this.mapPosn_;
+ var mapDiv = this.map_.getDiv();
+ return mousePosn.left > mapPosn.left && mousePosn.left < (mapPosn.left + mapDiv.offsetWidth) &&
+ mousePosn.top > mapPosn.top && mousePosn.top < (mapPosn.top + mapDiv.offsetHeight);
+ } else {
+ // if user never moved mouse
+ return false;
+ }
+ };
+ /**
+ * Show the veil if the hot key is down and the mouse is over the map,
+ * otherwise hide the veil.
+ */
+ DragZoom.prototype.setVeilVisibility_ = function () {
+ var i;
+ if (this.map_ && this.hotKeyDown_ && this.isMouseOnMap_()) {
+ var mapDiv = this.map_.getDiv();
+ this.mapWidth_ = mapDiv.offsetWidth - (this.borderWidths_.left + this.borderWidths_.right);
+ this.mapHeight_ = mapDiv.offsetHeight - (this.borderWidths_.top + this.borderWidths_.bottom);
+ if (this.activatedByControl_) { // Veil covers entire map (except control)
+ var left = parseInt(this.buttonDiv_.style.left, 10) + this.visualPositionOffset_.width;
+ var top = parseInt(this.buttonDiv_.style.top, 10) + this.visualPositionOffset_.height;
+ var width = this.visualSize_.width;
+ var height = this.visualSize_.height;
+ // Left veil rectangle:
+ this.veilDiv_[0].style.top = "0px";
+ this.veilDiv_[0].style.left = "0px";
+ this.veilDiv_[0].style.width = left + "px";
+ this.veilDiv_[0].style.height = this.mapHeight_ + "px";
+ // Right veil rectangle:
+ this.veilDiv_[1].style.top = "0px";
+ this.veilDiv_[1].style.left = (left + width) + "px";
+ this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + "px";
+ this.veilDiv_[1].style.height = this.mapHeight_ + "px";
+ // Top veil rectangle:
+ this.veilDiv_[2].style.top = "0px";
+ this.veilDiv_[2].style.left = left + "px";
+ this.veilDiv_[2].style.width = width + "px";
+ this.veilDiv_[2].style.height = top + "px";
+ // Bottom veil rectangle:
+ this.veilDiv_[3].style.top = (top + height) + "px";
+ this.veilDiv_[3].style.left = left + "px";
+ this.veilDiv_[3].style.width = width + "px";
+ this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + "px";
+ for (i = 0; i < this.veilDiv_.length; i++) {
+ this.veilDiv_[i].style.display = "block";
+ }
+ } else {
+ this.veilDiv_[0].style.left = "0px";
+ this.veilDiv_[0].style.top = "0px";
+ this.veilDiv_[0].style.width = this.mapWidth_ + "px";
+ this.veilDiv_[0].style.height = this.mapHeight_ + "px";
+ for (i = 1; i < this.veilDiv_.length; i++) {
+ this.veilDiv_[i].style.width = "0px";
+ this.veilDiv_[i].style.height = "0px";
+ }
+ for (i = 0; i < this.veilDiv_.length; i++) {
+ this.veilDiv_[i].style.display = "block";
+ }
+ }
+ } else {
+ for (i = 0; i < this.veilDiv_.length; i++) {
+ this.veilDiv_[i].style.display = "none";
+ }
+ }
+ };
+ /**
+ * Handle key down. Show the veil if the hot key has been pressed.
+ * @param {Event} e The keyboard event.
+ */
+ DragZoom.prototype.onKeyDown_ = function (e) {
+ if (this.map_ && !this.hotKeyDown_ && this.isHotKeyDown_(e)) {
+ this.mapPosn_ = getElementPosition(this.map_.getDiv());
+ this.hotKeyDown_ = true;
+ this.activatedByControl_ = false;
+ this.setVeilVisibility_();
+ /**
+ * This event is fired when the hot key is pressed.
+ * @name DragZoom#activate
+ * @event
+ */
+ google.maps.event.trigger(this, "activate");
+ }
+ if (this.visualEnabled_ && this.isHotKeyDown_(e)) {
+ this.buttonDiv_.style.display = "none";
+ }
+ };
+ /**
+ * Get the google.maps.Point of the mouse position.
+ * @param {Event} e The mouse event.
+ * @return {Point} The mouse position.
+ */
+ DragZoom.prototype.getMousePoint_ = function (e) {
+ var mousePosn = getMousePosition(e);
+ var p = new google.maps.Point();
+ p.x = mousePosn.left - this.mapPosn_.left - this.borderWidths_.left;
+ p.y = mousePosn.top - this.mapPosn_.top - this.borderWidths_.top;
+ p.x = Math.min(p.x, this.mapWidth_);
+ p.y = Math.min(p.y, this.mapHeight_);
+ p.x = Math.max(p.x, 0);
+ p.y = Math.max(p.y, 0);
+ return p;
+ };
+ /**
+ * Handle mouse down.
+ * @param {Event} e The mouse event.
+ */
+ DragZoom.prototype.onMouseDown_ = function (e) {
+ if (this.map_ && this.hotKeyDown_) {
+ this.mapPosn_ = getElementPosition(this.map_.getDiv());
+ this.dragging_ = true;
+ this.startPt_ = this.endPt_ = this.getMousePoint_(e);
+ this.boxDiv_.style.width = this.boxDiv_.style.height = "0px";
+ var prj = this.prjov_.getProjection();
+ var latlng = prj.fromContainerPixelToLatLng(this.startPt_);
+ if (this.visualEnabled_) {
+ this.buttonDiv_.style.display = "none";
+ }
+ /**
+ * This event is fired when the drag operation begins.
+ * The parameter passed is the geographic position of the starting point.
+ * @name DragZoom#dragstart
+ * @param {LatLng} latlng The geographic position of the starting point.
+ * @event
+ */
+ google.maps.event.trigger(this, "dragstart", latlng);
+ }
+ };
+ /**
+ * Handle mouse down at the document level.
+ * @param {Event} e The mouse event.
+ */
+ DragZoom.prototype.onMouseDownDocument_ = function (e) {
+ this.mouseDown_ = true;
+ };
+ /**
+ * Handle mouse move.
+ * @param {Event} e The mouse event.
+ */
+ DragZoom.prototype.onMouseMove_ = function (e) {
+ this.mousePosn_ = getMousePosition(e);
+ if (this.dragging_) {
+ this.endPt_ = this.getMousePoint_(e);
+ var left = Math.min(this.startPt_.x, this.endPt_.x);
+ var top = Math.min(this.startPt_.y, this.endPt_.y);
+ var width = Math.abs(this.startPt_.x - this.endPt_.x);
+ var height = Math.abs(this.startPt_.y - this.endPt_.y);
+ // For benefit of MSIE 7/8 ensure following values are not negative:
+ var boxWidth = Math.max(0, width - (this.boxBorderWidths_.left + this.boxBorderWidths_.right));
+ var boxHeight = Math.max(0, height - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom));
+ // Left veil rectangle:
+ this.veilDiv_[0].style.top = "0px";
+ this.veilDiv_[0].style.left = "0px";
+ this.veilDiv_[0].style.width = left + "px";
+ this.veilDiv_[0].style.height = this.mapHeight_ + "px";
+ // Right veil rectangle:
+ this.veilDiv_[1].style.top = "0px";
+ this.veilDiv_[1].style.left = (left + width) + "px";
+ this.veilDiv_[1].style.width = (this.mapWidth_ - (left + width)) + "px";
+ this.veilDiv_[1].style.height = this.mapHeight_ + "px";
+ // Top veil rectangle:
+ this.veilDiv_[2].style.top = "0px";
+ this.veilDiv_[2].style.left = left + "px";
+ this.veilDiv_[2].style.width = width + "px";
+ this.veilDiv_[2].style.height = top + "px";
+ // Bottom veil rectangle:
+ this.veilDiv_[3].style.top = (top + height) + "px";
+ this.veilDiv_[3].style.left = left + "px";
+ this.veilDiv_[3].style.width = width + "px";
+ this.veilDiv_[3].style.height = (this.mapHeight_ - (top + height)) + "px";
+ // Selection rectangle:
+ this.boxDiv_.style.top = top + "px";
+ this.boxDiv_.style.left = left + "px";
+ this.boxDiv_.style.width = boxWidth + "px";
+ this.boxDiv_.style.height = boxHeight + "px";
+ this.boxDiv_.style.display = "block";
+ /**
+ * This event is fired repeatedly while the user drags a box across the area of interest.
+ * The southwest and northeast point are passed as parameters of type google.maps.Point
+ * (for performance reasons), relative to the map container. Also passed is the projection object
+ * so that the event listener, if necessary, can convert the pixel positions to geographic
+ * coordinates using google.maps.MapCanvasProjection.fromContainerPixelToLatLng.
+ * @name DragZoom#drag
+ * @param {Point} southwestPixel The southwest point of the selection area.
+ * @param {Point} northeastPixel The northeast point of the selection area.
+ * @param {MapCanvasProjection} prj The projection object.
+ * @event
+ */
+ google.maps.event.trigger(this, "drag", new google.maps.Point(left, top + height), new google.maps.Point(left + width, top), this.prjov_.getProjection());
+ } else if (!this.mouseDown_) {
+ this.mapPosn_ = getElementPosition(this.map_.getDiv());
+ this.setVeilVisibility_();
+ }
+ };
+ /**
+ * Handle mouse up.
+ * @param {Event} e The mouse event.
+ */
+ DragZoom.prototype.onMouseUp_ = function (e) {
+ var z;
+ var me = this;
+ this.mouseDown_ = false;
+ if (this.dragging_) {
+ if ((this.getMousePoint_(e).x === this.startPt_.x) && (this.getMousePoint_(e).y === this.startPt_.y)) {
+ this.onKeyUp_(e); // Cancel event
+ return;
+ }
+ var left = Math.min(this.startPt_.x, this.endPt_.x);
+ var top = Math.min(this.startPt_.y, this.endPt_.y);
+ var width = Math.abs(this.startPt_.x - this.endPt_.x);
+ var height = Math.abs(this.startPt_.y - this.endPt_.y);
+ // Google Maps API bug: setCenter() doesn't work as expected if the map has a
+ // border on the left or top. The code here includes a workaround for this problem.
+ var kGoogleCenteringBug = true;
+ if (kGoogleCenteringBug) {
+ left += this.borderWidths_.left;
+ top += this.borderWidths_.top;
+ }
+
+ var prj = this.prjov_.getProjection();
+ var sw = prj.fromContainerPixelToLatLng(new google.maps.Point(left, top + height));
+ var ne = prj.fromContainerPixelToLatLng(new google.maps.Point(left + width, top));
+ var bnds = new google.maps.LatLngBounds(sw, ne);
+
+ // Sometimes fitBounds causes a zoom OUT, so restore original zoom level if this happens.
+ z = this.map_.getZoom();
+ //this.map_.fitBounds(bnds);
+ if (this.map_.getZoom() < z) {
+ this.map_.setZoom(z);
+ }
+
+ // Redraw box after zoom:
+ var swPt = prj.fromLatLngToContainerPixel(sw);
+ var nePt = prj.fromLatLngToContainerPixel(ne);
+ if (kGoogleCenteringBug) {
+ swPt.x -= this.borderWidths_.left;
+ swPt.y -= this.borderWidths_.top;
+ nePt.x -= this.borderWidths_.left;
+ nePt.y -= this.borderWidths_.top;
+ }
+ this.boxDiv_.style.left = swPt.x + "px";
+ this.boxDiv_.style.top = nePt.y + "px";
+ this.boxDiv_.style.width = (Math.abs(nePt.x - swPt.x) - (this.boxBorderWidths_.left + this.boxBorderWidths_.right)) + "px";
+ this.boxDiv_.style.height = (Math.abs(nePt.y - swPt.y) - (this.boxBorderWidths_.top + this.boxBorderWidths_.bottom)) + "px";
+ // Hide box asynchronously after 1 second:
+ setTimeout(function () {
+ me.boxDiv_.style.display = "none";
+ }, 1000);
+ this.dragging_ = false;
+ this.onMouseMove_(e); // Updates the veil
+ /**
+ * This event is fired when the drag operation ends.
+ * The parameter passed is the geographic bounds of the selected area.
+ * Note that this event is not fired if the hot key is released before the drag operation ends.
+ * @name DragZoom#dragend
+ * @param {LatLngBounds} bnds The geographic bounds of the selected area.
+ * @event
+ */
+ google.maps.event.trigger(this, "dragend", bnds);
+ // if the hot key isn't down, the drag zoom must have been activated by turning
+ // on the visual control. In this case, finish up by simulating a key up event.
+ if (!this.isHotKeyDown_(e)) {
+ this.onKeyUp_(e);
+ }
+ }
+ };
+ /**
+ * Handle key up.
+ * @param {Event} e The keyboard event.
+ */
+ DragZoom.prototype.onKeyUp_ = function (e) {
+ var i;
+ if (this.map_ && this.hotKeyDown_) {
+ this.hotKeyDown_ = false;
+ if (this.dragging_) {
+ this.boxDiv_.style.display = "none";
+ this.dragging_ = false;
+ }
+ for (i = 0; i < this.veilDiv_.length; i++) {
+ this.veilDiv_[i].style.display = "none";
+ }
+ if (this.visualEnabled_) {
+ this.buttonDiv_.firstChild.style.left = -(this.visualSize_.width * 2) + "px";
+ this.buttonDiv_.title = this.visualTips_.off;
+ this.buttonDiv_.style.display = "";
+ }
+ /**
+ * This event is fired when the hot key is released.
+ * @name DragZoom#deactivate
+ * @event
+ */
+ google.maps.event.trigger(this, "deactivate");
+ }
+ };
+ /**
+ * @name google.maps.Map
+ * @class These are new methods added to the Google Maps JavaScript API V3's
+ * Map
+ * class.
+ */
+ /**
+ * Enables drag zoom. The user can zoom to an area of interest by holding down the hot key
+ * (shift | ctrl | alt ) while dragging a box around the area or by turning
+ * on the visual control then dragging a box around the area.
+ * @param {KeyDragZoomOptions} opt_zoomOpts The optional parameters.
+ */
+ google.maps.Map.prototype.enableKeyDragZoom = function (opt_zoomOpts) {
+ this.dragZoom_ = new DragZoom(this, opt_zoomOpts);
+ };
+ /**
+ * Disables drag zoom.
+ */
+ google.maps.Map.prototype.disableKeyDragZoom = function () {
+ var i;
+ var d = this.dragZoom_;
+ if (d) {
+ for (i = 0; i < d.listeners_.length; ++i) {
+ google.maps.event.removeListener(d.listeners_[i]);
+ }
+ this.getDiv().removeChild(d.boxDiv_);
+ for (i = 0; i < d.veilDiv_.length; i++) {
+ this.getDiv().removeChild(d.veilDiv_[i]);
+ }
+ if (d.visualEnabled_) {
+ // Remove the custom control:
+ this.controls[d.visualPosition_].removeAt(d.controlIndex_);
+ }
+ d.prjov_.setMap(null);
+ this.dragZoom_ = null;
+ }
+ };
+ /**
+ * Returns true if the drag zoom feature has been enabled.
+ * @return {boolean}
+ */
+ google.maps.Map.prototype.keyDragZoomEnabled = function () {
+ return this.dragZoom_ !== null;
+ };
+ /**
+ * Returns the DragZoom object which is created when google.maps.Map.enableKeyDragZoom is called.
+ * With this object you can use google.maps.event.addListener to attach event listeners
+ * for the "activate", "deactivate", "dragstart", "drag", and "dragend" events.
+ * @return {DragZoom}
+ */
+ google.maps.Map.prototype.getDragZoomObject = function () {
+ return this.dragZoom_;
+ };
+})();
\ No newline at end of file
diff --git a/htdocs/js/lib/jquery.colorbox/jquery.colorbox-min.js b/htdocs/js/lib/jquery.colorbox/jquery.colorbox-min.js
new file mode 100644
index 00000000..54286977
--- /dev/null
+++ b/htdocs/js/lib/jquery.colorbox/jquery.colorbox-min.js
@@ -0,0 +1,4 @@
+// ColorBox v1.3.20.2 - jQuery lightbox plugin
+// (c) 2012 Jack Moore - jacklmoore.com
+// License: http://www.opensource.org/licenses/mit-license.php
+(function(a,b,c){function Z(c,d,e){var g=b.createElement(c);return d&&(g.id=f+d),e&&(g.style.cssText=e),a(g)}function $(a){var b=y.length,c=(Q+a)%b;return 0>c?b+c:c}function _(a,b){return Math.round((/%/.test(a)?("x"===b?z.width():z.height())/100:1)*parseInt(a,10))}function ab(a){return K.photo||/\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(a)}function bb(){var b,c=a.data(P,e);null==c?(K=a.extend({},d),console&&console.log&&console.log("Error: cboxElement missing settings object")):K=a.extend({},c);for(b in K)a.isFunction(K[b])&&"on"!==b.slice(0,2)&&(K[b]=K[b].call(P));K.rel=K.rel||P.rel||a(P).data("rel")||"nofollow",K.href=K.href||a(P).attr("href"),K.title=K.title||P.title,"string"==typeof K.href&&(K.href=a.trim(K.href))}function cb(b,c){a.event.trigger(b),c&&c.call(P)}function db(){var a,d,e,b=f+"Slideshow_",c="click."+f;K.slideshow&&y[1]?(d=function(){F.html(K.slideshowStop).unbind(c).bind(j,function(){(K.loop||y[Q+1])&&(a=setTimeout(W.next,K.slideshowSpeed))}).bind(i,function(){clearTimeout(a)}).one(c+" "+k,e),r.removeClass(b+"off").addClass(b+"on"),a=setTimeout(W.next,K.slideshowSpeed)},e=function(){clearTimeout(a),F.html(K.slideshowStart).unbind([j,i,k,c].join(" ")).one(c,function(){W.next(),d()}),r.removeClass(b+"on").addClass(b+"off")},K.slideshowAuto?d():e()):r.removeClass(b+"off "+b+"on")}function eb(b){U||(P=b,bb(),y=a(P),Q=0,"nofollow"!==K.rel&&(y=a("."+g).filter(function(){var c,b=a.data(this,e);return b&&(c=a(this).data("rel")||b.rel||this.rel),c===K.rel}),Q=y.index(P),-1===Q&&(y=y.add(P),Q=y.length-1)),S||(S=T=!0,r.show(),K.returnFocus&&a(P).blur().one(l,function(){a(this).focus()}),q.css({opacity:+K.opacity,cursor:K.overlayClose?"pointer":"auto"}).show(),K.w=_(K.initialWidth,"x"),K.h=_(K.initialHeight,"y"),W.position(),o&&z.bind("resize."+p+" scroll."+p,function(){q.css({width:z.width(),height:z.height(),top:z.scrollTop(),left:z.scrollLeft()})}).trigger("resize."+p),cb(h,K.onOpen),J.add(D).hide(),I.html(K.close).show()),W.load(!0))}function fb(){!r&&b.body&&(Y=!1,z=a(c),r=Z(X).attr({id:e,"class":n?f+(o?"IE6":"IE"):""}).hide(),q=Z(X,"Overlay",o?"position:absolute":"").hide(),C=Z(X,"LoadingOverlay").add(Z(X,"LoadingGraphic")),s=Z(X,"Wrapper"),t=Z(X,"Content").append(A=Z(X,"LoadedContent","width:0; height:0; overflow:hidden"),D=Z(X,"Title"),E=Z(X,"Current"),G=Z(X,"Next"),H=Z(X,"Previous"),F=Z(X,"Slideshow").bind(h,db),I=Z(X,"Close")),s.append(Z(X).append(Z(X,"TopLeft"),u=Z(X,"TopCenter"),Z(X,"TopRight")),Z(X,!1,"clear:left").append(v=Z(X,"MiddleLeft"),t,w=Z(X,"MiddleRight")),Z(X,!1,"clear:left").append(Z(X,"BottomLeft"),x=Z(X,"BottomCenter"),Z(X,"BottomRight"))).find("div div").css({"float":"left"}),B=Z(X,!1,"position:absolute; width:9999px; visibility:hidden; display:none"),J=G.add(H).add(E).add(F),a(b.body).append(q,r.append(s,B)))}function gb(){return r?(Y||(Y=!0,L=u.height()+x.height()+t.outerHeight(!0)-t.height(),M=v.width()+w.width()+t.outerWidth(!0)-t.width(),N=A.outerHeight(!0),O=A.outerWidth(!0),r.css({"padding-bottom":L,"padding-right":M}),G.click(function(){W.next()}),H.click(function(){W.prev()}),I.click(function(){W.close()}),q.click(function(){K.overlayClose&&W.close()}),a(b).bind("keydown."+f,function(a){var b=a.keyCode;S&&K.escKey&&27===b&&(a.preventDefault(),W.close()),S&&K.arrowKey&&y[1]&&(37===b?(a.preventDefault(),H.click()):39===b&&(a.preventDefault(),G.click()))}),a(b).delegate("."+g,"click",function(a){a.which>1||a.shiftKey||a.altKey||a.metaKey||(a.preventDefault(),eb(this))})),!0):!1}var q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,d={transition:"elastic",speed:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,inline:!1,html:!1,iframe:!1,fastIframe:!0,photo:!1,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",open:!1,returnFocus:!0,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0},e="colorbox",f="cbox",g=f+"Element",h=f+"_open",i=f+"_load",j=f+"_complete",k=f+"_cleanup",l=f+"_closed",m=f+"_purge",n=!a.support.opacity&&!a.support.style,o=n&&!c.XMLHttpRequest,p=f+"_IE6",X="div";a.colorbox||(a(fb),W=a.fn[e]=a[e]=function(b,c){var f=this;if(b=b||{},fb(),gb()){if(!f[0]){if(f.selector)return f;f=a(""),b.open=!0}c&&(b.onComplete=c),f.each(function(){a.data(this,e,a.extend({},a.data(this,e)||d,b))}).addClass(g),(a.isFunction(b.open)&&b.open.call(f)||b.open)&&eb(f[0])}return f},W.position=function(a,b){function j(a){u[0].style.width=x[0].style.width=t[0].style.width=a.style.width,t[0].style.height=v[0].style.height=w[0].style.height=a.style.height}var c,h,i,d=0,e=0,g=r.offset();z.unbind("resize."+f),r.css({top:-9e4,left:-9e4}),h=z.scrollTop(),i=z.scrollLeft(),K.fixed&&!o?(g.top-=h,g.left-=i,r.css({position:"fixed"})):(d=h,e=i,r.css({position:"absolute"})),e+=K.right!==!1?Math.max(z.width()-K.w-O-M-_(K.right,"x"),0):K.left!==!1?_(K.left,"x"):Math.round(Math.max(z.width()-K.w-O-M,0)/2),d+=K.bottom!==!1?Math.max(z.height()-K.h-N-L-_(K.bottom,"y"),0):K.top!==!1?_(K.top,"y"):Math.round(Math.max(z.height()-K.h-N-L,0)/2),r.css({top:g.top,left:g.left}),a=r.width()===K.w+O&&r.height()===K.h+N?0:a||0,s[0].style.width=s[0].style.height="9999px",c={width:K.w+O,height:K.h+N,top:d,left:e},0===a&&r.css(c),r.dequeue().animate(c,{duration:a,complete:function(){j(this),T=!1,s[0].style.width=K.w+O+M+"px",s[0].style.height=K.h+N+L+"px",K.reposition&&setTimeout(function(){z.bind("resize."+f,W.position)},1),b&&b()},step:function(){j(this)}})},W.resize=function(a){S&&(a=a||{},a.width&&(K.w=_(a.width,"x")-O-M),a.innerWidth&&(K.w=_(a.innerWidth,"x")),A.css({width:K.w}),a.height&&(K.h=_(a.height,"y")-N-L),a.innerHeight&&(K.h=_(a.innerHeight,"y")),a.innerHeight||a.height||(A.css({height:"auto"}),K.h=A.height()),A.css({height:K.h}),W.position("none"===K.transition?0:K.speed))},W.prep=function(b){function g(){return K.w=K.w||A.width(),K.w=K.mw&&K.mw1){if("string"==typeof K.current&&E.html(K.current.replace("{current}",Q+1).replace("{total}",g)).show(),G[K.loop||g-1>Q?"show":"hide"]().html(K.next),H[K.loop||Q?"show":"hide"]().html(K.previous),K.slideshow&&F.show(),K.preloading)for(b=[$(-1),$(1)];c=y[b.pop()];)q=a.data(c,e),q&&q.href?(o=q.href,a.isFunction(o)&&(o=o.call(c))):o=c.href,ab(o)&&(p=new Image,p.src=o)}else J.hide();K.iframe?(h=Z("iframe")[0],i in h&&(h[i]=0),k in h&&(h[k]="true"),K.scrolling||(h.scrolling="no"),a(h).attr({src:K.href,name:(new Date).getTime(),"class":f+"Iframe",allowFullScreen:!0,webkitAllowFullScreen:!0,mozallowfullscreen:!0}).one("load",l).one(m,function(){h.src="//about:blank"}).appendTo(A),K.fastIframe&&a(h).trigger("load")):l(),"fade"===K.transition?r.fadeTo(d,1,s):s()}},"fade"===K.transition?r.fadeTo(d,0,function(){W.position(0,c)}):W.position(d,c)}},W.load=function(b){var c,d,e=W.prep;T=!0,R=!1,P=y[Q],b||bb(),cb(m),cb(i,K.onLoad),K.h=K.height?_(K.height,"y")-N-L:K.innerHeight&&_(K.innerHeight,"y"),K.w=K.width?_(K.width,"x")-O-M:K.innerWidth&&_(K.innerWidth,"x"),K.mw=K.w,K.mh=K.h,K.maxWidth&&(K.mw=_(K.maxWidth,"x")-O-M,K.mw=K.w&&K.wK.mw&&(a=(R.width-K.mw)/R.width,d()),K.mh&&R.height>K.mh&&(a=(R.height-K.mh)/R.height,d())),K.h&&(R.style.marginTop=Math.max(K.h-R.height,0)/2+"px"),y[1]&&(K.loop||y[Q+1])&&(R.style.cursor="pointer",R.onclick=function(){W.next()}),n&&(R.style.msInterpolationMode="bicubic"),setTimeout(function(){e(R)},1)}),setTimeout(function(){R.src=c},1)):c&&B.load(c,K.data,function(b,c){e("error"===c?Z(X,"Error").html(K.xhrError):a(this).contents())})},W.next=function(){!T&&y[1]&&(K.loop||y[Q+1])&&(Q=$(1),W.load())},W.prev=function(){!T&&y[1]&&(K.loop||Q)&&(Q=$(-1),W.load())},W.close=function(){S&&!U&&(U=!0,S=!1,cb(k,K.onCleanup),z.unbind("."+f+" ."+p),q.fadeTo(200,0),r.stop().fadeTo(300,0,function(){r.add(q).css({opacity:1,cursor:"auto"}).hide(),cb(m),A.remove(),setTimeout(function(){U=!1,cb(l,K.onClosed)},1)}))},W.remove=function(){a([]).add(r).add(q).remove(),r=null,a("."+g).removeData(e).removeClass(g),a(b).undelegate("."+g)},W.element=function(){return a(P)},W.settings=d)})(jQuery,document,window);
\ No newline at end of file
diff --git a/htdocs/js/lib/jquery.colorbox/style1/colorbox.css b/htdocs/js/lib/jquery.colorbox/style1/colorbox.css
new file mode 100644
index 00000000..5ee3feba
--- /dev/null
+++ b/htdocs/js/lib/jquery.colorbox/style1/colorbox.css
@@ -0,0 +1,86 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
+#colorbox{}
+ #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
+ #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
+ #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
+ #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
+ #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
+ #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
+ #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
+ #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:28px;}
+ #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+ #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+ #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+ #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:-75px -25px;}
+ #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:-50px -25px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:-25px -25px;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/border.png b/htdocs/js/lib/jquery.colorbox/style1/images/border.png
new file mode 100644
index 00000000..f463a10d
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/border.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/controls.png b/htdocs/js/lib/jquery.colorbox/style1/images/controls.png
new file mode 100644
index 00000000..dcfd6fb9
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/controls.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomCenter.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomCenter.png
new file mode 100644
index 00000000..0d4475ed
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomCenter.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomLeft.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomLeft.png
new file mode 100644
index 00000000..2775eba8
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomLeft.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomRight.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomRight.png
new file mode 100644
index 00000000..f7f51379
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderBottomRight.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderMiddleLeft.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderMiddleLeft.png
new file mode 100644
index 00000000..a2d63d15
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderMiddleLeft.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderMiddleRight.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderMiddleRight.png
new file mode 100644
index 00000000..fd7c3e84
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderMiddleRight.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopCenter.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopCenter.png
new file mode 100644
index 00000000..2937a9cf
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopCenter.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopLeft.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopLeft.png
new file mode 100644
index 00000000..f9d458b5
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopLeft.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopRight.png b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopRight.png
new file mode 100644
index 00000000..74b8583c
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/ie6/borderTopRight.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/loading.gif b/htdocs/js/lib/jquery.colorbox/style1/images/loading.gif
new file mode 100644
index 00000000..b4695d81
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/loading.gif differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/loading_background.png b/htdocs/js/lib/jquery.colorbox/style1/images/loading_background.png
new file mode 100644
index 00000000..6ae83e69
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/loading_background.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style1/images/overlay.png b/htdocs/js/lib/jquery.colorbox/style1/images/overlay.png
new file mode 100644
index 00000000..53ea98f7
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style1/images/overlay.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style2/colorbox.css b/htdocs/js/lib/jquery.colorbox/style2/colorbox.css
new file mode 100644
index 00000000..f350f1fd
--- /dev/null
+++ b/htdocs/js/lib/jquery.colorbox/style2/colorbox.css
@@ -0,0 +1,43 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxContent{margin-top:32px; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{background:#FFF;border:3px solid #444; border-radius:3px; padding:1px;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxTitle{position:absolute; top:-22px; left:0; color:#000;}
+ #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;}
+ #cboxSlideshow, #cboxPrevious, #cboxNext, #cboxClose{text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxPrevious{background-position:0px 0px; right:44px;}
+ #cboxPrevious:hover{background-position:0px -25px;}
+ #cboxNext{background-position:-25px 0px; right:22px;}
+ #cboxNext:hover{background-position:-25px -25px;}
+ #cboxClose{background-position:-50px 0px; right:0;}
+ #cboxClose:hover{background-position:-50px -25px;}
+ .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;}
+ .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-100px -25px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-75px -25px;}
diff --git a/htdocs/js/lib/jquery.colorbox/style2/images/controls.png b/htdocs/js/lib/jquery.colorbox/style2/images/controls.png
new file mode 100644
index 00000000..8569b57f
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style2/images/controls.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style2/images/loading.gif b/htdocs/js/lib/jquery.colorbox/style2/images/loading.gif
new file mode 100644
index 00000000..19c67bbd
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style2/images/loading.gif differ
diff --git a/htdocs/js/lib/jquery.colorbox/style3/colorbox.css b/htdocs/js/lib/jquery.colorbox/style3/colorbox.css
new file mode 100644
index 00000000..153e32e6
--- /dev/null
+++ b/htdocs/js/lib/jquery.colorbox/style3/colorbox.css
@@ -0,0 +1,38 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxContent{margin-top:20px;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{border:5px solid #000; background:#fff;}
+ #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
+ #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
+ #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
+ #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:bottom left;}
+ #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:bottom right;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/htdocs/js/lib/jquery.colorbox/style3/images/controls.png b/htdocs/js/lib/jquery.colorbox/style3/images/controls.png
new file mode 100644
index 00000000..e1e97982
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style3/images/controls.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style3/images/loading.gif b/htdocs/js/lib/jquery.colorbox/style3/images/loading.gif
new file mode 100644
index 00000000..19c67bbd
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style3/images/loading.gif differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/colorbox.css b/htdocs/js/lib/jquery.colorbox/style4/colorbox.css
new file mode 100644
index 00000000..54560688
--- /dev/null
+++ b/htdocs/js/lib/jquery.colorbox/style4/colorbox.css
@@ -0,0 +1,82 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxTopLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 0;}
+ #cboxTopCenter{height:25px; background:url(images/border1.png) repeat-x 0 -50px;}
+ #cboxTopRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px 0;}
+ #cboxBottomLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 -25px;}
+ #cboxBottomCenter{height:25px; background:url(images/border1.png) repeat-x 0 -75px;}
+ #cboxBottomRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px -25px;}
+ #cboxMiddleLeft{width:25px; background:url(images/border2.png) repeat-y 0 0;}
+ #cboxMiddleRight{width:25px; background:url(images/border2.png) repeat-y -25px 0;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:20px;}
+ #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
+ #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
+ #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
+ #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
+ #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
+ #cboxLoadingOverlay{background:#fff url(images/loading.gif) no-repeat 5px 5px;}
+ #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/border1.png b/htdocs/js/lib/jquery.colorbox/style4/images/border1.png
new file mode 100644
index 00000000..0ddc7040
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/border1.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/border2.png b/htdocs/js/lib/jquery.colorbox/style4/images/border2.png
new file mode 100644
index 00000000..aa62a0b7
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/border2.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomCenter.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomCenter.png
new file mode 100644
index 00000000..12e0e9ac
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomCenter.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomLeft.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomLeft.png
new file mode 100644
index 00000000..b7a474ae
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomLeft.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomRight.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomRight.png
new file mode 100644
index 00000000..6b6cb159
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderBottomRight.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderMiddleLeft.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderMiddleLeft.png
new file mode 100644
index 00000000..8d0eb739
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderMiddleLeft.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderMiddleRight.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderMiddleRight.png
new file mode 100644
index 00000000..d65509e3
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderMiddleRight.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopCenter.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopCenter.png
new file mode 100644
index 00000000..35d8da2d
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopCenter.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopLeft.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopLeft.png
new file mode 100644
index 00000000..ae9bda04
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopLeft.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopRight.png b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopRight.png
new file mode 100644
index 00000000..0d886839
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/ie6/borderTopRight.png differ
diff --git a/htdocs/js/lib/jquery.colorbox/style4/images/loading.gif b/htdocs/js/lib/jquery.colorbox/style4/images/loading.gif
new file mode 100644
index 00000000..602ce3c3
Binary files /dev/null and b/htdocs/js/lib/jquery.colorbox/style4/images/loading.gif differ
diff --git a/htdocs/js/lib/jquery.lasted.js b/htdocs/js/lib/jquery.lasted.js
new file mode 100644
index 00000000..83589daa
--- /dev/null
+++ b/htdocs/js/lib/jquery.lasted.js
@@ -0,0 +1,2 @@
+/*! jQuery v1.8.3 jquery.com | jquery.org/license */
+(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="