// Mapping
if (!("console" in window) || !("firebug" in console))
{
var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {}
}
var Mapping = Mapping || {}
Mapping.Mapping = function(element, obj) {
if(typeof element == "string") element = document.getElementById(element)
if(!element) return false;
var obj = obj != null ? obj : {}
this.customStyles = obj.customStyles || false;
this.markerClickAction = obj.markerClickAction || "none";
this.markerIdLabel = obj.markerIdLabel || null;
this.displayLinkToURL = obj.displayLinkToURL || false;
this.linkToElement = obj.linkToElement || null;
if( this.displayLinkToURL && !this.linkToElement ) {
console.warn("You have displayLinkToURL enabled. You must specify an element to target using linkToElement.")
}
if( typeof this.linkToElement == "string" ) {
this.linkToElement = document.getElementById(this.linkToElement);
}
this.linkToDefault = this.linkToElement.value;
this.element = element;
this.api = "microsoft";
this.debug = true;
var controls = function() {
this.getMap().SetDashboardSize(VEDashboardSize.Large);
}
this.mapstraction = new Mapstraction(element, this.api, this.debug, controls);
}
Mapping.Mapping.prototype = {
load: function(dataItems) {
var manyItems = false;
if(dataItems.constructor == Array) manyItems = true;
if(manyItems) {
for(var i=0; i < dataItems.length; i++) {
this._addToMap(dataItems[i]);
}
} else {
this._addToMap(dataItems);
}
var self = this;
this.mapstraction.addEventListener("click", self._eventMouseClick);
this.mapstraction.addEventListener("mouseover", self._eventMouseOver);
this.mapstraction.addEventListener("mousedown", self._eventMouseDown);
this.mapstraction.addEventListener("endpan", self._eventEndPan);
this.mapstraction.addEventListener("endzoom", self._eventEndZoom);
},
draw: function(viewType, data) {
this.mapWidth = parseInt(this.element.getAttribute("width"));
this.mapHeight = parseInt(this.element.getAttribute("height"));
this.mapCentre = new LatLonPoint(this.MAP_CENTRE.lat, this.MAP_CENTRE.lon);
this.mapstraction.addControls({
pan: true,
zoom: 'small',
map_type: true
});
if(this.customStyles) {
switch(this.api) {
case "microsoft":
this.mapstraction.maps[this.mapstraction.api].ClearInfoBoxStyles();
break;
}
}
this.mapstraction.getMap().ShowMiniMap(490, 0, VEMiniMapSize.Small);
this.mapstraction.resizeTo(this.mapWidth, this.mapHeight);
if(viewType == "marker" && (typeof data.schoolid != "undefined") ) {
var marker = this._findMarker(data.schoolid);
if(marker) {
var self = this;
self.mapstraction.setCenterAndZoom(marker.location, self.MARKER_ZOOM);
var f = function() { marker.openBubble({after:marker._controller._afterOpenBubble}); }
marker.mapstraction._addSingleExecuteEvent("onendpan", f);
}
} else if(viewType == "region") {
var lat = data.lat;
var lon = data.lon;
var zoom = data.zoom;
this.mapstraction.setCenterAndZoom(new LatLonPoint(lat, lon), zoom);
} else {
this.mapstraction.setCenterAndZoom(this.mapCentre, this.MAP_ZOOM);
}
},
_addToMap: function(item) {
if(!item.latLon) return false;
var point = new LatLonPoint(item.latLon.lat, item.latLon.lon);
var marker = new Marker(point);
marker._controller = this;
if(item.id) marker._external_id = item.id;
if(item.label) marker.setLabel( item.label );
if(item.infoPanel) marker.setInfoBubble( item.infoPanel );
marker.setIcon(this.MARKER_ICON);
this.mapstraction.addMarker(marker);
return marker;
},
_findMarker: function(markerId) {
if(!markerId) return false;
var marker = null;
marker = Mapping.Util.find(
this.mapstraction.markers,
function(marker) {
var matched = false;
if(typeof marker._external_id != "undefined") {
if(marker._external_id == markerId) matched = true;
}
return matched;
});
return marker;
},
_eventMouseOver: function(event) {
return true;
},
_eventMouseOut: function(event) {
return true;
},
_eventMouseDown: function(event) {
var self = event._mapstraction;
},
_eventEndPan: function(event) {
if (event) {
var self = event._mapstraction;
var marker = self._currentOpenMarker;
if (marker) {
marker.closeBubble({before:self._currentOpenMarker._controller._hookCloseBubble});
}
}
},
_eventEndZoom: function(event) {
var self = event._mapstraction;
if(self._currentOpenMarker) {
var marker = self._currentOpenMarker;
marker.closeBubble();
marker.openBubble({after:marker._controller._afterOpenBubble});
}
},
_eventMouseClick: function(event, marker) {
if (marker != null) {
marker.mapstraction._removeSingleExecuteEvent();
var controller = marker._controller;
marker.closeBubble({before:marker._controller._hookCloseBubble});
switch(marker._controller.markerClickAction) {
case "none": 	marker.openBubble({after:marker._controller._afterOpenBubble});
break;
case "centre":	if(marker.mapstraction.getCenter().weakEquals(marker.location, 4)) {
marker.openBubble({after:marker._controller._afterOpenBubble});
} else {
marker.mapstraction.setCenter(marker.location);
var f = function() { marker.openBubble({after:marker._controller._afterOpenBubble}); }
marker.mapstraction._addSingleExecuteEvent("onendpan", f);
}
break;
case "move":	var nativeMap = marker.mapstraction.getMap();
var currentXY = nativeMap.LatLongToPixel(marker.location.toMicrosoft());
var mapWidth = controller.mapWidth;
var mapHeight = controller.mapHeight;
var newX = null;
var newY = null;
var infoBubbleBox = Mapping.Util.findByClassName("customInfoBox-with-leftBeak","div");
if(!infoBubbleBox) {
infoBubbleBox = Mapping.Util.findByClassName("customInfoBox-with-rightBeak","div")
}
var box = null;
var bWidth = null;
var bHeight = null;
if (infoBubbleBox.currentStyle) {
box = infoBubbleBox.currentStyle;
bWidth = parseInt(box.width);
bHeight = parseInt(box.height);
} else if( window.getComputedStyle ) {
box = window.getComputedStyle(infoBubbleBox, null);
bWidth = parseInt(box.width);
bHeight = parseInt(box.height);
} else {
box = { width: controller.INFO_BUBBLE_WIDTH,
height: controller.INFO_BUBBLE_HEIGHT
}
}
var notch = document.getElementById("notch");
var notchTop = parseFloat(notch.style.top) || 20;
var notchHeight;
var notchWidth;
if (notch.currentStyle) {
n = notch.currentStyle;
notchHeight = parseFloat(n.height);
notchWidth = parseFloat(n.width);
} else if( window.getComputedStyle ) {
n = window.getComputedStyle(notch, null);
notchHeight = parseFloat(n.height);
notchWidth = parseFloat(n.width);
} else {
notchHeight = 1000;
notchWidth = 1200;
}
var topToNotch = notchTop + (notchHeight/2);
var baseToNotch = bHeight - notchTop;
var pan = false;
if( (currentXY.y - bHeight) < 0 ) {
currentXY.y = (mapHeight / 2) - (topToNotch - currentXY.y);
pan = true;
}
if( (currentXY.y + bHeight) > mapHeight ) {
currentXY.y = (mapHeight / 2) + ( currentXY.y - (mapHeight - baseToNotch));
pan = true;
}
if( (currentXY.x + (bWidth+notchWidth)) > mapWidth ) {
currentXY.x = (mapWidth / 2) + (currentXY.x - (mapWidth - (bWidth + notchWidth)));
pan = true;
}
if( pan ) {
var nll = nativeMap.PixelToLatLong( currentXY );
var ll = new LatLonPoint( nll.Latitude, nll.Longitude );
marker.mapstraction.setCenter(ll);
var f = function() { marker.openBubble({after:marker._controller._afterOpenBubble}); }
marker.mapstraction._addSingleExecuteEvent("onendpan", f);
} else {
marker.openBubble({after:marker._controller._afterOpenBubble});
}
break;
}
window.mm = marker;
}
return true;
},
_afterOpenBubble: function(bubbleContext) {
var notch = document.getElementById("notch");
var beak  = Mapping.Util.findByClassName("customInfoBox-beak", "div");
if (typeof beak.style.top != "undefined") {
notch.style["top"] = 0;
notch.style["top"] = (parseInt(beak.style.top)) + "px";
}
var marker = bubbleContext;
var closeButton = document.getElementById("close-button");
closeButton.onclick = function(e){
marker.closeBubble({after:marker._controller._hookCloseBubble});
return true;
}
if(marker._controller.displayLinkToURL) {
var l = document.location;
var linkURL = l.protocol + "\/\/" + l.host + l.pathname + "?" + marker._controller.markerIdLabel + "=" + marker._external_id;
marker._controller.linkToElement.value = linkURL;
}
},
_hookBeforeCloseBubble: function(context) {
bubbleContext._controller._previousMarker = bubbleContext._controller._currentOpenMarker;
},
_hookCloseBubble: function(bubbleContext) {
if(bubbleContext._controller.displayLinkToURL) {
bubbleContext._controller.linkToElement.value = bubbleContext._controller.linkToDefault;
}
},
_fixIEPng: function() {
var arVersion = navigator.appVersion.split("MSIE");
var version = parseFloat(arVersion[1]);
if ((version >= 5.5) && (document.body.filters))
{
var markers = Mapping.Util.findAllByClassName("VEAPI_Pushpin", "a");
for(var i=0; i < markers.length; i++)
{
var m = markers[i];
var mImage = m.getElementsByTagName("img")[0];
var mLink = m.getElementsByTagName("a")[0];
mLink.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + img.src + "', sizingMethod='scale')";
mImage.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=0);";
}
}
},
MAP_CENTRE: {lat:54.7246, lon:-3.8672 },
MAP_ZOOM: 5,
MARKER_ZOOM: 12,
MARKER_ICON: '/nol/shared/spl/hi/school_report/map/imgs/marker.gif',
INITIAL_MARKER_SHOW_TIMEOUT: 2000,
INFO_BUBBLE_WIDTH: 280,
INFO_BUBBLE_HEIGHT: 200
}
Mapping.MapDataImporter = function(source, obj) {
if(!source) return false;
this._sourceData = source;
}
Mapping.MapDataImporter.prototype = {
load: function() {
var mapData = [];
var rawData = this._sourceData;
try {
var evalData = eval(rawData);
mapData = evalData.data;
if(_mapping_debug) console.log("Data parsed: ", e);
} catch(e) {
if(_mapping_debug) console.log("Error with json data: ", e);
mapData = { data:[] };
}
this._importedData = mapData;
return mapData;
},
getItems: function(){
return this._importedData;
}
}
if(!window.console){
window.console = {
log: function() {},
dir: function() {}
}
}
Mapping.Util = {
map: function(arrayToIterate, mapFunc) {
var mappedArray = [];
for(var i=0; i<arrayToIterate.length; i++) {
mappedArray.push( mapFunc(arrayToIterate[i]) )
}
return mappedArray;
},
find: function(arrayToIterate, findFunc) {
var foundItem = null;
for(var i=0; i<arrayToIterate.length; i++) {
if( findFunc(arrayToIterate[i]) ) {
foundItem = arrayToIterate[i];
break;
}
}
return foundItem;
},
findAll: function(arrayToIterate, findFunc) {
var foundItems = [];
for(var i=0; i<arrayToIterate.length; i++) {
if( findFunc(arrayToIterate[i]) ) {
foundItems.push(arrayToIterate[i]);
}
}
if(foundItems.length == 0) foundItems = null;
return foundItems;
},
trim: function(string) {
var whiteBegin = /^\s+/i;
var whiteEnd = /\s+$/i;
var punc = /^,|,$/i;
string = string.replace(whiteBegin, "").replace(whiteEnd, "");
string = string.replace(punc, "");
return string;
},
findByClassName: function(className, tag) {
var found = null;
var tags = document.getElementsByTagName(tag);
if(tags) {
found = Mapping.Util.find( tags, function(i) {
if(i.className == className) {
return true
} else {
return false;
}
});
}
return found;
},
findAllByClassName: function(className, tag) {
var found = [];
var tags = document.getElementsByTagName(tag);
if(tags) {
found = Mapping.Util.findAll( tags, function(i) {
if(i.className == className) {
return true
} else {
return false;
}
});
}
return found || null;
}
}
