/* ============================================================================================ JS-GIS API: JavaScript Geographic Information System browser library Copyright (C) 2001, 2002 Luca Sigfrido Percich The JS-GIS API is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation: please refer to http://www.gnu.org/licenses/gpl.html The JS-GIS API is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ============================================================================================ Author: Luca Sigfrido Percich (luca.percich@reacoop.it) Version: 2.1 Last updated: dec 26, 2002 added: TAnchor class; TFrame.anchor & TImage.anchor minor bug fixes ============================================================================================ */ /* ============================================================================================ ============================================================================================ Geometric classes Class definitions: TPoint TRect ============================================================================================ ============================================================================================ */ function TPoint(aX, aY) { this.className = 'TPoint' this.isPoint = 1 this.distance = TPoint_distance this.expand = TPoint_expand this.moveTo = TPoint_moveTo this.translate = TPoint_translate this.toRelative = TPoint_toRelative this.toAbsolute = TPoint_toAbsolute this.within = TPoint_within this.contains = TPoint_contains this.doRound = TPoint_doRound this.clone = TPoint_clone this.assign = TPoint_assign this.toString = TPoint_toString this.moveTo(aX, aY) } function TPoint_toString() { return 'TPoint(' + this.x + ',' + this.y + ')' } function TPoint_clone() { return new TPoint(this.x, this.y) } function TPoint_assign(p) { if (p && p.isPoint) { this.x = p.x this.y = p.y } } function TPoint_distance(p) { if (p.isPoint) return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2)) } function TPoint_expand(leftX, upY, rightX, downY) { if (arguments.length < 2) var upY = leftX if (arguments.length < 3) var rightX = leftX if (arguments.length < 4) var downY = upY return new TRect(this.x - leftX, this.y - upY, this.x + rightX, this.y + downY) } function TPoint_moveTo(newX, newY) { this.x = newX this.y = newY } function TPoint_translate(src, dest) { if (src && src.isRect && dest && dest.isRect) return new TPoint ( dest.min.x + ((src.xAxis == dest.xAxis) ? (this.x - src.min.x) : (src.max.x - this.x)) * dest.width / src.width , dest.min.y + ((src.yAxis == dest.yAxis) ? (this.y - src.min.y) : (src.max.y - this.y)) * dest.height / src.height ) } function TPoint_within(r) { if (!r) return if (r.isRect) return (this.x >= r.min.x) && (this.x <= r.max.x) && (this.y >= r.min.y) && (this.y <= r.max.y) else if (r.contains) return r.contains(this) } function TPoint_contains(obj) { return 0 } function TPoint_toRelative(origin) { if (origin.isPoint) return new TPoint(this.x - origin.x, this.y - origin.y) } function TPoint_toAbsolute(origin) { if (origin.isPoint) return new TPoint(origin.x + this.x, origin.y + this.y) } function TPoint_doRound() { this.x = Math.round(this.x) this.y = Math.round(this.y) } /* TRect Class ============================================================================================ */ function TRect(aMinX, aMinY, aMaxX, aMaxY, bottomUpY, rightLeftX) { this.className = 'TRect' this.isRect = 1 this.max = new TPoint(Math.max(aMinX, aMaxX), Math.max(aMinY, aMaxY)) this.min = new TPoint(Math.min(aMinX, aMaxX), Math.min(aMinY, aMaxY)) this.width = this.max.x - this.min.x this.height = this.max.y - this.min.y this.yAxis = (bottomUpY) ? -1 : 1 this.xAxis = (rightLeftX) ? -1 : 1 this.centroid = TRect_centroid this.moveTo = TRect_moveTo this.moveBy = TRect_moveBy this.resize = TRect_resize this.within = TRect_within this.intersects = TRect_intersects this.intersection = TRect_intersection this.translate = TRect_translate this.toRelative = TRect_toRelative this.toAbsolute = TRect_toAbsolute this.doRound = TRect_doRound this.clone = TRect_clone this.assign = TRect_assign this.toString = TRect_toString } function TRect_toString() { return 'TRect(' + this.min + ',' + this.max + ')' } function TRect_clone() { return new TRect(this.min.x, this.min.y, this.max.x, this.max.y, (this.yAxis != 1), (this.xAxis != 1)) } function TRect_assign(r) { if (r && r.isRect) { this.moveTo(r.min.x, r.min.y, r.max.x, r.max.y) this.xAxis = r.xAxis this.yAxis = r.yAxis } } function TRect_within(r) { if (!r) return 0 if (r.isRect) return ( (r.min.x <= this.min.x) && (r.max.x >= this.max.x) && (r.min.y <= this.min.y) && (r.max.y >= this.max.y) ) else if (r.contains) return r.contains(this) else return 0 } function TRect_intersects(r) { if (r && r.isRect) return !( (this.min.x > r.max.x) || (this.max.x < r.min.x) || (this.min.y > r.max.y) || (this.max.y < r.min.y) ) else if (r.intersects) return r.intersects(this) else return 0 } function TRect_intersection(r) { if (this.intersects(r)) return new TRect( Math.max(this.min.x, r.min.x), Math.max(this.min.y, r.min.y), Math.min(this.max.x, r.max.x), Math.min(this.max.y, r.max.y), (this.yAxis != 1), (this.xAxis != 1)) } function TRect_translate(src, dest) { if ((min = this.min.translate(src, dest)) && (max = this.max.translate(src, dest))) return new TRect(min.x, min.y, max.x, max.y, (this.yAxis != 1), (this.xAxis != 1)) } function TRect_centroid() { return new TPoint( ((this.max.x - this.min.x) / 2) + this.min.x, ((this.max.y - this.min.y) / 2) + this.min.y) } function TRect_moveTo(newMinX, newMinY, newMaxX, newMaxY) { this.min.moveTo(newMinX, newMinY) if (arguments.length > 2) { this.max.moveTo(newMaxX, newMaxY) this.width = this.max.x - this.min.x this.height = this.max.y - this.min.y } else this.max.moveTo(this.min.x + this.width, this.min.y + this.height) } function TRect_moveBy(deltaX, deltaY) { this.moveTo(this.min.x + deltaX, this.min.y + deltaY) } function TRect_resize(newWidth, newHeight) { this.moveTo(this.min.x, this.min.y, this.min.x + newWidth, this.min.y + newHeight) } function TRect_toRelative(origin) { if ((nMin = this.min.toRelative(origin)) && (nMax = this.max.toRelative(origin))) return new TRect(nMin.x, nMin.y, nMax.x, nMax.y, (this.yAxis != 1), (this.xAxis != 1)) } function TRect_toAbsolute(origin) { if ((nMin = this.min.toAbsolute(origin)) && (nMax = this.max.toAbsolute(origin))) return new TRect(nMin.x, nMin.y, nMax.x, nMax.y, (this.yAxis != 1), (this.xAxis != 1)) } function TRect_doRound() { this.min.doRound() this.max.doRound() } /* ============================================================================================ ============================================================================================ HTML classes Class definitions: TStyle TFrame TImage TAnchor ============================================================================================ ============================================================================================*/ /* TStyle Class ============================================================================================ */ function TStyle() { this.className = 'TStyle' this.isStyle = 1 this.units = 'px' this.autoClip = 1 this.overflow = '' this.toString = TStyle_toString this.setBox = TStyle_setBox this.setClip = TStyle_setClip this.setBorder = TStyle_setBorder this.setBackground = TStyle_setBackground this.getDef = TStyle_getDef } function TStyle_toString() { var szBuf = '' if (this.border) { if ((this.border.width) && (this.border.width > 0)) szBuf += 'border: ' + this.border.width + this.units + ' ' + this.border.style + ' ' + this.border.color + ';' } if (this.box) { szBuf += 'position:absolute;top:' + this.box.y + this.units + ';left:' + this.box.x + this.units + ';' if (this.box.width) szBuf += 'width:' + this.box.width + this.units + ';' if (this.box.height) szBuf += 'height:' + this.box.height + this.units + ';' } if (this.clip) { szBuf += 'clip:rect(' + this.clip.top + this.units + ' ' + this.clip.right + this.units + ' ' + this.clip.bottom + this.units + ' ' + this.clip.left + this.units + ');' } if (this.overflow) szBuf += 'overflow:' + this.overflow + ';' if (this.background) { if (this.background.image != '') szBuf += 'background-image:URL(' + this.background.image + ');layer-background-image:URL(' + this.background.image + ');' if (this.background.color != '') szBuf += 'background-color:' + this.background.color + ';layer-background-color:' + this.background.color + ';' } return szBuf } function TStyle_getDef() { var szBuf = this.toString() return (szBuf) ? ' style="' + szBuf + '"' : '' } function TStyle_setBox(x, y, width, height) { this.box = new Object() this.box.x = x this.box.y = y this.box.width = width this.box.height = height } function TStyle_setClip(top, right, bottom, left) { this.clip = new Object() var k = (this.border) ? this.border.width * 2 : 0 this.clip.top = (top) ? top : -k this.clip.right = (right) ? right : this.box.width + k this.clip.bottom = (bottom) ? bottom : this.box.height + k this.clip.left = (left) ? left : -k } function TStyle_setBorder(width, style, color) { this.border = new Object() this.border.width = (width) ? width : 0 this.border.style = (style) ? style : 'solid' this.border.color = (color) ? color : 'black' } function TStyle_setBackground(color, image) { this.background = new Object() this.background.color = (color) ? color : '' this.background.image = (image) ? image : '' } /* TFrame Class ============================================================================================ */ function TFrame(aX, aY, aWidth, aHeight, varName) { this.className = 'TFrame' this.isFrame = 1 this.rect = new TRect(aX, aY, aX + aWidth, aY + aHeight) this.varName = (varName) ? varName : '' this.visible = 1 this.style = new TStyle() this.contents = '' this.anchor = '' this.beforeDraw = '' this.toString = TFrame_toString this.resize = TFrame_resize this.updateBox = TFrame_updateBox this.setClickHandler = TFrame_setClickHandler this.updateBox() } function TFrame_toString() { if ((this.beforeDraw) && !(this.beforeDraw())) return '' if (!this.visible) return '' var szBuf = '<div ' if (this.varName != '') szBuf += 'id="' + this.varName + '" ' if (this.style) { if (this.autoClip) this.style.setClip() szBuf += this.style.getDef() } szBuf += '>' + ((this.contents) ? this.contents : '') + '</div>' if (this.anchor) szBuf = this.anchor.toString(szBuf) return szBuf } function TFrame_updateBox() { this.style.setBox(this.rect.min.x, this.rect.min.y, this.rect.width, this.rect.height) } function TFrame_resize(newW, newH, newX, newY) { if (arguments.length > 2) this.rect.moveTo(newX, newY, newX + newW, newY + newH) else this.rect.resize(newW, newH) this.updateBox() } function TFrame_setClickHandler(handlerObjName) { this.anchor = new TAnchor('parent.objectClick(event, ' + handlerObjName + ')','',1,1) } /* TImage Class --------------------------------------------------------------------------------------------*/ function TImage(src, w, h, x, y) { this.className = 'TImage' this.isImage = 1 this.src = src this.width = (w) ? w : 0 this.height = (h) ? h : 0 this.borderW = 0 this.alt = '' this.imgmap = '' this.anchor = '' if (arguments.length > 3) { this.style = new TStyle() this.style.setBox(x, y, w, h) } this.toString = TImage_toString } function TImage_toString() { var szBuf = '<img src="' + this.src + '"' if (this.width > 0) szBuf += ' width="' + this.width + '"' if (this.height > 0) szBuf += ' height="' + this.height + '"' szBuf += ' border="' + this.borderW + '"' if (this.imgmap) szBuf += ' USEMAP="#' + this.imgmap + '"' if (this.alt) szBuf += ' ALT="' + this.alt + '"' if (this.style) szBuf += this.style.getDef() szBuf += '>' if (this.anchor) szBuf = this.anchor.toString(szBuf) return szBuf } /* TAnchor Class --------------------------------------------------------------------------------------------*/ function TAnchor(href, target, useOnClick, disabled) { this.className = 'TAnchor' this.isAnchor = 1 this.href = href this.target = (target) ? target : '' this.useOnClick = (useOnClick) ? 1 : 0 this.enabled = (disabled) ? 0 : 1 this.toString = TAnchor_toString } function TAnchor_toString(contents) { var szBuf = '' if (this.enabled) { szBuf = '<a' if (this.useOnClick) szBuf += ' href="#" onclick="' + this.href + '"' else szBuf += ' href="' + this.href + '"' + ((this.target) ? (' target="' + this.target + '"') : '') szBuf += '>' if (contents) szBuf += contents + '</a>' } else if (contents) szBuf = contents return szBuf } /* TFrame event handler ============================================================================================ */ function objectClick(e, obj) { if (e.clientX) // opera, msie, ns { var x = e.clientX var y = e.clientY } else if (e.offsetX) // msie { var x = e.offsetX + obj.rect.min.x var y = e.offsetY + obj.rect.min.y } else if (e.layerX) // ns { var x = e.layerX + obj.rect.min.x var y = e.layerY + obj.rect.min.y } if (!isNaN(x) && !isNaN(y) && (obj.onClickHandler)) obj.onClickHandler(new TPoint(x, y)) } /* ============================================================================================ ============================================================================================ Map classes Class definitions: TMap TProjectMap (inherits from TMap) TLocatorMap (inherits from TMap) TMapObject (inherits from TFrame) ============================================================================================ ============================================================================================ */ /* TMap Class ============================================================================================ */ function TMap(varName, aWidth, aHeight, numTilesX, numTilesY, aX, aY) { this.className = 'TMap' this.isMap = 1 this.varName = (varName) ? varName : '' this.extent = new TRect(0,0,0,0,1) var oX = (aX) ? aX : 0 var oY = (aY) ? aY : 0 this.frame = new TFrame(oX, oY, aWidth, aHeight, (varName) ? varName + '.frame' : '') this.frame.setClickHandler(this.varName) this.onClickHandler = '' with(this.frame.style) { setBackground('#FFFFFF') setClip() overflow = 'hidden' } this.tilesX = (numTilesX) ? numTilesX : 1 this.tilesY = (numTilesY) ? numTilesY : this.tilesX this.tiles = new Array() var tW = Math.round(aWidth / this.tilesX) var tH = Math.round(aHeight / this.tilesY) // img coordinates are RELATIVE to frame's aX, aY for (var r = 0; r < this.tilesY; r++) { this.tiles[r] = new Array() for (var c = 0; c < this.tilesX; c++) this.tiles[r][c] = new TImage('', tW, tH, (c * tW), ((this.tilesY - r - 1) * tH)) } this.drawList = new Array() this.toString = TMap_toString this.pix2geo = TMap_pix2geo this.geo2pix = TMap_geo2pix } function TMap_toString() { var szBuf = '' for (var r = this.tilesY - 1; r >= 0; r--) for (var c = 0; c < this.tilesX; c++) szBuf += this.tiles[r][c].toString() var szInnerObj = '' var szOuterObj = '' for (var ct = 0; ct < this.drawList.length; ct++) { if (this.drawList[ct].isMapObject) this.drawList[ct].update(this) if (this.drawList[ct].drawInner) szInnerObj += this.drawList[ct] + '\n' else szOuterObj += this.drawList[ct] + '\n' } szBuf += szInnerObj this.frame.contents = szBuf szBuf = this.frame.toString() szBuf += szOuterObj return szBuf } // graphic to geographic coordinate conversion function TMap_pix2geo(obj) { return obj.translate(this.frame.rect, this.extent) } // geographic to graphic coordinate conversion function TMap_geo2pix(obj) { return obj.translate(this.extent, this.frame.rect) } /* TProjectMap Class ============================================================================================ */ function TProjectMap(aProject, varName, aWidth, aHeight, numTilesX, numTilesY, aX, aY) { this.inherited = TMap this.inherited(varName, aWidth, aHeight, numTilesX, numTilesY, aX, aY) this.className = 'TProjectMap' this.isProjectMap = 1 this.project = aProject this.zoomLevel = 0 this.theme = 0 this.tool = 100 this.imagemap = -1 this.availImagemaps = new Array() var p = Project.extent.centroid() this.center = p.clone() this.llTile = new TPoint(0, 0) this.includes = '' this.update = TProjectMap_update this.gotoXY = TProjectMap_gotoXY this.moveMap = TProjectMap_moveMap this.panMap = TProjectMap_panMap this.setZoomLevel = TProjectMap_setZoomLevel this.setTool = TProjectMap_setTool this.setTheme = TProjectMap_setTheme this.toString = TProjectMap_toString this.frame.map = this this.onClickHandler = TProjectMap_mapClick this.statusChanged = '' this.defaultTool = '' this.defaultTheme = '' this.update() } function TProjectMap_moveMap(deltay, deltax) { this.gotoXY(this.center.x + deltax, this.center.y + deltay) } function TProjectMap_panMap(deltarows, deltacols) { var z = this.project.zoomLevels.get(this.zoomLevel) if (z) this.moveMap(deltarows * z.geoHeight, deltacols * z.geoWidth) } function TProjectMap_gotoXY(cX, cY, newlev) { var oldTool = this.tool var oldTheme = this.theme var oldZoom = this.zoomLevel this.center.moveTo(cX, cY) if (arguments.length > 2) this.setZoomLevel(newlev, 1) this.update(this.zoomLevel != oldZoom, this.theme != oldTheme, this.tool != oldTool, 1) } function TProjectMap_setZoomLevel(newlev, disableEvents) { var oldZoom = this.zoomLevel var oldTool = this.tool var oldTheme = this.theme this.zoomLevel = normalizeNumber(Math.round(newlev), 0, this.project.zoomLevels.items.length - 1) this.setTheme(this.theme, 1) this.setTool(this.tool, 1) if (!disableEvents) this.update(this.zoomLevel != oldZoom, this.theme != oldTheme, this.tool != oldTool, 0) } function TProjectMap_setTheme(newTheme, disableEvents) { var oldTheme = this.theme this.theme = normalizeNumber(newTheme, 0, this.project.themes.items.length - 1) var t = this.project.themes.get(this.theme) if (!t || !t.isAvailable(this.zoomLevel)) { if (this.defaultTheme) this.theme = this.defaultTheme() else this.theme = this.project.themes.firstAvail(this.zoomLevel) } if (!disableEvents) this.update(0,(oldTheme != this.theme),0,0) } function TProjectMap_setTool(newTool, disableEvents) { this.tool = newTool var im if ( ((this.tool < 100) && (!(im = this.project.imagemaps.get(this.tool)) || !im.isAvailable(this.zoomLevel))) || ((this.tool == 100) && (this.zoomLevel == this.project.zoomLevels.items.length - 1)) || ((this.tool == 101) && (this.zoomLevel == 0)) ) if (this.defaultTool) this.tool = this.defaultTool() else { if (this.zoomLevel > 0) this.tool = 101 else if (this.zoomLevel < this.project.zoomLevels.items.length - 1) this.tool = 100 else this.tool = 999 } if (this.tool < 100) this.imagemap = this.tool if (!(im = this.project.imagemaps.get(this.imagemap)) || !im.isAvailable(this.zoomLevel)) { this.imagemap = -1 if (this.availImagemaps.length > 0) this.imagemap = this.availImagemaps[0] } if (!disableEvents) this.update(0,0,1,0) } function TProjectMap_mapClick(p) { p = this.pix2geo(p) if (this.tool == 100) // zoom IN this.gotoXY(p.x, p.y, this.zoomLevel + 1) else if (this.tool == 101) // zoom OUT this.gotoXY(p.x, p.y, this.zoomLevel - 1) } function TProjectMap_update(cZoom, cTheme, cTool, cPosition) { var z = this.project.zoomLevels.get(this.zoomLevel) if (!z) return 0 this.availImagemaps.length = 0 for(var ct = 0; ct < this.project.imagemaps.items.length; ct++) if (this.project.imagemaps.items[ct].isAvailable(this.zoomLevel)) this.availImagemaps[this.availImagemaps.length] = ct if (arguments.length < 4) cPosition = 1 if (arguments.length < 3) cTool = 1 if (arguments.length < 2) cTheme = 1 if (arguments.length < 1) cZoom = 1 var dw = this.tilesX * z.geoWidth / 2 var dh = this.tilesY * z.geoHeight / 2 this.llTile.assign(z.getTiles(this.center)) if (this.tilesX % 2) this.llTile.x -= (this.tilesX - 1) / 2 else { this.llTile.x -= (this.tilesX - 2) / 2 if (this.center.x < z.extent.min.x + (this.llTile.x - 0.5) * z.geoWidth) this.llTile.x -= 1 } if (this.tilesY % 2) this.llTile.y -= (this.tilesY - 1) / 2 else { this.llTile.y -= (this.tilesY - 2) / 2 if (this.center.y < z.extent.min.y + (this.llTile.y - 0.5) * z.geoHeight) this.llTile.y -= 1 } this.center.moveTo( z.extent.min.x + (this.llTile.x - 1) * z.geoWidth + dw, z.extent.min.y + (this.llTile.y - 1) * z.geoHeight + dh) this.extent.moveTo( this.center.x - dw, this.center.y - dh, this.center.x + dw, this.center.y + dh) if (arguments.length == 4) { if (this.statusChanged) this.statusChanged(cZoom, cTheme, cTool, cPosition) else for (var ct = 0; ct < frames.length; ct++) frames[ct].document.location.reload() } return true } function TProjectMap_toString() { this.includes = '' var t = this.project.themes.get(this.theme) if (this.tool < 100) { var im = this.project.imagemaps.get(this.tool) this.frame.anchor.enabled = 0 } else if (this.tool != 999) this.frame.anchor.enabled = 1 for (var r = 0; r < this.tilesY; r++) for (var c = 0; c < this.tilesX; c++) { this.tiles[r][c].src = t.getTileURL(this.llTile.y + r, this.llTile.x + c, this.zoomLevel) if ((this.tool < 100) && (im)) { if (this.tiles[r][c].imgmap = im.getTileName(this.llTile.y + r, this.llTile.x + c, this.zoomLevel)) this.includes +='<script language="JavaScript" src="' + im.getTileURL(this.llTile.y + r, this.llTile.x + c, this.zoomLevel) + '"></script>' + '\n' } else this.tiles[r][c].imgmap = '' } this.inherited = TMap_toString return this.inherited() + this.includes } /* TLocatorMap Class ============================================================================================ */ function TLocatorMap(aProjectMap, varName, aWidth, aHeight, aImgSrc, aX, aY) { this.inherited = TMap this.inherited(varName, aWidth, aHeight, 1, 1, aX, aY) this.className = 'TLocatorMap' this.isLocatorMap = 1 this.lrect = new TMapObject(new TRect(0,0,0,0)) this.lrect.style.setBorder(1,'solid','red') this.lrect.drawInner = 0 this.map = aProjectMap this.tiles[0][0].src = aImgSrc this.drawList[0] = this.lrect this.extent.assign(this.map.project.extent) this.toString = TLocatorMap_toString this.onClickHandler = TLocatorMap_mapClick this.frame.map = this.map this.frame.locator = this this.frame.anchor.enabled = 1 } function TLocatorMap_mapClick(p) { p = this.pix2geo(p) this.map.gotoXY(p.x, p.y) } function TLocatorMap_toString() { this.lrect.obj.assign(this.map.extent) this.inherited = TMap_toString return this.inherited() } /* TMapObject Class ============================================================================================ */ function TMapObject(obj, table, id, imgPath, imgW, imgH, varname, options) { this.inherited = TFrame this.inherited(0,0,0,0, varname) this.className = 'TMapObject' this.isMapObject = 1 this.obj = obj this.table = table this.id = id this.drawInner = 0 this.update = TMapObject_update if (obj.isRect) { if (imgPath) this.style.setBackground('', imgPath) } else if (obj.isPoint) { this.contents = new TImage(imgPath, imgW, imgH) this.ptOffset = (options) ? options : 'cc' } } function TMapObject_update(map) { var newObj = map.geo2pix(this.obj) if (this.obj.isRect) { this.rect.assign(newObj) if (this.contents && this.contents.isImage) { this.contents.width = this.rect.width this.contents.height = this.rect.height } } else if (this.obj.isPoint) { var hx = this.contents.width // var hy = this.contents.height switch(this.ptOffset.substr(0,1)){ case 'u': hy = 0; break; case 'c': hy = Math.floor(hy / 2); break; } switch(this.ptOffset.substr(1,1)){ case 'l': hx = 0; break; case 'c': hx = Math.floor(hx / 2); break; } this.rect.moveTo(newObj.x - hx, newObj.y - hy) } this.updateBox() } /* ============================================================================================ ============================================================================================ JS-GIS project classes Class definitions: TProject TZoomLevel TTileSet TObjArray TTileSetArray (inherits from TObjArray) ============================================================================================ ============================================================================================ */ /* TProject class ============================================================================================ */ function TProject(aName, minX, minY, apixWidth, apixHeight, aImgExt, aImgMapExt) { this.name = aName this.pixWidth = apixWidth this.pixHeight = apixHeight this.imgExt = (aImgExt) ? aImgExt : '.png' this.imgmapExt = (aImgMapExt) ? aImgMapExt : '.js' this.extent = new TRect(minX, minY, minX + 9999999, minY + 9999999, 1) this.zoomLevels = new TObjArray() this.themes = new TTileSetArray() this.imagemaps = new TTileSetArray() this.rootDir = document.location.href.substring(0, document.location.href.lastIndexOf('/') + 1) this.mapDir = this.rootDir + 'maps/' this.nomap = this.mapDir + 'nomap' + this.imgExt this.numWidth = 3 this.className = 'TProject' this.version = '2' this.addZoomLevel = TProject_addZoomLevel this.addTheme = TProject_addTheme this.addImagemap = TProject_addImagemap } function TProject_addZoomLevel(aName, aFolder, ageoWidth, ageoHeight, anumTilesX, anumTilesY, aScale) { this.zoomLevels.items[this.zoomLevels.items.length] = new TZoomLevel(this, aName, aFolder, ageoWidth, ageoHeight, anumTilesX, anumTilesY, aScale) this.extent.resize( Math.min(this.extent.width, ageoWidth * anumTilesX), Math.min(this.extent.height, ageoHeight * anumTilesY)) } function TProject_addTheme(aName, aFolder, aLevelList, aDescription) { this.themes.items[this.themes.items.length] = new TTileSet(this, aName, aFolder, aLevelList, aDescription, this.imgExt) } function TProject_addImagemap(aName, aFolder, aLevelList, aDescription) { this.imagemaps.items[this.imagemaps.items.length] = new TTileSet(this, aName, aFolder, aLevelList, aDescription, this.imgmapExt) } /* TZoomLevel class ============================================================================================ */ function TZoomLevel(aProject, aName, aFolder, ageoWidth, ageoHeight, anumTilesX, anumTilesY, aScale) { this.project = aProject this.name = aName this.folder = aFolder this.geoWidth = ageoWidth this.geoHeight = ageoHeight this.zoom = ageoWidth this.numTilesX = anumTilesX this.numTilesY = anumTilesY this.scale = aScale this.tiles = new TRect(1, 1, anumTilesX + 1, anumTilesY + 1, 1) this.extent = new TRect(aProject.extent.min.x, aProject.extent.min.y, aProject.extent.min.x + anumTilesX * ageoWidth, aProject.extent.min.y + anumTilesY * ageoHeight, 1) this.getTiles = TZoomLevel_getTiles this.getPath = TZoomLevel_getPath } function TZoomLevel_getTiles(obj) { if (obj.isPoint) { obj = obj.translate(this.extent, this.tiles) obj.x = Math.floor(obj.x) obj.y = Math.floor(obj.y) return obj } else if (obj.isRect) { min = this.getTiles(obj.min) max = this.getTiles(obj.max) return new TRect(min.x, min.y, max.x, max.y, 1) } } function TZoomLevel_getPath() { return this.project.mapDir + this.folder + "/" } /* TTileSet class ============================================================================================ */ function TTileSet(aProject, aName, aFolder, aLevelList, aDescription, aExtension) { this.project = aProject this.name = aName this.folder = aFolder this.levelList = aLevelList this.description = aDescription this.extension = aExtension this.prefix = 'tile' this.getPath = TTileSet_getPath this.isAvailable = TTileSet_isAvailable this.getTileURL = TTileSet_getTileURL this.getTileName = TTileSet_getTileName this.noTile = TTileSet_noTile } function TTileSet_isAvailable(zoom) { return (this.levelList.indexOf(zoom) >= 0) } function TTileSet_getPath(zoom) { var z = this.project.zoomLevels.get(zoom) if (z) return z.getPath() + this.folder + '/' else return '' } function TTileSet_getTileURL(row, col, zoom) { var n = this.getTileName(row, col, zoom) if (!n) return this.noTile() return this.getPath(zoom) + n + this.extension } function TTileSet_getTileName(row, col, zoom) { var z = this.project.zoomLevels.get(zoom) if (!z || !this.isAvailable(zoom) || (col < 1) || (col > z.numTilesX) || (row < 1) || (row > z.numTilesY)) return '' else return this.prefix + leadingZero(row, this.project.numWidth) + leadingZero(col, this.project.numWidth) } function TTileSet_noTile() { return this.project.nomap } /* TObjArray ============================================================================================ */ function TObjArray() { this.items = new Array() this.get = TObjArray_get } function TObjArray_get(id) { if ((!isNaN(id)) && (id >= 0) && (id < this.items.length)) return this.items[id] else { id = (id + '').toLowerCase() for (ct = 0; ct < this.items.length; ct++) if ((this.items[ct].name) && (this.items[ct].name.toLowerCase() == id)) return this.items[id] return '' } } /* TTileSetArray ============================================================================================ */ function TTileSetArray() { this.inherited = TObjArray this.inherited() this.firstAvail = TTileSetArray_firstAvail } function TTileSetArray_firstAvail(zoom) { for(i = 0; i <= this.items.length; i++) if (this.items[i].isAvailable(zoom)) return i return -1 } /* ============================================================================================ ============================================================================================ Globals ============================================================================================ ============================================================================================ */ function normalizeNumber(n, aMin, aMax) { return (n < aMin) ? aMin : ((n > aMax) ? aMax : n) } function leadingZero(n, width) { var s = n.toString() while(s.length < width) s = '0' + s return s }