1
1
define ( [
2
+ '../Core/AssociativeArray' ,
2
3
'../Core/buildModuleUrl' ,
3
4
'../Core/Check' ,
4
5
'../Core/Credit' ,
7
8
'../Core/defineProperties' ,
8
9
'../Core/destroyObject'
9
10
] , function (
11
+ AssociativeArray ,
10
12
buildModuleUrl ,
11
13
Check ,
12
14
Credit ,
@@ -52,95 +54,68 @@ define([
52
54
creditDisplay . _previousCesiumCredit = currentCredit ;
53
55
}
54
56
55
- function displayCredits ( creditDisplay , credits ) {
56
- var i ;
57
- var index ;
58
- var credit ;
59
- var displayedCredits = creditDisplay . _displayedCredits . screenCredits ;
60
- var container = creditDisplay . _screenContainer ;
61
- for ( i = 0 ; i < credits . length ; i ++ ) {
62
- credit = credits [ i ] ;
63
- if ( defined ( credit ) ) {
64
- index = displayedCredits . indexOf ( credit ) ;
65
- if ( index === - 1 ) {
66
- var element = credit . element ;
67
- if ( container . hasChildNodes ( ) ) {
68
- var del = document . createElement ( 'span' ) ;
69
- del . textContent = creditDisplay . _delimiter ;
70
- del . className = 'cesium-credit-delimiter' ;
71
- container . appendChild ( del ) ;
72
- }
73
- container . appendChild ( element ) ;
74
- } else {
75
- displayedCredits . splice ( index , 1 ) ;
76
- }
77
- }
78
- }
79
- }
57
+ var delimiterClassName = 'cesium-credit-delimiter' ;
80
58
81
- function displayLightboxCredits ( creditDisplay , lighboxCredits ) {
82
- var i ;
83
- var index ;
84
- var credit ;
85
- var displayedCredits = creditDisplay . _displayedCredits . lightboxCredits ;
86
- var container = creditDisplay . _creditList ;
87
- for ( i = 0 ; i < lighboxCredits . length ; i ++ ) {
88
- credit = lighboxCredits [ i ] ;
89
- if ( defined ( credit ) ) {
90
- index = displayedCredits . indexOf ( credit ) ;
91
- if ( index === - 1 ) {
92
- var li = document . createElement ( 'li' ) ;
93
- var element = credit . element ;
94
- li . appendChild ( element ) ;
95
- container . appendChild ( li ) ;
96
- } else {
97
- displayedCredits . splice ( index , 1 ) ;
98
- }
99
- }
100
- }
59
+ function createDelimiterElement ( delimiter ) {
60
+ var delimiterElement = document . createElement ( 'span' ) ;
61
+ delimiterElement . textContent = delimiter ;
62
+ delimiterElement . className = delimiterClassName ;
63
+ return delimiterElement ;
101
64
}
102
65
103
- function removeCreditDomElement ( credit ) {
104
- var element = credit . element ;
105
-
106
- var container = credit . showOnScreen ? element . parentNode : element . parentNode . parentNode ;
107
-
108
- if ( ! credit . showOnScreen ) {
109
- container . removeChild ( element . parentNode ) ;
110
- return ;
111
- }
112
-
113
- var delimiter = element . previousSibling ;
114
- if ( delimiter === null ) {
115
- delimiter = element . nextSibling ;
116
- }
117
- if ( delimiter !== null ) {
118
- container . removeChild ( delimiter ) ;
66
+ function createCreditElement ( element , elementWrapperTagName ) {
67
+ // may need to wrap the credit in another element
68
+ if ( defined ( elementWrapperTagName ) ) {
69
+ var wrapper = document . createElement ( elementWrapperTagName ) ;
70
+ wrapper . _creditId = element . _creditId ;
71
+ wrapper . appendChild ( element ) ;
72
+ element = wrapper ;
119
73
}
120
- container . removeChild ( element ) ;
74
+ return element ;
121
75
}
122
76
123
- function removeUnusedCredits ( creditDisplay ) {
124
- var i ;
125
- var credit ;
126
- var displayedTextCredits = creditDisplay . _displayedCredits . screenCredits ;
127
- for ( i = 0 ; i < displayedTextCredits . length ; i ++ ) {
128
- credit = displayedTextCredits [ i ] ;
77
+ function displayCredits ( container , credits , delimiter , elementWrapperTagName ) {
78
+ var childNodes = container . childNodes ;
79
+ var domIndex = - 1 ;
80
+ for ( var creditIndex = 0 ; creditIndex < credits . length ; ++ creditIndex ) {
81
+ var credit = credits [ creditIndex ] ;
129
82
if ( defined ( credit ) ) {
130
- removeCreditDomElement ( credit ) ;
83
+ domIndex = creditIndex ;
84
+ if ( defined ( delimiter ) ) {
85
+ // credits may be separated by delimiters
86
+ domIndex *= 2 ;
87
+ if ( creditIndex > 0 ) {
88
+ var delimiterDomIndex = domIndex - 1 ;
89
+ if ( childNodes . length <= delimiterDomIndex ) {
90
+ container . appendChild ( createDelimiterElement ( delimiter ) ) ;
91
+ } else {
92
+ var existingDelimiter = childNodes [ delimiterDomIndex ] ;
93
+ if ( existingDelimiter . className !== delimiterClassName ) {
94
+ container . replaceChild ( createDelimiterElement ( delimiter ) , existingDelimiter ) ;
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ var element = credit . element ;
101
+
102
+ // check to see if the correct credit is in the right place
103
+ if ( childNodes . length <= domIndex ) {
104
+ container . appendChild ( createCreditElement ( element , elementWrapperTagName ) ) ;
105
+ } else {
106
+ var existingElement = childNodes [ domIndex ] ;
107
+ if ( existingElement . _creditId !== credit . _id ) {
108
+ // not the right credit, swap it in
109
+ container . replaceChild ( createCreditElement ( element , elementWrapperTagName ) , existingElement ) ;
110
+ }
111
+ }
131
112
}
132
113
}
133
- }
134
114
135
- function removeUnusedLightboxCredits ( creditDisplay ) {
136
- var i ;
137
- var credit ;
138
- var displayedLightboxCredits = creditDisplay . _displayedCredits . lightboxCredits ;
139
- for ( i = 0 ; i < displayedLightboxCredits . length ; i ++ ) {
140
- credit = displayedLightboxCredits [ i ] ;
141
- if ( defined ( credit ) ) {
142
- removeCreditDomElement ( credit ) ;
143
- }
115
+ // any remaining nodes in the container are unnecessary
116
+ ++ domIndex ;
117
+ while ( domIndex < childNodes . length ) {
118
+ container . removeChild ( childNodes [ domIndex ] ) ;
144
119
}
145
120
}
146
121
@@ -177,8 +152,6 @@ define([
177
152
}
178
153
179
154
function appendCss ( ) {
180
- var head = document . head ;
181
- var css = document . createElement ( 'style' ) ;
182
155
var style = '' ;
183
156
style += addStyle ( '.cesium-credit-lightbox-overlay' , {
184
157
display : 'none' ,
@@ -200,11 +173,11 @@ define([
200
173
} ) ;
201
174
202
175
style += addStyle ( '.cesium-credit-lightbox > ul > li a, .cesium-credit-lightbox > ul > li a:visited' , {
203
- color : textColor
176
+ color : textColor
204
177
} ) ;
205
178
206
179
style += addStyle ( '.cesium-credit-lightbox > ul > li a:hover' , {
207
- color : highlightColor
180
+ color : highlightColor
208
181
} ) ;
209
182
210
183
style += addStyle ( '.cesium-credit-lightbox.cesium-credit-lightbox-expanded' , {
@@ -254,22 +227,23 @@ define([
254
227
'padding-left' : '5px' ,
255
228
cursor : 'pointer' ,
256
229
'text-decoration' : 'underline' ,
257
- color : textColor
230
+ color : textColor
258
231
} ) ;
259
232
style += addStyle ( '.cesium-credit-expand-link:hover' , {
260
233
'color' : highlightColor
261
234
} ) ;
262
235
263
236
style += addStyle ( '.cesium-credit-text' , {
264
- color : textColor
237
+ color : textColor
265
238
} ) ;
266
239
267
240
style += addStyle ( '.cesium-credit-textContainer *, .cesium-credit-logoContainer *' , {
268
- display : 'inline'
241
+ display : 'inline'
269
242
} ) ;
270
243
244
+ var head = document . head ;
245
+ var css = document . createElement ( 'style' ) ;
271
246
css . innerHTML = style ;
272
-
273
247
head . insertBefore ( css , head . firstChild ) ;
274
248
}
275
249
@@ -356,14 +330,9 @@ define([
356
330
this . _defaultCredits = [ ] ;
357
331
this . _previousCesiumCredit = undefined ;
358
332
this . _currentCesiumCredit = CreditDisplay . cesiumCredit ;
359
-
360
- this . _displayedCredits = {
361
- screenCredits : [ ] ,
362
- lightboxCredits : [ ]
363
- } ;
364
333
this . _currentFrameCredits = {
365
- screenCredits : [ ] ,
366
- lightboxCredits : [ ]
334
+ screenCredits : new AssociativeArray ( ) ,
335
+ lightboxCredits : new AssociativeArray ( )
367
336
} ;
368
337
369
338
this . viewport = viewport ;
@@ -385,8 +354,6 @@ define([
385
354
Check . defined ( 'credit' , credit ) ;
386
355
//>>includeEnd('debug');
387
356
388
- var screenCredits = this . _currentFrameCredits . screenCredits ;
389
-
390
357
if ( credit . _isIon ) {
391
358
// If this is the an ion logo credit from the ion server
392
359
// Juse use the default credit (which is identical) to avoid blinking
@@ -395,9 +362,9 @@ define([
395
362
}
396
363
397
364
if ( ! credit . showOnScreen ) {
398
- this . _currentFrameCredits . lightboxCredits [ credit . id ] = credit ;
365
+ this . _currentFrameCredits . lightboxCredits . set ( credit . id , credit ) ;
399
366
} else {
400
- screenCredits [ credit . id ] = credit ;
367
+ this . _currentFrameCredits . screenCredits . set ( credit . id , credit ) ;
401
368
}
402
369
} ;
403
370
@@ -411,9 +378,9 @@ define([
411
378
Check . defined ( 'credit' , credit ) ;
412
379
//>>includeEnd('debug');
413
380
414
- var credits = this . _defaultCredits ;
415
- if ( ! contains ( credits , credit ) ) {
416
- credits . push ( credit ) ;
381
+ var defaultCredits = this . _defaultCredits ;
382
+ if ( ! contains ( defaultCredits , credit ) ) {
383
+ defaultCredits . push ( credit ) ;
417
384
}
418
385
} ;
419
386
@@ -427,9 +394,10 @@ define([
427
394
Check . defined ( 'credit' , credit ) ;
428
395
//>>includeEnd('debug');
429
396
430
- var index = this . _defaultCredits . indexOf ( credit ) ;
397
+ var defaultCredits = this . _defaultCredits ;
398
+ var index = defaultCredits . indexOf ( credit ) ;
431
399
if ( index !== - 1 ) {
432
- this . _defaultCredits . splice ( index , 1 ) ;
400
+ defaultCredits . splice ( index , 1 ) ;
433
401
}
434
402
} ;
435
403
@@ -447,46 +415,42 @@ define([
447
415
* Updates the credit display before a new frame is rendered.
448
416
*/
449
417
CreditDisplay . prototype . update = function ( ) {
450
- var displayedLightboxCredits = [ ] ;
451
-
452
- if ( this . _expanded && defined ( this . _creditsToUpdate ) ) {
418
+ if ( this . _expanded ) {
453
419
styleLightboxContainer ( this ) ;
454
- displayLightboxCredits ( this , this . _creditsToUpdate ) ;
455
- displayedLightboxCredits = this . _creditsToUpdate . slice ( ) ;
456
420
}
457
-
458
- removeUnusedLightboxCredits ( this ) ;
459
-
460
- this . _displayedCredits . lightboxCredits = displayedLightboxCredits ;
461
421
} ;
462
422
463
423
/**
464
424
* Resets the credit display to a beginning of frame state, clearing out current credits.
465
425
*/
466
426
CreditDisplay . prototype . beginFrame = function ( ) {
467
- this . _currentFrameCredits . screenCredits . length = 0 ;
468
- this . _currentFrameCredits . lightboxCredits . length = 0 ;
427
+ var currentFrameCredits = this . _currentFrameCredits ;
428
+
429
+ var screenCredits = currentFrameCredits . screenCredits ;
430
+ screenCredits . removeAll ( ) ;
431
+ var defaultCredits = this . _defaultCredits ;
432
+ for ( var i = 0 ; i < defaultCredits . length ; ++ i ) {
433
+ var defaultCredit = defaultCredits [ i ] ;
434
+ screenCredits . set ( defaultCredit . id , defaultCredit ) ;
435
+ }
436
+
437
+ currentFrameCredits . lightboxCredits . removeAll ( ) ;
438
+
469
439
this . _currentCesiumCredit = CreditDisplay . cesiumCredit ;
470
440
} ;
471
441
472
442
/**
473
443
* Sets the credit display to the end of frame state, displaying credits from the last frame in the credit container.
474
444
*/
475
445
CreditDisplay . prototype . endFrame = function ( ) {
476
- displayCredits ( this , this . _defaultCredits ) ;
477
- displayCredits ( this , this . _currentFrameCredits . screenCredits ) ;
446
+ var screenCredits = this . _currentFrameCredits . screenCredits . values ;
447
+ displayCredits ( this . _screenContainer , screenCredits , this . _delimiter , undefined ) ;
478
448
479
- var displayedScreenCredits = this . _defaultCredits . concat ( this . _currentFrameCredits . screenCredits ) ;
449
+ var lightboxCredits = this . _currentFrameCredits . lightboxCredits . values ;
450
+ this . _expandLink . style . display = lightboxCredits . length > 0 ? 'inline' : 'none' ;
451
+ displayCredits ( this . _creditList , lightboxCredits , undefined , 'li' ) ;
480
452
481
- var showLightboxLink = this . _currentFrameCredits . lightboxCredits . length > 0 ;
482
- this . _expandLink . style . display = showLightboxLink ? 'inline' : 'none' ;
483
-
484
- removeUnusedCredits ( this ) ;
485
453
swapCesiumCredit ( this ) ;
486
-
487
- this . _displayedCredits . screenCredits = displayedScreenCredits ;
488
-
489
- this . _creditsToUpdate = this . _currentFrameCredits . lightboxCredits . slice ( ) ;
490
454
} ;
491
455
492
456
/**
@@ -543,12 +507,12 @@ define([
543
507
* @memberof CreditDisplay
544
508
* @type {Credit }
545
509
*/
546
- cesiumCredit : {
547
- get : function ( ) {
510
+ cesiumCredit : {
511
+ get : function ( ) {
548
512
getDefaultCredit ( ) ;
549
513
return CreditDisplay . _cesiumCredit ;
550
514
} ,
551
- set : function ( value ) {
515
+ set : function ( value ) {
552
516
CreditDisplay . _cesiumCredit = value ;
553
517
CreditDisplay . _cesiumCreditInitialized = true ;
554
518
}
0 commit comments