Project

General

Profile

1
<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
2
<html>
3
<head>
4
<title>
5
<a href='http://mapbuilder.sourceforge.net'>Community Map Builder</a> 27 Apr 2008 Overview
6
</title>
7
<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
8
<script>
9
function asd() {
10
	
11
		parent.document.title="MapScaleBar.js Overview";
12
	
13
}
14
</script>
15
</head>
16
<body bgcolor="white" onload="asd();">
17

    
18
<!-- ========== START OF NAVBAR ========== -->
19
<a name="navbar_top"><!-- --></a>
20
<table border="0" width="100%" cellpadding="1" cellspacing="0">
21
<tr>
22
<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
23
<a name="navbar_top_firstrow"><!-- --></a>
24
<table border="0" cellpadding="0" cellspacing="3">
25
  <tr align="center" valign="top">
26
  
27
  
28
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a>&nbsp;</td>
29
  <td bgcolor="#FFFFFF" class="NavBarCell1Rev">	&nbsp;<font class="NavBarFont1Rev"><b>File</b></font>&nbsp;</td>
30
  
31

    
32
  <td bgcolor="#FFFFFF" class="NavBarCell1"> 	<font class="NavBarFont1">Class</font>&nbsp;</td>
33
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a>&nbsp;</td>
34
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a>&nbsp;</td>
35
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a>&nbsp;</td>
36
  </tr>
37
</table>
38
</td>
39
<td bgcolor="#EEEEFF" align="right" valign="top">
40
<em>
41
<b><a href='http://mapbuilder.sourceforge.net'>Community Map Builder</a> 27 Apr 2008</b></em>
42
</td>
43
</tr>
44

    
45
<tr>
46
<td bgcolor="white" class="NavBarCell2"><font size="-2">
47
&nbsp;PREV&nbsp;
48
&nbsp;NEXT</font></td>
49
<td bgcolor="white" class="NavBarCell2"><font size="-2">
50
  <a href="index.html" target="_top"><b>FRAMES</b></a>  &nbsp;
51
&nbsp;<a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
52
&nbsp;&nbsp;
53
<script>
54
  <!--
55
  if(window==top) {
56
    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
57
  }
58
  //-->
59
</script>
60
<noscript>
61
<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
62
</noscript>
63
</font></td>
64
</tr>
65
</table>
66
<!-- =========== END OF NAVBAR =========== -->
67

    
68
<hr>
69
<center>
70
	
71
	   <h2>MapScaleBar.js</h2>
72
	
73
</center>
74

    
75
	
76

    
77

    
78
<h4>Summary</h4>
79
<p>
80
	
81
		No overview generated for 'MapScaleBar.js'<BR/><BR/>
82
	
83
</p>
84

    
85
<hr>
86

    
87

    
88
    <table border="1" cellpadding="3" cellspacing="0" width="100%">
89
    <tr bgcolor="#CCCCFF" class="TableHeadingColor">
90
    <td colspan=2><font size="+2">
91
    
92
        <b>Class Summary</b>
93
    
94
    </font></td>
95
    </tr>
96
    
97
    <tr bgcolor="white" class="TableRowColor">
98
    <td width="15%"><b><a href="MapScaleBar.html">MapScaleBar</a></b></td>
99
    <td>&nbsp;</td>
100
    </tr>
101
    
102
    <tr bgcolor="white" class="TableRowColor">
103
    <td width="15%"><b><a href="HandsomeNumber.html">HandsomeNumber</a></b></td>
104
    <td>&nbsp;</td>
105
    </tr>
106
    
107
    </table>
108
    <hr/> 
109

    
110

    
111
<!-- ========== METHOD SUMMARY =========== -->
112

    
113
	<a name="method_summary"><!-- --></a>
114
	<table border="1" cellpadding="3" cellspacing="0" width="100%">
115
		<tr bgcolor="#CCCCFF" class="TableHeadingColor">
116
			<td colspan=2>
117
				<font size="+2">
118
					<b>Method Summary</b>
119
				</font>
120
			</td>
121
		</tr>
122
	
123
		
124
		   <tr bgcolor="white" class="TableRowColor">
125
		      <td align="right" valign="top" width="1%">
126
			 <font size="-1">
127
			    <code>static&nbsp;Object</code>
128
			 </font>
129
		      </td>
130
		      <td>
131
			 <code>
132
			    <b>
133
			       <a href="GLOBALS.html#formatNumber">formatNumber</a></b>(aNumber, numDecimals)
134
			 </code>
135
			 <br>
136
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
137
			 
138
		      </td>
139
		   </tr>
140
		
141
		   <tr bgcolor="white" class="TableRowColor">
142
		      <td align="right" valign="top" width="1%">
143
			 <font size="-1">
144
			    <code>static&nbsp;Object</code>
145
			 </font>
146
		      </td>
147
		      <td>
148
			 <code>
149
			    <b>
150
			       <a href="GLOBALS.html#styleValue">styleValue</a></b>(aSelector, styleKey)
151
			 </code>
152
			 <br>
153
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
154
			 
155
		      </td>
156
		   </tr>
157
		
158
	
159
	</table>
160
    <p>
161

    
162
<!-- ========== END METHOD SUMMARY =========== -->
163

    
164

    
165
        <pre class="sourceview"><span class="comment">/*
166
JavaScript Scalebar for MapServer (scalebar.js)
167

    
168
Copyright (c) 2005 Tim Schaub of CommEn Space (http://www.commenspace.org)
169

    
170
This is free software; you can redistribute it and/or modify it under
171
the terms of the GNU Lesser General Public License as published by the
172
Free Software Foundation; either version 2.1 of the License, or (at
173
your option) any later version.
174

    
175
This software is distributed in the hope that it will be useful, but
176
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
177
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
178
License for more details.
179

    
180
You should have received a copy of the GNU Lesser General Public License
181
along with this software; if not, write to the Free Software Foundation,
182
Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
183

    
184
v1.3 - scalebar is now centered on .sbWrapper div by default, more css control
185
     - reduced likelihood of displaying very large numbers
186
     - added condition to deal with <span class="attrib">@import</span> styles (thanks dokai)
187

    
188
*/</span>
189
<span class="comment">/*
190
adapted from http://mapserver.commenspace.org/tools/scalebar/
191

    
192
$Id: MapScaleBar.js 3879 2008-02-27 14:20:29Z gjvoosten $
193
*/</span>
194
<span class="comment">
195
// Ensure this object's dependancies are loaded.</span>
196
mapbuilder.loadScript(baseDir+<span class="literal">"/widget/WidgetBase.js"</span>);
197

    
198
<span class="comment">/**
199
 * Widget to display the scale of a map as a graphical bar.  The model of this widget
200
 * must have an extent object associated with it which is the case when the 
201
 * model has a MapContanier widget.
202
 *
203
 * <span class="attrib">@constructor</span>
204
 * <span class="attrib">@base</span> WidgetBase
205
 * <span class="attrib">@param</span> widgetNode  This widget's object node from the configuration document.
206
 * <span class="attrib">@param</span> model       The model that this widget is a view of.
207
 */</span>
208

    
209
<span class="reserved">function</span> MapScaleBar(widgetNode, model) {
210
  WidgetBase.apply(<span class="reserved">this</span>,new Array(widgetNode, model));
211
<span class="comment">
212
  // default properties</span>
213
<span class="comment">  // may be modified after construction</span>
214
<span class="comment">  // if modified after ScaleBar.place(), use ScaleBar.update()</span>
215
  <span class="reserved">this</span>.scaleDenominator = 1;    //<span class="reserved">this</span> will get updated on the first paint
216

    
217
  <span class="reserved">this</span>.displaySystem = <span class="reserved">this</span>.getProperty(<span class="literal">"mb:displaySystem"</span>, <span class="literal">"metric"</span>); // metric, english or nautical supported
218
  <span class="reserved">this</span>.minWidth = <span class="reserved">this</span>.getProperty(<span class="literal">"mb:minWidth"</span>, 100); // pixels
219
  <span class="reserved">this</span>.maxWidth = <span class="reserved">this</span>.getProperty(<span class="literal">"mb:maxWidth"</span>, 200); // pixels
220
  <span class="reserved">this</span>.divisions = <span class="reserved">this</span>.getProperty(<span class="literal">"mb:divisions"</span>, 2);
221
  <span class="reserved">this</span>.subdivisions = <span class="reserved">this</span>.getProperty(<span class="literal">"mb:subdivisions"</span>, 2);
222
  <span class="reserved">this</span>.showMinorMeasures = Mapbuilder.parseBoolean(<span class="reserved">this</span>.getProperty(<span class="literal">"mb:showMinorMeasures"</span>, false));
223
  <span class="reserved">this</span>.abbreviateLabel = Mapbuilder.parseBoolean(<span class="reserved">this</span>.getProperty(<span class="literal">"mb:abbreviateLabel"</span>, false));
224
  <span class="reserved">this</span>.singleLine = Mapbuilder.parseBoolean(<span class="reserved">this</span>.getProperty(<span class="literal">"mb:singleLine"</span>, false));
225
  <span class="reserved">this</span>.align = <span class="reserved">this</span>.getProperty(<span class="literal">"mb:align"</span>, <span class="literal">"center"</span>); // left, center, or right supported
226
  <span class="reserved">this</span>.resolution = 72; // dpi
227
<span class="comment">
228
  // create scalebar elements</span>
229
  <span class="reserved">this</span>.containerId = <span class="reserved">this</span>.outputNodeId;
230
  <span class="reserved">this</span>.labelContainerId = <span class="reserved">this</span>.containerId + <span class="literal">"Label"</span>;
231
  <span class="reserved">this</span>.graphicsContainerId = <span class="reserved">this</span>.containerId + <span class="literal">"Graphics"</span>;
232
  <span class="reserved">this</span>.numbersContainerId = <span class="reserved">this</span>.containerId + <span class="literal">"Numbers"</span>;
233

    
234
  <span class="comment">/**
235
   * adds a bbox listener on the model 
236
   */</span>
237
  <span class="reserved">this</span>.model.addListener(<span class="literal">"bbox"</span>, <span class="reserved">this</span>.update, <span class="reserved">this</span>);
238
  <span class="reserved">this</span>.model.addListener(<span class="literal">"refresh"</span>, <span class="reserved">this</span>.update, <span class="reserved">this</span>);
239
}
240

    
241
MapScaleBar.<span class="reserved">prototype</span>.getContainerNode = <span class="reserved">function</span>() {
242
  var node = document.getElementById(<span class="reserved">this</span>.containerId);
243
  <span class="reserved">if</span> (!node) {
244
    var node = document.createElement(<span class="literal">'div'</span>);
245
    node.className = <span class="literal">'sbWrapper'</span>;
246
    node.style.position = <span class="literal">'relative'</span>;
247
    node.setAttribute(<span class="literal">"id"</span>,<span class="reserved">this</span>.containerId);
248
  }
249
  <span class="reserved">return</span> node;
250
}
251
MapScaleBar.<span class="reserved">prototype</span>.getGraphicsContainerNode = <span class="reserved">function</span>() {
252
  var node = document.getElementById(<span class="reserved">this</span>.graphicsContainerId);
253
  <span class="reserved">if</span> (!node) {
254
    var node = document.createElement(<span class="literal">'div'</span>);
255
    node.style.position = <span class="literal">'absolute'</span>;
256
    node.className = <span class="literal">'sbGraphicsContainer'</span>;
257
    node.setAttribute(<span class="literal">"id"</span>,<span class="reserved">this</span>.graphicsContainerId);
258
<span class="comment">
259
    // put in some markers and bar pieces so style attributes can be grabbed</span>
260
<span class="comment">    // this is a solution for Safari support</span>
261
    var markerMajor = document.createElement(<span class="literal">'div'</span>);
262
    markerMajor.className = <span class="literal">'sbMarkerMajor'</span>;
263
    node.appendChild(markerMajor);
264
    var markerMinor = document.createElement(<span class="literal">'div'</span>);
265
    markerMinor.className = <span class="literal">'sbMarkerMinor'</span>;
266
    node.appendChild(markerMinor);
267
    var barPiece = document.createElement(<span class="literal">'div'</span>);
268
    barPiece.className = <span class="literal">'sbBar'</span>;
269
    node.appendChild(barPiece);
270
    var barPieceAlt = document.createElement(<span class="literal">'div'</span>);
271
    barPieceAlt.className = <span class="literal">'sbBarAlt'</span>;
272
    node.appendChild(barPieceAlt);
273
  }
274
  <span class="reserved">return</span> node;
275
}
276
MapScaleBar.<span class="reserved">prototype</span>.getLabelContainerNode = <span class="reserved">function</span>() {
277
  var node = document.getElementById(<span class="reserved">this</span>.labelContainerId);
278
  <span class="reserved">if</span> (!node) {
279
    var node = document.createElement(<span class="literal">'div'</span>);
280
    node.className = <span class="literal">'sbUnitsContainer'</span>;
281
    node.style.position = <span class="literal">'absolute'</span>;
282
    node.setAttribute(<span class="literal">"id"</span>,<span class="reserved">this</span>.labelContainerId);
283
  }
284
  <span class="reserved">return</span> node;
285
}
286
MapScaleBar.<span class="reserved">prototype</span>.getNumbersContainerNode = <span class="reserved">function</span>() {
287
  var node = document.getElementById(<span class="reserved">this</span>.numbersContainerId);
288
  <span class="reserved">if</span> (!node) {
289
    var node = document.createElement(<span class="literal">'div'</span>);
290
    node.style.position = <span class="literal">'absolute'</span>;
291
    node.className = <span class="literal">'sbNumbersContainer'</span>;
292
    node.setAttribute(<span class="literal">"id"</span>,<span class="reserved">this</span>.numbersContainerId);
293
  }
294
  <span class="reserved">return</span> node;
295
}
296

    
297
<span class="comment">/**
298
 * Render the widget.
299
 * <span class="attrib">@param</span> objRef Pointer to widget object.
300
 */</span>
301
MapScaleBar.<span class="reserved">prototype</span>.update = <span class="reserved">function</span>(objRef) {
302
<span class="comment">
303
  //create the output node the first time this is called</span>
304
  var outputNode = document.getElementById( objRef.outputNodeId );
305
  <span class="reserved">if</span> (!outputNode) objRef.getNode().appendChild(objRef.getContainerNode());
306

    
307
  var scaleDenominator = objRef.model.map.getScale();
308
	<span class="reserved">if</span>(scaleDenominator != null) {
309
		objRef.scaleDenominator = scaleDenominator;
310
	}
311
<span class="comment">	// local functions (and object constructors)</span>
312
	<span class="reserved">function</span> HandsomeNumber(smallUglyNumber, bigUglyNumber, sigFigs) {
313
		var sigFigs = (sigFigs == null) ? 10 : sigFigs;
314
		var bestScore = Number.POSITIVE_INFINITY;
315
		var bestTieBreaker = Number.POSITIVE_INFINITY;
316
<span class="comment">		// if all else fails, return a small ugly number</span>
317
		var handsomeValue = smallUglyNumber;
318
		var handsomeNumDec = 3;
319
<span class="comment">		// try the first three comely multiplicands (in order of comliness)</span>
320
		<span class="reserved">for</span>(var halvingExp = 0; halvingExp &lt; 3; ++halvingExp) {
321
			var comelyMultiplicand = Math.pow(2, (-1 * halvingExp));
322
			var maxTensExp = Math.floor(Math.log(bigUglyNumber / comelyMultiplicand) / Math.LN10)
323
			<span class="reserved">for</span>(var tensExp = maxTensExp; tensExp &gt; (maxTensExp - sigFigs + 1); --tensExp) {
324
				var numDec = Math.max(halvingExp - tensExp, 0);
325
				var testMultiplicand = comelyMultiplicand * Math.pow(10, tensExp);
326
<span class="comment">				// check if there is an integer multiple of testMultiplicand between smallUglyNumber and bigUglyNumber</span>
327
				<span class="reserved">if</span>((testMultiplicand * Math.floor(bigUglyNumber / testMultiplicand)) &gt;= smallUglyNumber) {
328
<span class="comment">					// check if smallUglyNumber is an integer multiple of testMultiplicand</span>
329
					<span class="reserved">if</span>(smallUglyNumber % testMultiplicand == 0) {
330
						var testMultiplier = smallUglyNumber / testMultiplicand;
331
					}
332
<span class="comment">					// otherwise go for the smallest integer multiple between small and big</span>
333
					<span class="reserved">else</span> {
334
						var testMultiplier = Math.floor(smallUglyNumber / testMultiplicand) + 1;
335
					}
336
<span class="comment">					// test against the best (lower == better)</span>
337
					var testScore = testMultiplier + (2 * halvingExp);
338
					var testTieBreaker = (tensExp &lt; 0) ? (Math.abs(tensExp) + 1) : tensExp;
339
					<span class="reserved">if</span>((testScore &lt; bestScore) || ((testScore == bestScore) &amp;&amp; (testTieBreaker &lt; bestTieBreaker))) {
340
						bestScore = testScore;
341
						bestTieBreaker = testTieBreaker;
342
						handsomeValue = (testMultiplicand * testMultiplier).toFixed(numDec);
343
						handsomeNumDec = numDec;
344
					}
345
				}
346
			}
347
		}
348
		<span class="reserved">this</span>.value = handsomeValue;
349
		<span class="reserved">this</span>.score = bestScore;
350
		<span class="reserved">this</span>.tieBreaker = bestTieBreaker;
351
		<span class="reserved">this</span>.numDec = handsomeNumDec;
352
	}
353
	HandsomeNumber.<span class="reserved">prototype</span>.toString = <span class="reserved">function</span>() {
354
		<span class="reserved">return</span> <span class="reserved">this</span>.value.toString();
355
	}
356
	HandsomeNumber.<span class="reserved">prototype</span>.valueOf = <span class="reserved">function</span>() {
357
		<span class="reserved">return</span> <span class="reserved">this</span>.value;
358
	}
359
	<span class="reserved">function</span> styleValue(aSelector, styleKey) {
360
<span class="comment">		// returns an integer value associated with a particular selector and key</span>
361
<span class="comment">		// given a stylesheet with .someSelector {border: 2px solid red}</span>
362
<span class="comment">		// styleValue('.someSelector', 'borderWidth') returns 2</span>
363
		var aValue = 0;
364
		<span class="reserved">if</span>(document.styleSheets) {
365
			<span class="reserved">for</span>(var sheetIndex = document.styleSheets.length - 1; sheetIndex &gt;= 0; --sheetIndex) {
366
				var aSheet = document.styleSheets[sheetIndex];
367
				<span class="reserved">if</span>(!aSheet.disabled) {
368
					var allRules;
369
					<span class="reserved">if</span>(typeof(aSheet.rules) == <span class="literal">'undefined'</span>) {
370
						<span class="reserved">if</span>(typeof(aSheet.rules) == <span class="literal">'undefined'</span>) {
371
<span class="comment">							// can't get rules, assume zero</span>
372
							<span class="reserved">return</span> 0;
373
						}
374
						<span class="reserved">else</span> {
375
							allRules = aSheet.rules;
376
						}
377
					}
378
					<span class="reserved">else</span> {
379
						allRules = aSheet.rules;
380
					}
381
					<span class="reserved">for</span>(var ruleIndex = 0; ruleIndex &lt; allRules.length; ++ruleIndex) {
382
						var aRule = allRules[ruleIndex];
383
						<span class="reserved">if</span>(aRule.selectorText &amp;&amp; (aRule.selectorText.toLowerCase() == aSelector.toLowerCase())) {
384
							<span class="reserved">if</span>(aRule.style[styleKey] != <span class="literal">''</span>) {
385
								aValue = parseInt(aRule.style[styleKey]);
386
							}
387
						}
388
					}
389
				}
390
			}
391
		}
392
<span class="comment">		// if the styleKey was not found, the equivalent value is zero</span>
393
		<span class="reserved">return</span> aValue ? aValue : 0;
394
	}
395
	<span class="reserved">function</span> formatNumber(aNumber, numDecimals) {
396
		numDecimals = (numDecimals) ? numDecimals : 0;
397
		var formattedInteger = <span class="literal">''</span> + Math.round(aNumber);
398
		var thousandsPattern = /(-?[0-9]+)([0-9]{3})/;
399
		<span class="reserved">while</span>(thousandsPattern.test(formattedInteger)) {
400
			formattedInteger = formattedInteger.replace(thousandsPattern, <span class="literal">'$1,$2'</span>);
401
		}
402
		<span class="reserved">if</span>(numDecimals &gt; 0) {
403
			var formattedDecimal = Math.floor(Math.pow(10, numDecimals) * (aNumber - Math.round(aNumber)));
404
			<span class="reserved">if</span>(formattedDecimal == 0) {
405
				<span class="reserved">return</span> formattedInteger;
406
			}
407
			<span class="reserved">else</span> {
408
				<span class="reserved">return</span> formattedInteger + <span class="literal">'.'</span> + formattedDecimal;
409
			}
410
		}
411
		<span class="reserved">else</span> {
412
			<span class="reserved">return</span> formattedInteger;
413
		}
414
	}
415
<span class="comment">	// update the container title (for displaying scale as a tooltip)</span>
416
	var container = objRef.getContainerNode();
417
	var graphicsContainer = objRef.getGraphicsContainerNode();
418
	var labelContainer = objRef.getLabelContainerNode();
419
	var numbersContainer = objRef.getNumbersContainerNode();
420
	container.title = mbGetMessage(<span class="literal">"scale"</span>, formatNumber(objRef.scaleDenominator));
421
<span class="comment">	// measurementProperties holds display units, abbreviations,</span>
422
<span class="comment">	// and conversion to inches (since we're using dpi) - per measurement sytem</span>
423
	var measurementProperties = new Object();
424
	measurementProperties.english = {
425
		units: [mbGetMessage(<span class="literal">"unitMiles"</span>), mbGetMessage(<span class="literal">"unitFeet"</span>), mbGetMessage(<span class="literal">"unitInches"</span>)],
426
		abbr: [mbGetMessage(<span class="literal">"unitMilesAbbr"</span>), mbGetMessage(<span class="literal">"unitFeetAbbr"</span>), mbGetMessage(<span class="literal">"unitInchesAbbr"</span>)],
427
		inches: [63360, 12, 1]
428
	}
429
	measurementProperties.nautical = {
430
		units: [mbGetMessage(<span class="literal">"unitNauticalMiles"</span>), mbGetMessage(<span class="literal">"unitFeet"</span>), mbGetMessage(<span class="literal">"unitInches"</span>)],
431
		abbr: [mbGetMessage(<span class="literal">"unitNauticalMilesAbbr"</span>), mbGetMessage(<span class="literal">"unitFeetAbbr"</span>), mbGetMessage(<span class="literal">"unitInchesAbbr"</span>)],
432
		inches: [72913.3860, 12, 1]
433
	}
434
	measurementProperties.metric = {
435
		units: [mbGetMessage(<span class="literal">"unitKilometers"</span>), mbGetMessage(<span class="literal">"unitMeters"</span>), mbGetMessage(<span class="literal">"unitCentimeters"</span>)],
436
		abbr: [mbGetMessage(<span class="literal">"unitKilometersAbbr"</span>), mbGetMessage(<span class="literal">"unitMetersAbbr"</span>), mbGetMessage(<span class="literal">"unitCentimetersAbbr"</span>)],
437
		inches: [39370.07874, 39.370079, 0.393701]
438
	}
439
<span class="comment">	// check each measurement unit in the display system</span>
440
	var comparisonArray = new Array();
441
	<span class="reserved">for</span>(var unitIndex = 0; unitIndex &lt; measurementProperties[objRef.displaySystem].units.length; ++unitIndex) {
442
		comparisonArray[unitIndex] = new Object();
443
		var pixelsPerDisplayUnit = objRef.resolution * measurementProperties[objRef.displaySystem].inches[unitIndex] / objRef.scaleDenominator;
444
		var minSDDisplayLength = (objRef.minWidth / pixelsPerDisplayUnit) / (objRef.divisions * objRef.subdivisions);
445
		var maxSDDisplayLength = (objRef.maxWidth / pixelsPerDisplayUnit) / (objRef.divisions * objRef.subdivisions);
446
<span class="comment">		// add up scores for each marker (even if numbers aren't displayed)</span>
447
		<span class="reserved">for</span>(var valueIndex = 0; valueIndex &lt; (objRef.divisions * objRef.subdivisions); ++valueIndex) {
448
			var minNumber = minSDDisplayLength * (valueIndex + 1);
449
			var maxNumber = maxSDDisplayLength * (valueIndex + 1);
450
			var niceNumber = new HandsomeNumber(minNumber, maxNumber);
451
			comparisonArray[unitIndex][valueIndex] = {value: (niceNumber.value / (valueIndex + 1)), score: 0, tieBreaker: 0, numDec: 0, displayed: 0};
452
<span class="comment">			// now tally up scores for all values given this subdivision length</span>
453
			<span class="reserved">for</span>(var valueIndex2 = 0; valueIndex2 &lt; (objRef.divisions * objRef.subdivisions); ++valueIndex2) {
454
				displayedValuePosition = niceNumber.value * (valueIndex2 + 1) / (valueIndex + 1);
455
				niceNumber2 = new HandsomeNumber(displayedValuePosition, displayedValuePosition);
456
				var isMajorMeasurement = ((valueIndex2 + 1) % objRef.subdivisions == 0);
457
				var isLastMeasurement = ((valueIndex2 + 1) == (objRef.divisions * objRef.subdivisions));
458
				<span class="reserved">if</span>((objRef.singleLine &amp;&amp; isLastMeasurement) || (!objRef.singleLine &amp;&amp; (isMajorMeasurement || objRef.showMinorMeasures))) {
459
<span class="comment">					// count scores for displayed marker measurements</span>
460
					comparisonArray[unitIndex][valueIndex].score += niceNumber2.score;
461
					comparisonArray[unitIndex][valueIndex].tieBreaker += niceNumber2.tieBreaker;
462
					comparisonArray[unitIndex][valueIndex].numDec = Math.max(comparisonArray[unitIndex][valueIndex].numDec, niceNumber2.numDec);
463
					comparisonArray[unitIndex][valueIndex].displayed += 1;
464
				}
465
				<span class="reserved">else</span> {
466
<span class="comment">					// count scores for non-displayed marker measurements</span>
467
					comparisonArray[unitIndex][valueIndex].score += niceNumber2.score / objRef.subdivisions;
468
					comparisonArray[unitIndex][valueIndex].tieBreaker += niceNumber2.tieBreaker / objRef.subdivisions;
469
				}
470
			}
471
<span class="comment">			// adjust scores so numbers closer to 1 are preferred for display</span>
472
			var scoreAdjustment = (unitIndex + 1) * comparisonArray[unitIndex][valueIndex].tieBreaker / comparisonArray[unitIndex][valueIndex].displayed;
473
			comparisonArray[unitIndex][valueIndex].score *= scoreAdjustment;
474
		}
475
	}
476
<span class="comment">	// get the value (subdivision length) with the lowest cumulative score</span>
477
	var subdivisionDisplayLength = null;
478
	var displayUnits = null;
479
	var displayUnitsAbbr = null;
480
	var subdivisionPixelLength = null;
481
	var bestScore = Number.POSITIVE_INFINITY;
482
	var bestTieBreaker = Number.POSITIVE_INFINITY;
483
	var numDec = 0;
484
	<span class="reserved">for</span>(var unitIndex = 0; unitIndex &lt; comparisonArray.length; ++unitIndex) {
485
		<span class="reserved">for</span>(valueIndex in comparisonArray[unitIndex]) {
486
			<span class="reserved">if</span>((comparisonArray[unitIndex][valueIndex].score &lt; bestScore) || ((comparisonArray[unitIndex][valueIndex].score == bestScore) &amp;&amp; (comparisonArray[unitIndex][valueIndex].tieBreaker &lt; bestTieBreaker))) {
487
				bestScore = comparisonArray[unitIndex][valueIndex].score;
488
				bestTieBreaker = comparisonArray[unitIndex][valueIndex].tieBreaker;
489
				subdivisionDisplayLength = comparisonArray[unitIndex][valueIndex].value;
490
				numDec = comparisonArray[unitIndex][valueIndex].numDec;
491
				displayUnits = measurementProperties[objRef.displaySystem].units[unitIndex];
492
				displayUnitsAbbr = measurementProperties[objRef.displaySystem].abbr[unitIndex];
493
				pixelsPerDisplayUnit = objRef.resolution * measurementProperties[objRef.displaySystem].inches[unitIndex] / objRef.scaleDenominator;
494
				subdivisionPixelLength = pixelsPerDisplayUnit * subdivisionDisplayLength; // round before use in style
495
			}
496
		}
497
	}
498
<span class="comment">	// determine offsets for graphic elements</span>
499
	var xOffsetMarkerMajor = (styleValue(<span class="literal">'.sbMarkerMajor'</span>, <span class="literal">'borderLeftWidth'</span>) + styleValue(<span class="literal">'.sbMarkerMajor'</span>, <span class="literal">'width'</span>) + styleValue(<span class="literal">'.sbMarkerMajor'</span>, <span class="literal">'borderRightWidth'</span>)) / 2;
500
	var xOffsetMarkerMinor = (styleValue(<span class="literal">'.sbMarkerMinor'</span>, <span class="literal">'borderLeftWidth'</span>) + styleValue(<span class="literal">'.sbMarkerMinor'</span>, <span class="literal">'width'</span>) + styleValue(<span class="literal">'.sbMarkerMinor'</span>, <span class="literal">'borderRightWidth'</span>)) / 2;
501
	var xOffsetBar = (styleValue(<span class="literal">'.sbBar'</span>, <span class="literal">'borderLeftWidth'</span>) + styleValue(<span class="literal">'.sbBar'</span>, <span class="literal">'border-right-width'</span>)) / 2;
502
	var xOffsetBarAlt = (styleValue(<span class="literal">'.sbBarAlt'</span>, <span class="literal">'borderLeftWidth'</span>) + styleValue(<span class="literal">'.sbBarAlt'</span>, <span class="literal">'borderRightWidth'</span>)) / 2;
503
<span class="comment">	// support for browsers without the Document.styleSheets property (Opera)</span>
504
	<span class="reserved">if</span>(!document.styleSheets) {
505
<span class="comment">		// this is a two part hack, one for the offsets here and one for the css below</span>
506
		xOffsetMarkerMajor = 0.5;
507
		xOffsetMarkerMinor = 0.5;
508
	}
509
<span class="comment">	// clean out any old content from containers</span>
510
	<span class="reserved">while</span>(labelContainer.hasChildNodes()) {
511
		labelContainer.removeChild(labelContainer.firstChild);
512
	}
513
	<span class="reserved">while</span>(graphicsContainer.hasChildNodes()) {
514
		graphicsContainer.removeChild(graphicsContainer.firstChild);
515
	}
516
	<span class="reserved">while</span>(numbersContainer.hasChildNodes()) {
517
		numbersContainer.removeChild(numbersContainer.firstChild);
518
	}
519
<span class="comment">	// create all divisions</span>
520
	var aMarker, aBarPiece, numbersBox, xOffset;
521
	var alignmentOffset = {
522
		left: 0,
523
		center: (-1 * objRef.divisions * objRef.subdivisions * subdivisionPixelLength / 2),
524
		right: (-1 * objRef.divisions * objRef.subdivisions * subdivisionPixelLength)
525
	}
526
	var xPosition = 0 + alignmentOffset[objRef.align];
527
	var markerMeasure = 0;
528
	<span class="reserved">for</span>(var divisionIndex = 0; divisionIndex &lt; objRef.divisions; ++divisionIndex) {
529
<span class="comment">		// set xPosition and markerMeasure to start of division</span>
530
		xPosition = divisionIndex * objRef.subdivisions * subdivisionPixelLength;
531
		xPosition += alignmentOffset[objRef.align];
532
		markerMeasure = (divisionIndex == 0) ? 0 : ((divisionIndex * objRef.subdivisions) * subdivisionDisplayLength).toFixed(numDec);
533
<span class="comment">		// add major marker</span>
534
		aMarker = document.createElement(<span class="literal">'div'</span>);
535
		aMarker.className = <span class="literal">'sbMarkerMajor'</span>;
536
		aMarker.style.position = <span class="literal">'absolute'</span>;
537
		aMarker.style.overflow = <span class="literal">'hidden'</span>;
538
		aMarker.style.left = Math.round(xPosition - xOffsetMarkerMajor) + <span class="literal">'px'</span>;
539
		aMarker.appendChild(document.createTextNode(<span class="literal">' '</span>));
540
		graphicsContainer.appendChild(aMarker);
541
<span class="comment">		// add initial measure</span>
542
		<span class="reserved">if</span>(!objRef.singleLine) {
543
			numbersBox = document.createElement(<span class="literal">'div'</span>);
544
			numbersBox.className = <span class="literal">'sbNumbersBox'</span>;
545
			numbersBox.style.position = <span class="literal">'absolute'</span>;
546
			numbersBox.style.overflow = <span class="literal">'hidden'</span>;
547
			numbersBox.style.textAlign = <span class="literal">'center'</span>;
548
			<span class="reserved">if</span>(objRef.showMinorMeasures) {
549
				numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + <span class="literal">'px'</span>;
550
				numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + <span class="literal">'px'</span>;
551
			}
552
			<span class="reserved">else</span> {
553
				numbersBox.style.width = Math.round(objRef.subdivisions * subdivisionPixelLength * 2) + <span class="literal">'px'</span>;
554
				numbersBox.style.left = Math.round(xPosition - (objRef.subdivisions * subdivisionPixelLength)) + <span class="literal">'px'</span>;
555
			}
556
			numbersBox.appendChild(document.createTextNode(markerMeasure));
557
			numbersContainer.appendChild(numbersBox);
558
		}
559
<span class="comment">		// create all subdivisions</span>
560
		<span class="reserved">for</span>(var subdivisionIndex = 0; subdivisionIndex &lt; objRef.subdivisions; ++subdivisionIndex) {
561
			aBarPiece = document.createElement(<span class="literal">'div'</span>);
562
			aBarPiece.style.position = <span class="literal">'absolute'</span>;
563
			aBarPiece.style.overflow = <span class="literal">'hidden'</span>;
564
			aBarPiece.style.width = Math.round(subdivisionPixelLength) + <span class="literal">'px'</span>;
565
			<span class="reserved">if</span>((subdivisionIndex % 2) == 0) {
566
				aBarPiece.className = <span class="literal">'sbBar'</span>;
567
				aBarPiece.style.left = Math.round(xPosition - xOffsetBar) + <span class="literal">'px'</span>;
568
			}
569
			<span class="reserved">else</span> {
570
				aBarPiece.className = <span class="literal">'sbBarAlt'</span>;
571
				aBarPiece.style.left = Math.round(xPosition - xOffsetBarAlt) + <span class="literal">'px'</span>;
572
			}
573
			aBarPiece.appendChild(document.createTextNode(<span class="literal">' '</span>));
574
			graphicsContainer.appendChild(aBarPiece);
575
<span class="comment">			// add minor marker if not the last subdivision</span>
576
			<span class="reserved">if</span>(subdivisionIndex &lt; (objRef.subdivisions - 1)) {
577
<span class="comment">				// set xPosition and markerMeasure to end of subdivision</span>
578
				xPosition = ((divisionIndex * objRef.subdivisions) + (subdivisionIndex + 1)) * subdivisionPixelLength;
579
				xPosition += alignmentOffset[objRef.align];
580
				markerMeasure = (divisionIndex * objRef.subdivisions + subdivisionIndex + 1) * subdivisionDisplayLength;
581
				aMarker = document.createElement(<span class="literal">'div'</span>);
582
				aMarker.className = <span class="literal">'sbMarkerMinor'</span>;
583
				aMarker.style.position = <span class="literal">'absolute'</span>;
584
				aMarker.style.overflow = <span class="literal">'hidden'</span>;
585
				aMarker.style.left = Math.round(xPosition - xOffsetMarkerMinor) + <span class="literal">'px'</span>;
586
				aMarker.appendChild(document.createTextNode(<span class="literal">' '</span>));
587
				graphicsContainer.appendChild(aMarker);
588
				<span class="reserved">if</span>(objRef.showMinorMeasures &amp;&amp; !objRef.singleLine) {
589
<span class="comment">					// add corresponding measure</span>
590
					numbersBox = document.createElement(<span class="literal">'div'</span>);
591
					numbersBox.className = <span class="literal">'sbNumbersBox'</span>;
592
					numbersBox.style.position = <span class="literal">'absolute'</span>;
593
					numbersBox.style.overflow = <span class="literal">'hidden'</span>;
594
					numbersBox.style.textAlign = <span class="literal">'center'</span>;
595
					numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + <span class="literal">'px'</span>;
596
					numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + <span class="literal">'px'</span>;
597
					numbersBox.appendChild(document.createTextNode(markerMeasure));
598
					numbersContainer.appendChild(numbersBox);
599
				}
600
			}
601
		}
602
	}
603
<span class="comment">	// set xPosition and markerMeasure to end of divisions</span>
604
	xPosition = (objRef.divisions * objRef.subdivisions) * subdivisionPixelLength;
605
	xPosition += alignmentOffset[objRef.align];
606
	markerMeasure = ((objRef.divisions * objRef.subdivisions) * subdivisionDisplayLength).toFixed(numDec);
607
<span class="comment">	// add the final major marker</span>
608
	aMarker = document.createElement(<span class="literal">'div'</span>);
609
	aMarker.className = <span class="literal">'sbMarkerMajor'</span>;
610
	aMarker.style.position = <span class="literal">'absolute'</span>;
611
	aMarker.style.overflow = <span class="literal">'hidden'</span>;
612
	aMarker.style.left = Math.round(xPosition - xOffsetMarkerMajor) + <span class="literal">'px'</span>;
613
	aMarker.appendChild(document.createTextNode(<span class="literal">' '</span>));
614
	graphicsContainer.appendChild(aMarker);
615
<span class="comment">	// add final measure</span>
616
	<span class="reserved">if</span>(!objRef.singleLine) {
617
		numbersBox = document.createElement(<span class="literal">'div'</span>);
618
		numbersBox.className = <span class="literal">'sbNumbersBox'</span>;
619
		numbersBox.style.position = <span class="literal">'absolute'</span>;
620
		numbersBox.style.overflow = <span class="literal">'hidden'</span>;
621
		numbersBox.style.textAlign = <span class="literal">'center'</span>;
622
		<span class="reserved">if</span>(objRef.showMinorMeasures) {
623
			numbersBox.style.width = Math.round(subdivisionPixelLength * 2) + <span class="literal">'px'</span>;
624
			numbersBox.style.left = Math.round(xPosition - subdivisionPixelLength) + <span class="literal">'px'</span>;
625
		}
626
		<span class="reserved">else</span> {
627
			numbersBox.style.width = Math.round(objRef.subdivisions * subdivisionPixelLength * 2) + <span class="literal">'px'</span>;
628
			numbersBox.style.left = Math.round(xPosition - (objRef.subdivisions * subdivisionPixelLength)) + <span class="literal">'px'</span>;
629
		}
630
		numbersBox.appendChild(document.createTextNode(markerMeasure));
631
		numbersContainer.appendChild(numbersBox);
632
	}
633
<span class="comment">	// add content to the label container</span>
634
	var labelBox = document.createElement(<span class="literal">'div'</span>);
635
	labelBox.style.position = <span class="literal">'absolute'</span>;
636
	var labelText;
637
	<span class="reserved">if</span>(objRef.singleLine) {
638
		labelText = markerMeasure;
639
		labelBox.className = <span class="literal">'sbLabelBoxSingleLine'</span>;
640
		labelBox.style.top = <span class="literal">'-0.6em'</span>;
641
		labelBox.style.left = (xPosition + 10) + <span class="literal">'px'</span>;
642
	}
643
	<span class="reserved">else</span> {
644
		labelText = <span class="literal">''</span>;
645
		labelBox.className = <span class="literal">'sbLabelBox'</span>;
646
		labelBox.style.textAlign = <span class="literal">'center'</span>;
647
		labelBox.style.width = Math.round(objRef.divisions * objRef.subdivisions * subdivisionPixelLength) + <span class="literal">'px'</span>
648
		labelBox.style.left = Math.round(alignmentOffset[objRef.align]) + <span class="literal">'px'</span>;
649
		labelBox.style.overflow = <span class="literal">'hidden'</span>;
650
	}
651
	<span class="reserved">if</span>(objRef.abbreviateLabel) {
652
		labelText += <span class="literal">' '</span> + displayUnitsAbbr;
653
	}
654
	<span class="reserved">else</span> {
655
		labelText += <span class="literal">' '</span> + displayUnits;
656
	}
657
	labelBox.appendChild(document.createTextNode(labelText));
658
	labelContainer.appendChild(labelBox);
659
<span class="comment">	// support for browsers without the Document.styleSheets property (Opera)</span>
660
	<span class="reserved">if</span>(!document.styleSheets) {
661
<span class="comment">		// override custom css with default</span>
662
		var defaultStyle = document.createElement(<span class="literal">'style'</span>);
663
		defaultStyle.type = <span class="literal">'text/css'</span>;
664
		var styleText = <span class="literal">'.sbBar {top: 0px; background: #666666; height: 1px; border: 0;}'</span>;
665
		styleText += <span class="literal">'.sbBarAlt {top: 0px; background: #666666; height: 1px; border: 0;}'</span>;
666
		styleText += <span class="literal">'.sbMarkerMajor {height: 7px; width: 1px; background: #666666; border: 0;}'</span>;
667
		styleText += <span class="literal">'.sbMarkerMinor {height: 5px; width: 1px; background: #666666; border: 0;}'</span>;
668
		styleText += <span class="literal">'.sbLabelBox {top: -16px;}'</span>;
669
		styleText += <span class="literal">'.sbNumbersBox {top: 7px;}'</span>;
670
		defaultStyle.appendChild(document.createTextNode(styleText));
671
		document.getElementsByTagName(<span class="literal">'head'</span>).item(0).appendChild(defaultStyle);
672
	}
673
<span class="comment">	// append the child containers to the parent container</span>
674
	container.appendChild(graphicsContainer);
675
	container.appendChild(labelContainer);
676
	container.appendChild(numbersContainer);
677
}
678
</pre>
679
	<hr>
680

    
681

    
682

    
683
<!-- ========== START OF NAVBAR ========== -->
684
<a name="navbar_top"><!-- --></a>
685
<table border="0" width="100%" cellpadding="1" cellspacing="0">
686
<tr>
687
<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
688
<a name="navbar_top_firstrow"><!-- --></a>
689
<table border="0" cellpadding="0" cellspacing="3">
690
  <tr align="center" valign="top">
691
  
692
  
693
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a>&nbsp;</td>
694
  <td bgcolor="#FFFFFF" class="NavBarCell1Rev">	&nbsp;<font class="NavBarFont1Rev"><b>File</b></font>&nbsp;</td>
695
  
696

    
697
  <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font>&nbsp;</td>
698
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a>&nbsp;</td>
699
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a>&nbsp;</td>
700
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a>&nbsp;</td>
701
  </tr>
702
</table>
703
</td>
704
<td bgcolor="#EEEEFF" align="right" valign="top"><em>
705
<b><a href='http://mapbuilder.sourceforge.net'>Community Map Builder</a> 27 Apr 2008</b></em>
706
</td>
707
</tr>
708

    
709
<tr>
710
<td bgcolor="white" class="NavBarCell2"><font size="-2">
711
&nbsp;PREV&nbsp;
712
&nbsp;NEXT</font></td>
713
<td bgcolor="white" class="NavBarCell2"><font size="-2">
714
  <a href="index.html" target="_top"><b>FRAMES</b></a>  &nbsp;
715
&nbsp;<a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
716
&nbsp;&nbsp;
717
<script>
718
  <!--
719
  if(window==top) {
720
    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
721
  }
722
  //-->
723
</script>
724
<noscript>
725
<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
726
</noscript>
727
</font></td>
728
</tr>
729
</table>
730
<!-- =========== END OF NAVBAR =========== -->
731

    
732
<hr>
733
<font size="-1">
734

    
735
</font>
736
<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Sun Apr 27 20:30:54 2008</div>
737
</body>
738
</html>
(261-261/316)