adding web site
| 
						 | 
				
			
			@ -0,0 +1,994 @@
 | 
			
		|||
body, html {
 | 
			
		||||
	margin: 0;
 | 
			
		||||
	padding: 0;
 | 
			
		||||
	background: #FFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		display: block;
 | 
			
		||||
		position: relative;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#content {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: relative;
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
			
 | 
			
		||||
			#grid {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				left: 0px;
 | 
			
		||||
				top: 0px;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
				#countries {
 | 
			
		||||
					width: 100%;
 | 
			
		||||
					height: 60px;
 | 
			
		||||
					margin: 0;
 | 
			
		||||
					padding-right: -2px;
 | 
			
		||||
					position: relative;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
					#countries .btn-group {
 | 
			
		||||
						position: absolute;
 | 
			
		||||
						margin: 10px 0 0 0;
 | 
			
		||||
						left: 0px;
 | 
			
		||||
						right: -2px;
 | 
			
		||||
					}
 | 
			
		||||
						#countries .btn-group:first-child button {
 | 
			
		||||
							border-bottom-left-radius: 0;
 | 
			
		||||
							border-bottom-right-radius: 0;
 | 
			
		||||
							border-bottom: none !important;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						#countries .btn-group:nth-child(2) {
 | 
			
		||||
							display: none;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						#countries .btn-group:last-child {
 | 
			
		||||
							top:25px;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
							#countries .btn-group:last-child button {
 | 
			
		||||
								border-top-left-radius: 0;
 | 
			
		||||
								border-top-right-radius: 0;
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
					#countries button {
 | 
			
		||||
						text-align: center !important;
 | 
			
		||||
						overflow: hidden;
 | 
			
		||||
						padding: 3px 0px 3px 1px !important;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				#gridSort {
 | 
			
		||||
					width: 100%;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#gridSort button {
 | 
			
		||||
					width: 33.33%;
 | 
			
		||||
					text-align: center !important;
 | 
			
		||||
					padding-left: 1px !important;
 | 
			
		||||
					padding-right: 0px !important;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			#footer {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				text-align: right;
 | 
			
		||||
				color: #AAA;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			#footer a {
 | 
			
		||||
				color: #AAA;
 | 
			
		||||
				text-decoration: none;
 | 
			
		||||
				border-bottom: 1px solid #CCC;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
/* responsive design */
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 860px) {
 | 
			
		||||
	
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		display: block;
 | 
			
		||||
		position: relative;
 | 
			
		||||
		width: 860px;
 | 
			
		||||
		height: 610px;
 | 
			
		||||
		overflow: hidden;
 | 
			
		||||
		margin: 0px auto;
 | 
			
		||||
		padding: 0px;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#content {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: absolute;
 | 
			
		||||
			left: 0px;
 | 
			
		||||
			top: 0px;
 | 
			
		||||
			width: 860px;
 | 
			
		||||
			height: 610px
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
			#grid {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				left: 5px;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				width: 500px;
 | 
			
		||||
				height: 600px;
 | 
			
		||||
				overflow: visible;
 | 
			
		||||
				background-color: #000;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridImage, #gridCanvas, #gridCanvasOverlay {
 | 
			
		||||
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					width: 500px;
 | 
			
		||||
					height: 600px;
 | 
			
		||||
					left: 0;
 | 
			
		||||
					top: 0;
 | 
			
		||||
					cursor: pointer;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#marker {
 | 
			
		||||
					
 | 
			
		||||
					display: none;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					width: 20px;
 | 
			
		||||
					height: 15px;
 | 
			
		||||
					border: 3px solid #000;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#tooltip {
 | 
			
		||||
					
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					display: none;
 | 
			
		||||
					margin-right: -300px;
 | 
			
		||||
					background: rgba(0,0,0,0.8);
 | 
			
		||||
					padding: 5px 10px 5px 10px;
 | 
			
		||||
					color: #FFF;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					line-height: 14px;
 | 
			
		||||
					max-width: 220px;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					border-radius: 5px;
 | 
			
		||||
					box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
					z-index: 600;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
			#infobox {
 | 
			
		||||
				
 | 
			
		||||
				display: none;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
 | 
			
		||||
				background: #FFF;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				width: 320px;
 | 
			
		||||
				height: 580px;
 | 
			
		||||
				border-radius: 5px;
 | 
			
		||||
				box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
				padding: 3px 10px 17px 10px;
 | 
			
		||||
				z-index: 500;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
				#infoboxContent {
 | 
			
		||||
					margin: 10px;
 | 
			
		||||
					max-height: 540px;
 | 
			
		||||
					overflow: scroll;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#infobox p {
 | 
			
		||||
					
 | 
			
		||||
					line-height: 1.2em;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					margin: 5px 0;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
			
 | 
			
		||||
				#infobox #close {
 | 
			
		||||
					
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					right: 10px;
 | 
			
		||||
					bottom: 10px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
	
 | 
			
		||||
			#display-number {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				width: 340px;
 | 
			
		||||
				height: 110px;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
				#display-number-content {
 | 
			
		||||
 | 
			
		||||
					font-size: 70px;
 | 
			
		||||
					line-height: 70px;
 | 
			
		||||
					font-weight: bold;
 | 
			
		||||
					text-align: center;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			#footer {
 | 
			
		||||
				width: 340px;
 | 
			
		||||
				height: 20px;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 590px;
 | 
			
		||||
				font-size: 10px;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			#controller-navigation {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 140px;
 | 
			
		||||
				width: 340px;
 | 
			
		||||
				height: 450px;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridFlag {
 | 
			
		||||
					
 | 
			
		||||
					margin: 0px 0px 32px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#controller-navigation .btn-full,
 | 
			
		||||
				#controller-navigation .btn-group-vertical button {
 | 
			
		||||
 | 
			
		||||
					width: 340px;
 | 
			
		||||
					text-align: left;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#countries {
 | 
			
		||||
					height: 95px;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
					#countries .btn-group:nth-child(2) {
 | 
			
		||||
						top:27px;
 | 
			
		||||
						display: block;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					#countries .btn-group:nth-child(2) button {
 | 
			
		||||
						border-radius: 0px !important;
 | 
			
		||||
						border-bottom: none !important;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					#countries .btn-group:last-child {
 | 
			
		||||
						top:54px;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				
 | 
			
		||||
	#small-warning {
 | 
			
		||||
	
 | 
			
		||||
		display: none;
 | 
			
		||||
	
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 640px) and (max-width: 859px) {
 | 
			
		||||
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		display: block;
 | 
			
		||||
		position: relative;
 | 
			
		||||
		width: 640px;
 | 
			
		||||
		height: 490px;
 | 
			
		||||
		overflow: hidden;
 | 
			
		||||
		margin: 0px auto;
 | 
			
		||||
		padding: 0px;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#content {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: absolute;
 | 
			
		||||
			left: 0px;
 | 
			
		||||
			top: 0px;
 | 
			
		||||
			width: 640px;
 | 
			
		||||
			height: 490px
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
			#grid {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				left: 5px;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				width: 400px;
 | 
			
		||||
				height: 480px;
 | 
			
		||||
				overflow: visible;
 | 
			
		||||
				background-color: #000;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridImage, #gridCanvas, #gridCanvasOverlay {
 | 
			
		||||
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					width: 400px;
 | 
			
		||||
					height: 480px;
 | 
			
		||||
					left: 0;
 | 
			
		||||
					top: 0;
 | 
			
		||||
					cursor: pointer;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#marker {
 | 
			
		||||
					
 | 
			
		||||
					display: none;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					width: 16px;
 | 
			
		||||
					height: 12px;
 | 
			
		||||
					border: 3px solid #000;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#tooltip {
 | 
			
		||||
					
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					display: none;
 | 
			
		||||
					margin-right: -300px;
 | 
			
		||||
					background: rgba(0,0,0,0.8);
 | 
			
		||||
					padding: 5px 10px 5px 10px;
 | 
			
		||||
					color: #FFF;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					line-height: 14px;
 | 
			
		||||
					max-width: 220px;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					border-radius: 5px;
 | 
			
		||||
					box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
					z-index: 600;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
			#infobox {
 | 
			
		||||
				
 | 
			
		||||
				display: none;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
 | 
			
		||||
				background: #FFF;
 | 
			
		||||
				top: 10px;
 | 
			
		||||
				right: 10px;
 | 
			
		||||
				width: 360px;
 | 
			
		||||
				max-height: 450px;
 | 
			
		||||
				border-radius: 5px;
 | 
			
		||||
				box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
				padding: 3px 10px 17px 10px;
 | 
			
		||||
				z-index: 500;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
				#infoboxContent {
 | 
			
		||||
					margin: 10px 10px 40px 10px;
 | 
			
		||||
					max-height: 400px;
 | 
			
		||||
					overflow: scroll;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#infobox p {
 | 
			
		||||
					
 | 
			
		||||
					line-height: 1.2em;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					margin: 5px 0;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
			
 | 
			
		||||
				#infobox #close {
 | 
			
		||||
					
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					right: 10px;
 | 
			
		||||
					bottom: 10px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
	
 | 
			
		||||
			#display-number {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				width: 220px;
 | 
			
		||||
				height: 50px;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
				#display-number-content {
 | 
			
		||||
 | 
			
		||||
					font-size: 50px;
 | 
			
		||||
					line-height: 50px;
 | 
			
		||||
					font-weight: bold;
 | 
			
		||||
					text-align: center;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			#footer {
 | 
			
		||||
				width: 220px;
 | 
			
		||||
				height: 20px;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 470px;
 | 
			
		||||
				font-size: 10px;
 | 
			
		||||
			}
 | 
			
		||||
				
 | 
			
		||||
			#controller-navigation {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 110px;
 | 
			
		||||
				width: 220px;
 | 
			
		||||
				height: 350px;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridFlag {
 | 
			
		||||
				
 | 
			
		||||
					margin: 0px 0px 27px;
 | 
			
		||||
				
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#controller-navigation h3 {
 | 
			
		||||
					
 | 
			
		||||
					font-size: 18px;
 | 
			
		||||
					line-height: 20px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
				#controller-navigation .btn-full,
 | 
			
		||||
				#controller-navigation .btn-group-vertical button {
 | 
			
		||||
 | 
			
		||||
					width: 220px;
 | 
			
		||||
					text-align: left;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					padding: 5px 8px;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#controller-navigation #gridSort button {
 | 
			
		||||
 | 
			
		||||
					text-align: left;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					padding: 5px 12px 5px 13px;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#countries button {
 | 
			
		||||
					text-align: center !important;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					padding: 2px 0px 2px 1px !important;
 | 
			
		||||
					letter-spacing: -0.04em;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
	#small-warning {
 | 
			
		||||
	
 | 
			
		||||
		display: none;
 | 
			
		||||
	
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 520px) and (max-width: 639px) {
 | 
			
		||||
	
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		display: block;
 | 
			
		||||
		position: relative;
 | 
			
		||||
		width: 520px;
 | 
			
		||||
		height: 370px;
 | 
			
		||||
		overflow: hidden;
 | 
			
		||||
		margin: 0px auto;
 | 
			
		||||
		padding: 0px;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#content {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: absolute;
 | 
			
		||||
			left: 0px;
 | 
			
		||||
			top: 0px;
 | 
			
		||||
			width: 520px;
 | 
			
		||||
			height: 370px
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
			#grid {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				left: 5px;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				width: 275px;
 | 
			
		||||
				height: 360px;
 | 
			
		||||
				overflow: visible;
 | 
			
		||||
				background-color: #000;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridImage, #gridCanvas, #gridCanvasOverlay {
 | 
			
		||||
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					width: 275px;
 | 
			
		||||
					height: 360px;
 | 
			
		||||
					left: 0;
 | 
			
		||||
					top: 0;
 | 
			
		||||
					cursor: pointer;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#marker {
 | 
			
		||||
					
 | 
			
		||||
					display: none;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					width: 11px;
 | 
			
		||||
					height: 9px;
 | 
			
		||||
					border: 3px solid #000;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#tooltip {
 | 
			
		||||
					
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					display: none;
 | 
			
		||||
					margin-right: -275px;
 | 
			
		||||
					background: rgba(0,0,0,0.8);
 | 
			
		||||
					padding: 5px 10px 5px 10px;
 | 
			
		||||
					color: #FFF;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					line-height: 14px;
 | 
			
		||||
					max-width: 220px;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					border-radius: 5px;
 | 
			
		||||
					box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
					z-index: 600;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
			#infobox {
 | 
			
		||||
				
 | 
			
		||||
				display: none;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
 | 
			
		||||
				background: #FFF;
 | 
			
		||||
				left: 20px;
 | 
			
		||||
				top: 20px;
 | 
			
		||||
				right: 20px;
 | 
			
		||||
				max-height: 380px;
 | 
			
		||||
				border-radius: 5px;
 | 
			
		||||
				box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
				padding: 3px 10px 40px 10px;
 | 
			
		||||
				z-index: 500;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
				#infoboxContent {
 | 
			
		||||
					margin: 10px;
 | 
			
		||||
					max-height: 320px;
 | 
			
		||||
					overflow: scroll;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#infobox p {
 | 
			
		||||
					
 | 
			
		||||
					line-height: 1.2em;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					margin: 5px 0;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#infobox #close {
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					right: 10px;
 | 
			
		||||
					bottom: 10px;
 | 
			
		||||
				}
 | 
			
		||||
	
 | 
			
		||||
			#display-number {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 5px;
 | 
			
		||||
				width: 225px;
 | 
			
		||||
				height: 50px;
 | 
			
		||||
				padding: 0px;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
				#display-number-content {
 | 
			
		||||
 | 
			
		||||
					font-size: 30px;
 | 
			
		||||
					line-height: 30px;
 | 
			
		||||
					font-weight: bold;
 | 
			
		||||
					text-align: center;
 | 
			
		||||
					padding: 10px;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			#footer {
 | 
			
		||||
				width: 225px;
 | 
			
		||||
				height: 20px;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 350px;
 | 
			
		||||
				font-size: 10px;
 | 
			
		||||
			}
 | 
			
		||||
				
 | 
			
		||||
			#controller-navigation {
 | 
			
		||||
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				right: 5px;
 | 
			
		||||
				top: 65px;
 | 
			
		||||
				width: 225px;
 | 
			
		||||
				height: 290px;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridFlag {
 | 
			
		||||
				
 | 
			
		||||
					margin: 0px 0px 23px;
 | 
			
		||||
				
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#controller-navigation h3 {
 | 
			
		||||
					
 | 
			
		||||
					font-size: 16px;
 | 
			
		||||
					line-height: 18px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
				#controller-navigation .btn-full,
 | 
			
		||||
				#controller-navigation .btn-group-vertical button {
 | 
			
		||||
 | 
			
		||||
					width: 225px;
 | 
			
		||||
					text-align: left;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					padding: 5px 8px;
 | 
			
		||||
					letter-spacing: -0.04em;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#controller-navigation #gridSort button {
 | 
			
		||||
 | 
			
		||||
					text-align: left;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					padding: 5px 11px 5px 11px;
 | 
			
		||||
					letter-spacing: -0.04em;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#countries {
 | 
			
		||||
					display: none;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
	#small-warning {
 | 
			
		||||
	
 | 
			
		||||
		display: none;
 | 
			
		||||
	
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (min-width: 420px) and (max-width: 519px) {
 | 
			
		||||
	
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		display: block;
 | 
			
		||||
		position: relative;
 | 
			
		||||
		width: 400px;
 | 
			
		||||
		height: 740px;
 | 
			
		||||
		overflow: hidden;
 | 
			
		||||
		margin: 0px auto;
 | 
			
		||||
		padding: 0px;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#content {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: absolute;
 | 
			
		||||
			left: 0px;
 | 
			
		||||
			top: 0px;
 | 
			
		||||
			width: 400px;
 | 
			
		||||
			height: 740px
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
			#grid {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
				left: 0px;
 | 
			
		||||
				top: 220px;
 | 
			
		||||
				width: 400px;
 | 
			
		||||
				height: 480px;
 | 
			
		||||
				overflow: visible;
 | 
			
		||||
				background-color: #000;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#gridImage, #gridCanvas, #gridCanvasOverlay {
 | 
			
		||||
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					width: 400px;
 | 
			
		||||
					height: 480px;
 | 
			
		||||
					left: 0;
 | 
			
		||||
					top: 0;
 | 
			
		||||
					cursor: pointer;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#marker {
 | 
			
		||||
					
 | 
			
		||||
					display: none;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					width: 22px;
 | 
			
		||||
					height: 22px;
 | 
			
		||||
					background-image: url(../img/marker_640.png)
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				#tooltip {
 | 
			
		||||
					
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					display: none;
 | 
			
		||||
					margin-right: -300px;
 | 
			
		||||
					background: rgba(0,0,0,0.8);
 | 
			
		||||
					padding: 5px 10px 5px 10px;
 | 
			
		||||
					color: #FFF;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					line-height: 14px;
 | 
			
		||||
					max-width: 220px;
 | 
			
		||||
					pointer-events: none;
 | 
			
		||||
					border-radius: 5px;
 | 
			
		||||
					box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
					z-index: 600;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
			#infobox {
 | 
			
		||||
				
 | 
			
		||||
				display: none;
 | 
			
		||||
				position: absolute;
 | 
			
		||||
 | 
			
		||||
				background: #FFF;
 | 
			
		||||
				top: 10px;
 | 
			
		||||
				right: 10px;
 | 
			
		||||
				width: 360px;
 | 
			
		||||
				max-height: 450px;
 | 
			
		||||
				border-radius: 5px;
 | 
			
		||||
				box-shadow: 0px 0px 15px -5px rgba(0,0,0,0.6);
 | 
			
		||||
				padding: 3px 10px 17px 10px;
 | 
			
		||||
				z-index: 500;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
				#infoboxContent {
 | 
			
		||||
					margin: 10px 10px 40px 10px;
 | 
			
		||||
					max-height: 400px;
 | 
			
		||||
					overflow: scroll;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#infobox p {
 | 
			
		||||
					
 | 
			
		||||
					line-height: 1.2em;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					margin: 5px 0;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
			
 | 
			
		||||
				#infobox #close {
 | 
			
		||||
					
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					right: 10px;
 | 
			
		||||
					bottom: 10px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
	
 | 
			
		||||
				#display-number {
 | 
			
		||||
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					left: 0px;
 | 
			
		||||
					top: 10px;
 | 
			
		||||
					width: 145px;
 | 
			
		||||
					height: 51px;
 | 
			
		||||
					padding: 0px;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
					#display-number-content {
 | 
			
		||||
 | 
			
		||||
						font-size: 31px;
 | 
			
		||||
						line-height: 31px;
 | 
			
		||||
						font-weight: bold;
 | 
			
		||||
						text-align: center;
 | 
			
		||||
						padding: 10px;
 | 
			
		||||
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				#controller-sortby {
 | 
			
		||||
					
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					right: 0px;
 | 
			
		||||
					top: 5px;
 | 
			
		||||
					width: 225px;
 | 
			
		||||
					height: 50px;
 | 
			
		||||
					padding: 0px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
					#controller-sortby h3 {
 | 
			
		||||
						
 | 
			
		||||
						font-size: 16px;
 | 
			
		||||
						line-height: 18px;
 | 
			
		||||
						padding: 0px;
 | 
			
		||||
						margin: 5px 0px;
 | 
			
		||||
						
 | 
			
		||||
					}
 | 
			
		||||
				
 | 
			
		||||
 | 
			
		||||
				#gridFlag {
 | 
			
		||||
					
 | 
			
		||||
					display: block;
 | 
			
		||||
					position: absolute;
 | 
			
		||||
					left: 0px;
 | 
			
		||||
					right: 0px;
 | 
			
		||||
					top: 75px;
 | 
			
		||||
					z-index: 500;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
					#gridFlag h3 {
 | 
			
		||||
						
 | 
			
		||||
						display: block;
 | 
			
		||||
						position: relative;
 | 
			
		||||
						width: 170px;
 | 
			
		||||
						float: left;
 | 
			
		||||
						font-size: 14px;
 | 
			
		||||
						line-height: 18px;
 | 
			
		||||
						padding: 0px;
 | 
			
		||||
						margin: 7px 0px 0px;
 | 
			
		||||
						clear: both;
 | 
			
		||||
						
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
						#gridFlag h3+.btn-group-vertical,
 | 
			
		||||
						#gridFlag h3+.btn-full {
 | 
			
		||||
							
 | 
			
		||||
							display: block;
 | 
			
		||||
							position: relative;
 | 
			
		||||
							width: 225px;
 | 
			
		||||
							float: right;
 | 
			
		||||
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
						#controller-navigation .btn-full,
 | 
			
		||||
						#controller-navigation .btn-group-vertical button {
 | 
			
		||||
 | 
			
		||||
							width: 225px;
 | 
			
		||||
							text-align: left;
 | 
			
		||||
							font-size: 12px;
 | 
			
		||||
							overflow: hidden;
 | 
			
		||||
							padding: 5px 8px;
 | 
			
		||||
							letter-spacing: -0.04em;
 | 
			
		||||
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
						#gridFlag .btn-group-vertical {
 | 
			
		||||
							
 | 
			
		||||
							padding-bottom: 10px;
 | 
			
		||||
							
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
				#footer {
 | 
			
		||||
					width: 225px;
 | 
			
		||||
					height: 20px;
 | 
			
		||||
					right: 5px;
 | 
			
		||||
					bottom: 10px;
 | 
			
		||||
					font-size: 10px;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				#controller-navigation #gridSort button {
 | 
			
		||||
 | 
			
		||||
					text-align: left;
 | 
			
		||||
					font-size: 12px;
 | 
			
		||||
					overflow: hidden;
 | 
			
		||||
					padding: 5px 11px 5px 11px;
 | 
			
		||||
					letter-spacing: -0.04em;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
					#countries {
 | 
			
		||||
						display: none;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
	#small-warning {
 | 
			
		||||
	
 | 
			
		||||
		display: none;
 | 
			
		||||
	
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media screen and (max-width: 419px) {
 | 
			
		||||
	
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		margin: 0px;
 | 
			
		||||
		padding: 0px;
 | 
			
		||||
		min-width: 0px;
 | 
			
		||||
		max-width: 100%;
 | 
			
		||||
		width: 100%;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#content {
 | 
			
		||||
			
 | 
			
		||||
			display: none;
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		#footer {
 | 
			
		||||
			
 | 
			
		||||
			display: none;
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
	
 | 
			
		||||
		#small-warning {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: relative;
 | 
			
		||||
			padding: 20px;
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.clear {
 | 
			
		||||
	clear: both;
 | 
			
		||||
	display: block;
 | 
			
		||||
	overflow: hidden;
 | 
			
		||||
	visibility: hidden;
 | 
			
		||||
	width: 0;
 | 
			
		||||
	height: 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,178 @@
 | 
			
		|||
body {
 | 
			
		||||
	
 | 
			
		||||
	background: #F5F5F5;
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	#container {
 | 
			
		||||
		
 | 
			
		||||
		display: block;
 | 
			
		||||
		position: relative;
 | 
			
		||||
		margin: 0px auto;
 | 
			
		||||
		box-shadow: 0px 0px 40px -20px rgba(0,0,0,0.4);
 | 
			
		||||
		width: 860px; 
 | 
			
		||||
		background: #fff;
 | 
			
		||||
		padding: 50px;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
		.social {
 | 
			
		||||
			height: 35px;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		#activate {
 | 
			
		||||
 | 
			
		||||
			padding: 20px 0px 0px;
 | 
			
		||||
			border-top: 1px dotted #eee;
 | 
			
		||||
			margin-top: 20px;
 | 
			
		||||
 | 
			
		||||
		} 
 | 
			
		||||
		
 | 
			
		||||
			#activate .col {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: relative;
 | 
			
		||||
				float: left;
 | 
			
		||||
				width: 270px;
 | 
			
		||||
				margin: 0px;
 | 
			
		||||
				padding: 0px;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				#activate .col+.col {
 | 
			
		||||
					
 | 
			
		||||
					margin-left: 25px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
		#branding {
 | 
			
		||||
			
 | 
			
		||||
			padding: 20px 0px 0px;
 | 
			
		||||
			border-top: 1px dotted #eee;
 | 
			
		||||
			margin-top: 20px;
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
			#license {
 | 
			
		||||
				padding: 20px 10px 20px 100px;
 | 
			
		||||
				background: url(../img/cc-by.png) 10px center no-repeat;
 | 
			
		||||
				font-size: 0.8em;
 | 
			
		||||
				line-height: 1.1em;
 | 
			
		||||
				background-color: #f5f5f5;
 | 
			
		||||
				border-radius: 4px;
 | 
			
		||||
				border: 1px solid #E3E3E3;
 | 
			
		||||
				box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) inset
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			#creator {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: relative;
 | 
			
		||||
				float: left;
 | 
			
		||||
				margin: 0px;
 | 
			
		||||
				padding: 0px;
 | 
			
		||||
				min-height: 60px;
 | 
			
		||||
				line-height: 60px;
 | 
			
		||||
				width: 450px;
 | 
			
		||||
				font-size: 0.9em;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
				a#odclogo {
 | 
			
		||||
					
 | 
			
		||||
					display: inline-block;
 | 
			
		||||
					position: relative;
 | 
			
		||||
					width: 200px;
 | 
			
		||||
					height: 60px;
 | 
			
		||||
					font-size: 0px;
 | 
			
		||||
					text-indent: -1000px;
 | 
			
		||||
					color: transparent;
 | 
			
		||||
					background: url(../img/opendatacity.png) center center no-repeat;
 | 
			
		||||
					margin: 0px;
 | 
			
		||||
					padding: 0px;
 | 
			
		||||
					top: -5px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				a#mvlogo {
 | 
			
		||||
					
 | 
			
		||||
					display: inline-block;
 | 
			
		||||
					position: relative;
 | 
			
		||||
					width: 200px;
 | 
			
		||||
					height: 60px;
 | 
			
		||||
					font-size: 0px;
 | 
			
		||||
					text-indent: -1000px;
 | 
			
		||||
					color: transparent;
 | 
			
		||||
					background: url(../img/myvideo.png) center center no-repeat;
 | 
			
		||||
					margin: 0px;
 | 
			
		||||
					padding: 0px;
 | 
			
		||||
					top: -5px;
 | 
			
		||||
					
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
	#embed-overlay {
 | 
			
		||||
		
 | 
			
		||||
		display: none;
 | 
			
		||||
		position: fixed;
 | 
			
		||||
		left: 0px;
 | 
			
		||||
		right: 0px;
 | 
			
		||||
		top: 0px;
 | 
			
		||||
		bottom: 0px;
 | 
			
		||||
		background-color: rgba(0,0,0,0.7);
 | 
			
		||||
		overflow-y: auto;
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
		#embed-content {
 | 
			
		||||
			
 | 
			
		||||
			display: block;
 | 
			
		||||
			position: relative;
 | 
			
		||||
			width: 640px;
 | 
			
		||||
			background-color: #fff;
 | 
			
		||||
			margin: 20px auto;
 | 
			
		||||
			padding: 20px;
 | 
			
		||||
			border-radius: 6px;
 | 
			
		||||
			box-shadow: 0px 0px 50px -15px rgba(0,0,0,0.9);
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
			#embed-content fieldset {
 | 
			
		||||
				
 | 
			
		||||
				padding-bottom: 20px;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
				#embed-content fieldset legend {
 | 
			
		||||
 | 
			
		||||
					margin-bottom: 10px;
 | 
			
		||||
					line-height: 30px;
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
			
 | 
			
		||||
			#embed-content label+label {
 | 
			
		||||
				
 | 
			
		||||
				margin-left: 20px;
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
		
 | 
			
		||||
			#embed-content code {
 | 
			
		||||
				
 | 
			
		||||
				display: block;
 | 
			
		||||
				position: relative;
 | 
			
		||||
				padding: 10px;
 | 
			
		||||
				white-space: normal;
 | 
			
		||||
				color: #444
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
.clear {
 | 
			
		||||
	clear: both;
 | 
			
		||||
	display: block;
 | 
			
		||||
	overflow: hidden;
 | 
			
		||||
	visibility: hidden;
 | 
			
		||||
	width: 0;
 | 
			
		||||
	height: 0;
 | 
			
		||||
}
 | 
			
		||||
| 
		 After Width: | Height: | Size: 2.6 KiB  | 
| 
		 After Width: | Height: | Size: 2.0 KiB  | 
| 
		 After Width: | Height: | Size: 8.6 KiB  | 
| 
		 After Width: | Height: | Size: 12 KiB  | 
| 
		 After Width: | Height: | Size: 93 KiB  | 
| 
		 After Width: | Height: | Size: 256 KiB  | 
| 
		 After Width: | Height: | Size: 157 KiB  | 
| 
		 After Width: | Height: | Size: 477 KiB  | 
| 
		 After Width: | Height: | Size: 247 KiB  | 
| 
		 After Width: | Height: | Size: 729 KiB  | 
| 
		 After Width: | Height: | Size: 6.3 KiB  | 
| 
		 After Width: | Height: | Size: 11 KiB  | 
| 
						 | 
				
			
			@ -0,0 +1,377 @@
 | 
			
		|||
function Canvas(options) {
 | 
			
		||||
	var me = this;
 | 
			
		||||
	
 | 
			
		||||
	var imageNode = options.imageNode;
 | 
			
		||||
	var node = options.node;
 | 
			
		||||
	var nodeOverlay = options.nodeOverlay;
 | 
			
		||||
	
 | 
			
		||||
	var context = node[0].getContext("2d");
 | 
			
		||||
	var contextOverlay = nodeOverlay[0].getContext("2d");
 | 
			
		||||
	
 | 
			
		||||
	var data = options.data;
 | 
			
		||||
	var columns = options.columns;
 | 
			
		||||
	var rows = (data.length/columns);
 | 
			
		||||
	var thumbWidth = options.thumbWidth;
 | 
			
		||||
	var thumbHeight = options.thumbHeight;
 | 
			
		||||
	
 | 
			
		||||
	var width = thumbWidth*columns;
 | 
			
		||||
	var height = thumbHeight*rows;
 | 
			
		||||
	
 | 
			
		||||
	var projectX  = [];
 | 
			
		||||
	var projectY  = [];
 | 
			
		||||
	var deproject = [];
 | 
			
		||||
	
 | 
			
		||||
	var indexes = [];
 | 
			
		||||
	for (var i = 0; i < data.length; i++) {
 | 
			
		||||
		entry = data[i];
 | 
			
		||||
		entry.id = i;
 | 
			
		||||
		indexes[i] = { entry:entry, sortBy:i, id:i };
 | 
			
		||||
		
 | 
			
		||||
		var x = (i % columns);
 | 
			
		||||
		var y = Math.floor(i/columns);
 | 
			
		||||
			
 | 
			
		||||
		entry.oldPos = i;
 | 
			
		||||
		entry.newPos = i;
 | 
			
		||||
		entry.oldColor = [0,0,0,0];
 | 
			
		||||
		entry.newColor = [0,0,0,0];
 | 
			
		||||
		
 | 
			
		||||
		projectX[i] = x*thumbWidth;
 | 
			
		||||
		projectY[i] = y*thumbHeight;
 | 
			
		||||
		
 | 
			
		||||
		if (deproject[x] === undefined) deproject[x] = [];
 | 
			
		||||
		
 | 
			
		||||
		deproject[x][y] = i;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	nodeOverlay.mouseenter(function (e) { me.toolTip.show(e.pageX, e.pageY) });
 | 
			
		||||
	nodeOverlay.mousemove( function (e) { me.toolTip.show(e.pageX, e.pageY) });
 | 
			
		||||
	nodeOverlay.mouseleave(function (e) { me.toolTip.hide() });
 | 
			
		||||
	nodeOverlay.click(function (e) {
 | 
			
		||||
		me.toolTip.showInfobox();
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
	me.toolTip = new (function () {
 | 
			
		||||
		var me = this;
 | 
			
		||||
		var status = {};
 | 
			
		||||
		var markedEntry;
 | 
			
		||||
		
 | 
			
		||||
		var tooltip = $('#tooltip');
 | 
			
		||||
		var marker = $('#marker');
 | 
			
		||||
		var infobox = $('#infobox');
 | 
			
		||||
		var infoboxContent = $('#infoboxContent');
 | 
			
		||||
		
 | 
			
		||||
		$('#infobox .close').click(function () { infobox.hide() });
 | 
			
		||||
		
 | 
			
		||||
		me.hide = function () {
 | 
			
		||||
			if (status.shown) {
 | 
			
		||||
				tooltip.hide();
 | 
			
		||||
				marker.hide();
 | 
			
		||||
			}
 | 
			
		||||
			status.shown = false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		me.show = function (x, y) {
 | 
			
		||||
			if (!status.shown) {
 | 
			
		||||
				tooltip.show();
 | 
			
		||||
				marker.show();
 | 
			
		||||
			}
 | 
			
		||||
			status.shown = true;
 | 
			
		||||
			
 | 
			
		||||
			var offset = $('#gridCanvas').offset();
 | 
			
		||||
			x -= offset.left;
 | 
			
		||||
			y -= offset.top;
 | 
			
		||||
			
 | 
			
		||||
			var xi = clamp(Math.floor(x/thumbWidth ), 0, columns - 1);
 | 
			
		||||
			var yi = clamp(Math.floor(y/thumbHeight), 0, rows    - 1);
 | 
			
		||||
			var index = deproject[xi][yi];
 | 
			
		||||
			var id = index.id
 | 
			
		||||
			var entry = indexes[index].entry;
 | 
			
		||||
			var html = '<b>'+entry.title+'</b><br>'+entry.hint;
 | 
			
		||||
			var content = html+xi+'_'+yi;
 | 
			
		||||
			
 | 
			
		||||
			if (status.content != content) {
 | 
			
		||||
				tooltip.html(html);
 | 
			
		||||
				
 | 
			
		||||
				var tx = xi*thumbWidth;
 | 
			
		||||
				var ty = yi*thumbHeight;
 | 
			
		||||
 | 
			
		||||
				marker.css({
 | 
			
		||||
					left: tx-3,
 | 
			
		||||
					top:  ty-3
 | 
			
		||||
				});
 | 
			
		||||
				
 | 
			
		||||
				tx += thumbWidth/2 - tooltip.outerWidth()/2;
 | 
			
		||||
				if (tx < -5) tx = -5;
 | 
			
		||||
 | 
			
		||||
				if (ty + thumbHeight + 120 < node.innerHeight()) {
 | 
			
		||||
					tooltip.css({
 | 
			
		||||
						left: tx,
 | 
			
		||||
						top:  ty + thumbHeight + 3,
 | 
			
		||||
						bottom: 'auto'
 | 
			
		||||
					});
 | 
			
		||||
				} else {
 | 
			
		||||
					tooltip.css({
 | 
			
		||||
						left: tx,
 | 
			
		||||
						top:  'auto',
 | 
			
		||||
						bottom: node.innerHeight() - (ty - 3)
 | 
			
		||||
					});
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			status.content = content;
 | 
			
		||||
			markedEntry = entry;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		function replace(text, regexp, value) {
 | 
			
		||||
			value = value.replace(/%/g, '%');
 | 
			
		||||
			return text.replace(regexp, value);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		var highlightCountries = {
 | 
			
		||||
			// Deutschland
 | 
			
		||||
			'DE':4,
 | 
			
		||||
			// deutschsprachig
 | 
			
		||||
			'CH':3,'AT':3,
 | 
			
		||||
			// EU
 | 
			
		||||
			'FR':2,'BE':2,'BG':2,'DK':2,'EE':2,'FI':2,'GR':2,'IE':2,'IT':2,'LV':2,'LT':2,'LU':2,'MT':2,'NL':2,'PL':2,'PT':2,'RO':2,'SE':2,'SK':2,'SI':2,'ES':2,'CZ':2,'HU':2,'GB':2,'CY':2,
 | 
			
		||||
			// westliche Staaten
 | 
			
		||||
			'US':1
 | 
			
		||||
		};
 | 
			
		||||
		
 | 
			
		||||
		me.showInfobox = function () {
 | 
			
		||||
			infobox.show();
 | 
			
		||||
			
 | 
			
		||||
			var c = markedEntry.restrictionsAll;
 | 
			
		||||
			var countries = [];
 | 
			
		||||
			for (var i = 0; i < c.length; i++) {
 | 
			
		||||
				var countryName = countryCodes[c[i]];
 | 
			
		||||
				if (countryName === undefined) console.error('Unbekannter Code: '+c[i]);
 | 
			
		||||
				countryName = inEnglishPlease ? countryName.en : countryName.de;
 | 
			
		||||
				
 | 
			
		||||
				var style = 'color:#888';
 | 
			
		||||
				switch (highlightCountries[c[i]]) {
 | 
			
		||||
					case 1: break;
 | 
			
		||||
					case 2: break;
 | 
			
		||||
					case 3: style = ''; break; 
 | 
			
		||||
					case 4: style = 'font-weight:bold'; break;
 | 
			
		||||
				} 
 | 
			
		||||
				countries.push('<span title="'+countryName+'" style="'+style+'">'+c[i]+'</span>');
 | 
			
		||||
			}
 | 
			
		||||
			if (countries.length == 0) {
 | 
			
		||||
				countries = 'Keinem Land';
 | 
			
		||||
			} else {
 | 
			
		||||
				countries = countries.join(', ');
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			var html = infoboxTemplate;
 | 
			
		||||
			
 | 
			
		||||
			html = replace(html, /%title%/g,                   markedEntry.title);
 | 
			
		||||
			html = replace(html, /%published%/g,    formatDate(markedEntry.published));
 | 
			
		||||
			html = replace(html, /%url%/g,                     markedEntry.url);
 | 
			
		||||
			html = replace(html, /%author%/g,                  markedEntry.author);
 | 
			
		||||
			if (inEnglishPlease) {
 | 
			
		||||
				html = replace(html, /%restriction%/g,        (markedEntry.restrictedInDE > 1) ? 'Yes' : 'No');
 | 
			
		||||
				html = replace(html, /%reason%/g,              markedEntry.reasonEN);
 | 
			
		||||
			} else {
 | 
			
		||||
				html = replace(html, /%restriction%/g,        (markedEntry.restrictedInDE > 1) ? 'Ja' : 'Nein');
 | 
			
		||||
				html = replace(html, /%reason%/g,              markedEntry.reasonDE);
 | 
			
		||||
			}
 | 
			
		||||
			html = replace(html, /%restrictionCountries%/g,    countries);
 | 
			
		||||
			html = replace(html, /%rank%/g,      formatInteger(markedEntry.rank));
 | 
			
		||||
			html = replace(html, /%thumbnail%/g,               markedEntry.thumbnail);
 | 
			
		||||
			html = replace(html, /%rating%/g,     formatRating(markedEntry.rating));
 | 
			
		||||
			html = replace(html, /%viewCount%/g, formatInteger(markedEntry.viewCount));
 | 
			
		||||
			html = replace(html, /%category%/g,                markedEntry.category);
 | 
			
		||||
			
 | 
			
		||||
			if (!markedEntry.restrictedInDE > 1) html = replace(html, /%de%.*?%\/de%/g, '');
 | 
			
		||||
			
 | 
			
		||||
			html = replace(html, /%\/?de%/g, '');
 | 
			
		||||
			
 | 
			
		||||
			infoboxContent.html(html);
 | 
			
		||||
			$('#infoboxContent span').tooltip();
 | 
			
		||||
		}
 | 
			
		||||
	})();
 | 
			
		||||
	
 | 
			
		||||
	me.sort = function (options) {
 | 
			
		||||
		for (var i = 0; i < data.length; i++) {
 | 
			
		||||
			indexes[i].sortBy = options.callback(indexes[i].entry);
 | 
			
		||||
			indexes[i].oldIndex = i;
 | 
			
		||||
			indexes[i].entry.hint = options.hint(indexes[i].entry);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		indexes.sort(function (a, b) {
 | 
			
		||||
			if (a.sortBy == b.sortBy) {
 | 
			
		||||
				return a.oldIndex - b.oldIndex;
 | 
			
		||||
			} else {
 | 
			
		||||
				return a.sortBy - b.sortBy;
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		
 | 
			
		||||
		for (var i = 0; i < indexes.length; i++) {
 | 
			
		||||
			var entry = indexes[i].entry;
 | 
			
		||||
			var id = entry.id;
 | 
			
		||||
			var x = i % columns;
 | 
			
		||||
			var y = Math.floor(i/columns);
 | 
			
		||||
			
 | 
			
		||||
			entry.oldPos = entry.newPos;
 | 
			
		||||
			entry.newPos = i;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	var cHigh   = [237,  28,  36, 0.6];
 | 
			
		||||
	var cMiddle = [255, 255,  60, 0.6];
 | 
			
		||||
	var cLow    = [200, 255, 200, 0.8];
 | 
			
		||||
	
 | 
			
		||||
	var cHigh   = [180,  28,  36, 0.6];
 | 
			
		||||
	var cMiddle = [255, 142, 146, 0.6];
 | 
			
		||||
	var cLow    = [255, 255, 255, 0.8];
 | 
			
		||||
 | 
			
		||||
	me.flag = function (options) {
 | 
			
		||||
		var count = 0;
 | 
			
		||||
		for (var i = 0; i < indexes.length; i++) {
 | 
			
		||||
			var entry = indexes[i].entry;
 | 
			
		||||
			var flagged = options.callback(entry);
 | 
			
		||||
			var color;
 | 
			
		||||
			
 | 
			
		||||
			switch (flagged) {
 | 
			
		||||
				case 0.0: color = cLow;    break;
 | 
			
		||||
				case 0.5: color = cMiddle; break;
 | 
			
		||||
				case 1.0: color = cHigh;   break;
 | 
			
		||||
				default:
 | 
			
		||||
					var v = flagged*2;
 | 
			
		||||
					if (v > 1) {
 | 
			
		||||
						v -= 1;
 | 
			
		||||
						color = [
 | 
			
		||||
							cHigh[0]*v + (1-v)*cMiddle[0],
 | 
			
		||||
							cHigh[1]*v + (1-v)*cMiddle[1],
 | 
			
		||||
							cHigh[2]*v + (1-v)*cMiddle[2],
 | 
			
		||||
							cHigh[3]*v + (1-v)*cMiddle[3]
 | 
			
		||||
						]
 | 
			
		||||
					} else {
 | 
			
		||||
						color = [
 | 
			
		||||
							cMiddle[0]*v + (1-v)*cLow[0],
 | 
			
		||||
							cMiddle[1]*v + (1-v)*cLow[1],
 | 
			
		||||
							cMiddle[2]*v + (1-v)*cLow[2],
 | 
			
		||||
							cMiddle[3]*v + (1-v)*cLow[3]
 | 
			
		||||
						]
 | 
			
		||||
					}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if (flagged > 0.5) count++;
 | 
			
		||||
			
 | 
			
		||||
			entry.oldColor = entry.newColor;
 | 
			
		||||
			entry.newColor = color;
 | 
			
		||||
		}
 | 
			
		||||
		return count;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	me.makeItSo = function () {
 | 
			
		||||
		var image = imageNode[0];
 | 
			
		||||
 | 
			
		||||
		var frame = 1;
 | 
			
		||||
		var frameNumber = 10;
 | 
			
		||||
		
 | 
			
		||||
		var interval = setInterval(function () {
 | 
			
		||||
			var a = frame/frameNumber;
 | 
			
		||||
			a = (1-Math.cos(a*Math.PI))/2;
 | 
			
		||||
			if (frame >= frameNumber) a = 1;
 | 
			
		||||
 | 
			
		||||
			context.fillStyle = '#FFF';
 | 
			
		||||
			context.fillRect(0,0,width,height);
 | 
			
		||||
			
 | 
			
		||||
			var order = [];
 | 
			
		||||
			
 | 
			
		||||
			for (var i = 0; i < indexes.length; i++) {
 | 
			
		||||
				var entry = indexes[i].entry;
 | 
			
		||||
				var id = entry.id;
 | 
			
		||||
				order[i] = {
 | 
			
		||||
					entry:entry,
 | 
			
		||||
					value:(1-a)*entry.oldColor[3] + a*entry.newColor[3] 
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			order.sort(function (a,b) {
 | 
			
		||||
				if (a.value == b.value) {
 | 
			
		||||
					return a.newPos - b.newPos;
 | 
			
		||||
				} else {
 | 
			
		||||
					return a.value-b.value;
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
			
 | 
			
		||||
			
 | 
			
		||||
			for (var i = order.length-1; i >= 0; i--) {
 | 
			
		||||
				var entry = order[i].entry;
 | 
			
		||||
				var id = entry.id;
 | 
			
		||||
				
 | 
			
		||||
				var x0 = projectX[entry.oldPos];
 | 
			
		||||
				var y0 = projectY[entry.oldPos];
 | 
			
		||||
				var x1 = projectX[entry.newPos];
 | 
			
		||||
				var y1 = projectY[entry.newPos];
 | 
			
		||||
				
 | 
			
		||||
				var x = Math.round((1-a)*x0 + a*x1);
 | 
			
		||||
				var y = Math.round((1-a)*y0 + a*y1);
 | 
			
		||||
				
 | 
			
		||||
				context.drawImage(
 | 
			
		||||
					image,
 | 
			
		||||
					projectX[id],
 | 
			
		||||
					projectY[id],
 | 
			
		||||
					thumbWidth,
 | 
			
		||||
					thumbHeight,
 | 
			
		||||
					x,
 | 
			
		||||
					y,
 | 
			
		||||
					thumbWidth,
 | 
			
		||||
					thumbHeight
 | 
			
		||||
				);
 | 
			
		||||
				
 | 
			
		||||
				var color = [
 | 
			
		||||
					(1-a)*entry.oldColor[0] + a*entry.newColor[0],
 | 
			
		||||
					(1-a)*entry.oldColor[1] + a*entry.newColor[1],
 | 
			
		||||
					(1-a)*entry.oldColor[2] + a*entry.newColor[2],
 | 
			
		||||
					(1-a)*entry.oldColor[3] + a*entry.newColor[3] 
 | 
			
		||||
				];
 | 
			
		||||
			
 | 
			
		||||
				color = generateRGBA(color);
 | 
			
		||||
 | 
			
		||||
				context.fillStyle = color;
 | 
			
		||||
				context.fillRect(x, y, thumbWidth, thumbHeight);
 | 
			
		||||
				
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if (frame >= frameNumber) {
 | 
			
		||||
				clearInterval(interval);
 | 
			
		||||
				for (var i = 0; i < indexes.length; i++) {
 | 
			
		||||
					indexes[i].entry.oldColor = indexes[i].entry.newColor;
 | 
			
		||||
					indexes[i].entry.oldPos   = indexes[i].entry.newPos;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			frame++; 
 | 
			
		||||
		}, 60);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	me.makeItFast = function () {
 | 
			
		||||
		for (var i = 0; i < indexes.length; i++) {
 | 
			
		||||
			var entry = indexes[i].entry;
 | 
			
		||||
			var id = entry.id;
 | 
			
		||||
			
 | 
			
		||||
			var x = projectX[entry.newPos];
 | 
			
		||||
			var y = projectY[entry.newPos];			
 | 
			
		||||
			var color = generateRGBA(entry.newColor);
 | 
			
		||||
 | 
			
		||||
			context.fillStyle = color;
 | 
			
		||||
			context.fillRect(x, y, thumbWidth, thumbHeight);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	function generateRGBA(a) {
 | 
			
		||||
		return 'rgba('+Math.round(a[0])+','+Math.round(a[1])+','+Math.round(a[2])+','+Math.round(a[3]*100)/100+')';
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	function clamp(value, min, max) {
 | 
			
		||||
		if (value < min) value = min;
 | 
			
		||||
		if (value > max) value = max;
 | 
			
		||||
		return value; 
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	return me;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$(document).ready(function(){
 | 
			
		||||
	
 | 
			
		||||
	/* embed overlay code */
 | 
			
		||||
	
 | 
			
		||||
	$('body').append($($embed_overlay));
 | 
			
		||||
 | 
			
		||||
	$('.embed-button').click(function(evt){
 | 
			
		||||
		if ($('#embed-overlay:visible').length === 0) {
 | 
			
		||||
			$('#embed-overlay').fadeIn('fast');
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	var $clickIn = false;
 | 
			
		||||
	$('#embed-overlay').click(function(evt){
 | 
			
		||||
		if (!$clickIn) {
 | 
			
		||||
			$('#embed-overlay').fadeOut('fast');
 | 
			
		||||
		}
 | 
			
		||||
		$clickIn = false;
 | 
			
		||||
	});
 | 
			
		||||
	$('#embed-form').click(function(evt){
 | 
			
		||||
		$clickIn = true;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/* embed code*/
 | 
			
		||||
	if ($('#embed-form').length) {
 | 
			
		||||
		var $f = $('#embed-form');
 | 
			
		||||
		var $url = 'http://apps.opendatacity.de/gema-vs-youtube/';
 | 
			
		||||
		var embedCode = function(){
 | 
			
		||||
			var $size = $('input:radio[name=size]:checked',$f).val();
 | 
			
		||||
			var $lang = $('input:radio[name=lang]:checked',$f).val();
 | 
			
		||||
			$lang = ($lang === "") ? "de" : $lang;
 | 
			
		||||
			$size = ($size === "") ? "large" : $size;
 | 
			
		||||
 | 
			
		||||
			if ($lang == "de") {
 | 
			
		||||
				var text   = 'Die geblockten Top-1000-YouTube-Videos';
 | 
			
		||||
				var suffix = 'Unterstützt durch <a href="http://www.myvideo.de">MyVideo</a>. Realisiert von <a href="http://www.opendatacity.de/">OpenDataCity</a>. Anwendung steht unter <a rel="license" href="http://creativecommons.org/licenses/by/3.0/de/">CC-BY 3.0</a>.';
 | 
			
		||||
				var file   = 'frame.de.html';
 | 
			
		||||
			} else {
 | 
			
		||||
				var text   = 'Top 1000 YouTube Videos';
 | 
			
		||||
				var suffix = 'Supported by <a href="http://www.myvideo.de">MyVideo</a>. Made by <a href="http://www.opendatacity.de/">OpenDataCity</a>. This App is under <a rel="license" href="http://creativecommons.org/licenses/by/3.0/us/">CC-BY 3.0</a>.';
 | 
			
		||||
				var file   = 'frame.en.html';
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
					$('#embed-size',$f).show();
 | 
			
		||||
					switch ($size) {
 | 
			
		||||
						case 'large':  var $wh = 'width="860" height="610"'; break;
 | 
			
		||||
						case 'medium': var $wh = 'width="640" height="490"'; break;
 | 
			
		||||
						case 'small':  var $wh = 'width="520" height="370"'; break;
 | 
			
		||||
						case 'verysmall':  var $wh = 'width="420" height="740"'; break;
 | 
			
		||||
					}
 | 
			
		||||
					var $code = '<iframe src="'+$url+file+'" '+$wh+' scrolling="no" frameborder="0" style="margin:0"><a href="'+$url+'">'+text+'</a></iframe><br><small>'+suffix+'</small>';
 | 
			
		||||
			$('#embed-code', $f).text($code);
 | 
			
		||||
		};
 | 
			
		||||
		embedCode();
 | 
			
		||||
		$(":input", $f).change(function(){
 | 
			
		||||
			embedCode();
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,487 @@
 | 
			
		|||
 | 
			
		||||
var countryCodes = {
 | 
			
		||||
	'AD':{de:'Andorra',en:'Andorra'},
 | 
			
		||||
	'AE':{de:'Vereinigte Arabische Emirate',en:'United Arab Emirates'},
 | 
			
		||||
	'AF':{de:'Afghanistan',en:'Afghanistan'},
 | 
			
		||||
	'AG':{de:'Antigua und Barbuda',en:'Antigua and Barbuda'},
 | 
			
		||||
	'AI':{de:'Anguilla',en:'Anguilla'},
 | 
			
		||||
	'AL':{de:'Albanien',en:'Albania'},
 | 
			
		||||
	'AM':{de:'Armenien',en:'Armenia'},
 | 
			
		||||
	'AO':{de:'Angola',en:'Angola'},
 | 
			
		||||
	'AQ':{de:'Antarktika',en:'Antarctica'},
 | 
			
		||||
	'AR':{de:'Argentinien',en:'Argentina'},
 | 
			
		||||
	'AS':{de:'Amerikanisch-Samoa',en:'American Samoa'},
 | 
			
		||||
	'AT':{de:'Österreich',en:'Austria'},
 | 
			
		||||
	'AU':{de:'Australien',en:'Australia'},
 | 
			
		||||
	'AW':{de:'Aruba',en:'Aruba'},
 | 
			
		||||
	'AX':{de:'Åland',en:'Åland Islands'},
 | 
			
		||||
	'AZ':{de:'Aserbaidschan',en:'Azerbaijan'},
 | 
			
		||||
	'BA':{de:'Bosnien und Herzegowina',en:'Bosnia and Herzegovina'},
 | 
			
		||||
	'BB':{de:'Barbados',en:'Barbados'},
 | 
			
		||||
	'BD':{de:'Bangladesch',en:'Bangladesh'},
 | 
			
		||||
	'BE':{de:'Belgien',en:'Belgium'},
 | 
			
		||||
	'BF':{de:'Burkina Faso',en:'Burkina Faso'},
 | 
			
		||||
	'BG':{de:'Bulgarien',en:'Bulgaria'},
 | 
			
		||||
	'BH':{de:'Bahrain',en:'Bahrain'},
 | 
			
		||||
	'BI':{de:'Burundi',en:'Burundi'},
 | 
			
		||||
	'BJ':{de:'Benin',en:'Benin'},
 | 
			
		||||
	'BL':{de:'Saint-Barthélemy',en:'Saint Barthélemy'},
 | 
			
		||||
	'BM':{de:'Bermuda',en:'Bermuda'},
 | 
			
		||||
	'BN':{de:'Brunei Darussalam',en:'Brunei Darussalam'},
 | 
			
		||||
	'BO':{de:'Bolivien',en:'Bolivia, Plurinational State of'},
 | 
			
		||||
	'BQ':{de:'Bonaire, Sint Eustatius und Saba (Niederlande)',en:'Bonaire, Sint Eustatius and Saba'},
 | 
			
		||||
	'BR':{de:'Brasilien',en:'Brazil'},
 | 
			
		||||
	'BS':{de:'Bahamas',en:'Bahamas'},
 | 
			
		||||
	'BT':{de:'Bhutan',en:'Bhutan'},
 | 
			
		||||
	'BV':{de:'Bouvetinsel',en:'Bouvet Island'},
 | 
			
		||||
	'BW':{de:'Botswana',en:'Botswana'},
 | 
			
		||||
	'BY':{de:'Belarus (Weißrussland)',en:'Belarus'},
 | 
			
		||||
	'BZ':{de:'Belize',en:'Belize'},
 | 
			
		||||
	'CA':{de:'Kanada',en:'Canada'},
 | 
			
		||||
	'CC':{de:'Kokosinseln',en:'Cocos (Keeling) Islands'},
 | 
			
		||||
	'CD':{de:'Kongo, Demokratische Republik (ehem. Zaire)',en:'Congo, the Democratic Republic of the'},
 | 
			
		||||
	'CF':{de:'Zentralafrikanische Republik',en:'Central African Republic'},
 | 
			
		||||
	'CG':{de:'Republik Kongo',en:'Congo'},
 | 
			
		||||
	'CH':{de:'Schweiz',en:'Switzerland'},
 | 
			
		||||
	'CI':{de:'Elfenbeinküste',en:'Côte d’Ivoire'},
 | 
			
		||||
	'CK':{de:'Cookinseln',en:'Cook Islands'},
 | 
			
		||||
	'CL':{de:'Chile',en:'Chile'},
 | 
			
		||||
	'CM':{de:'Kamerun',en:'Cameroon'},
 | 
			
		||||
	'CN':{de:'China, Volksrepublik',en:'China'},
 | 
			
		||||
	'CO':{de:'Kolumbien',en:'Colombia'},
 | 
			
		||||
	'CR':{de:'Costa Rica',en:'Costa Rica'},
 | 
			
		||||
	'CU':{de:'Kuba',en:'Cuba'},
 | 
			
		||||
	'CV':{de:'Kap Verde',en:'Cape Verde'},
 | 
			
		||||
	'CW':{de:'Curaçao',en:'Curaçao'},
 | 
			
		||||
	'CX':{de:'Weihnachtsinsel',en:'Christmas Island'},
 | 
			
		||||
	'CY':{de:'Zypern',en:'Cyprus'},
 | 
			
		||||
	'CZ':{de:'Tschechische Republik',en:'Czech Republic'},
 | 
			
		||||
	'DE':{de:'Deutschland',en:'Germany'},
 | 
			
		||||
	'DJ':{de:'Dschibuti',en:'Djibouti'},
 | 
			
		||||
	'DK':{de:'Dänemark',en:'Denmark'},
 | 
			
		||||
	'DM':{de:'Dominica',en:'Dominica'},
 | 
			
		||||
	'DO':{de:'Dominikanische Republik',en:'Dominican Republic'},
 | 
			
		||||
	'DZ':{de:'Algerien',en:'Algeria'},
 | 
			
		||||
	'EC':{de:'Ecuador',en:'Ecuador'},
 | 
			
		||||
	'EE':{de:'Estland',en:'Estonia'},
 | 
			
		||||
	'EG':{de:'Ägypten',en:'Egypt'},
 | 
			
		||||
	'EH':{de:'Westsahara',en:'Western Sahara'},
 | 
			
		||||
	'ER':{de:'Eritrea',en:'Eritrea'},
 | 
			
		||||
	'ES':{de:'Spanien',en:'Spain'},
 | 
			
		||||
	'ET':{de:'Äthiopien',en:'Ethiopia'},
 | 
			
		||||
	'FI':{de:'Finnland',en:'Finland'},
 | 
			
		||||
	'FJ':{de:'Fidschi',en:'Fiji'},
 | 
			
		||||
	'FK':{de:'Falklandinseln',en:'Falkland Islands (Malvinas)'},
 | 
			
		||||
	'FM':{de:'Mikronesien',en:'Micronesia, Federated States of'},
 | 
			
		||||
	'FO':{de:'Färöer',en:'Faroe Islands'},
 | 
			
		||||
	'FR':{de:'Frankreich',en:'France'},
 | 
			
		||||
	'GA':{de:'Gabun',en:'Gabon'},
 | 
			
		||||
	'GB':{de:'Vereinigtes Königreich Großbritannien und Nordirland',en:'United Kingdom'},
 | 
			
		||||
	'GD':{de:'Grenada',en:'Grenada'},
 | 
			
		||||
	'GE':{de:'Georgien',en:'Georgia'},
 | 
			
		||||
	'GF':{de:'Französisch-Guayana',en:'French Guiana'},
 | 
			
		||||
	'GG':{de:'Guernsey (Kanalinsel)',en:'Guernsey'},
 | 
			
		||||
	'GH':{de:'Ghana',en:'Ghana'},
 | 
			
		||||
	'GI':{de:'Gibraltar',en:'Gibraltar'},
 | 
			
		||||
	'GL':{de:'Grönland',en:'Greenland'},
 | 
			
		||||
	'GM':{de:'Gambia',en:'Gambia'},
 | 
			
		||||
	'GN':{de:'Guinea',en:'Guinea'},
 | 
			
		||||
	'GP':{de:'Guadeloupe',en:'Guadeloupe'},
 | 
			
		||||
	'GQ':{de:'Äquatorialguinea',en:'Equatorial Guinea'},
 | 
			
		||||
	'GR':{de:'Griechenland',en:'Greece'},
 | 
			
		||||
	'GS':{de:'Südgeorgien und die Südlichen Sandwichinseln',en:'South Georgia and the South Sandwich Islands'},
 | 
			
		||||
	'GT':{de:'Guatemala',en:'Guatemala'},
 | 
			
		||||
	'GU':{de:'Guam',en:'Guam'},
 | 
			
		||||
	'GW':{de:'Guinea-Bissau',en:'Guinea-Bissau'},
 | 
			
		||||
	'GY':{de:'Guyana',en:'Guyana'},
 | 
			
		||||
	'HK':{de:'Hongkong',en:'Hong Kong'},
 | 
			
		||||
	'HM':{de:'Heard und McDonaldinseln',en:'Heard Island and McDonald Islands'},
 | 
			
		||||
	'HN':{de:'Honduras',en:'Honduras'},
 | 
			
		||||
	'HR':{de:'Kroatien',en:'Croatia'},
 | 
			
		||||
	'HT':{de:'Haiti',en:'Haiti'},
 | 
			
		||||
	'HU':{de:'Ungarn',en:'Hungary'},
 | 
			
		||||
	'ID':{de:'Indonesien',en:'Indonesia'},
 | 
			
		||||
	'IE':{de:'Irland',en:'Ireland'},
 | 
			
		||||
	'IL':{de:'Israel',en:'Israel'},
 | 
			
		||||
	'IM':{de:'Insel Man',en:'Isle of Man'},
 | 
			
		||||
	'IN':{de:'Indien',en:'India'},
 | 
			
		||||
	'IO':{de:'Britisches Territorium im Indischen Ozean',en:'British Indian Ocean Territory'},
 | 
			
		||||
	'IQ':{de:'Irak',en:'Iraq'},
 | 
			
		||||
	'IR':{de:'Iran, Islamische Republik',en:'Iran, Islamic Republic of'},
 | 
			
		||||
	'IS':{de:'Island',en:'Iceland'},
 | 
			
		||||
	'IT':{de:'Italien',en:'Italy'},
 | 
			
		||||
	'JE':{de:'Jersey (Kanalinsel)',en:'Jersey'},
 | 
			
		||||
	'JM':{de:'Jamaika',en:'Jamaica'},
 | 
			
		||||
	'JO':{de:'Jordanien',en:'Jordan'},
 | 
			
		||||
	'JP':{de:'Japan',en:'Japan'},
 | 
			
		||||
	'KE':{de:'Kenia',en:'Kenya'},
 | 
			
		||||
	'KG':{de:'Kirgisistan',en:'Kyrgyzstan'},
 | 
			
		||||
	'KH':{de:'Kambodscha',en:'Cambodia'},
 | 
			
		||||
	'KI':{de:'Kiribati',en:'Kiribati'},
 | 
			
		||||
	'KM':{de:'Komoren',en:'Comoros'},
 | 
			
		||||
	'KN':{de:'St. Kitts und Nevis',en:'Saint Kitts and Nevis'},
 | 
			
		||||
	'KP':{de:'Korea, Demokratische Volksrepublik (Nordkorea)',en:'Korea, Democratic People’s Republic of'},
 | 
			
		||||
	'KR':{de:'Korea, Republik (Südkorea)',en:'Korea, Republic of'},
 | 
			
		||||
	'KW':{de:'Kuwait',en:'Kuwait'},
 | 
			
		||||
	'KY':{de:'Kaimaninseln',en:'Cayman Islands'},
 | 
			
		||||
	'KZ':{de:'Kasachstan',en:'Kazakhstan'},
 | 
			
		||||
	'LA':{de:'Laos, Demokratische Volksrepublik',en:'Lao People’s Democratic Republic'},
 | 
			
		||||
	'LB':{de:'Libanon',en:'Lebanon'},
 | 
			
		||||
	'LC':{de:'St. Lucia',en:'Saint Lucia'},
 | 
			
		||||
	'LI':{de:'Liechtenstein',en:'Liechtenstein'},
 | 
			
		||||
	'LK':{de:'Sri Lanka',en:'Sri Lanka'},
 | 
			
		||||
	'LR':{de:'Liberia',en:'Liberia'},
 | 
			
		||||
	'LS':{de:'Lesotho',en:'Lesotho'},
 | 
			
		||||
	'LT':{de:'Litauen',en:'Lithuania'},
 | 
			
		||||
	'LU':{de:'Luxemburg',en:'Luxembourg'},
 | 
			
		||||
	'LV':{de:'Lettland',en:'Latvia'},
 | 
			
		||||
	'LY':{de:'Libyen',en:'Libya'},
 | 
			
		||||
	'MA':{de:'Marokko',en:'Morocco'},
 | 
			
		||||
	'MC':{de:'Monaco',en:'Monaco'},
 | 
			
		||||
	'MD':{de:'Moldawien (Republik Moldau)',en:'Moldova, Republic of'},
 | 
			
		||||
	'ME':{de:'Montenegro',en:'Montenegro'},
 | 
			
		||||
	'MF':{de:'Saint-Martin (franz. Teil)',en:'Saint Martin (French part)'},
 | 
			
		||||
	'MG':{de:'Madagaskar',en:'Madagascar'},
 | 
			
		||||
	'MH':{de:'Marshallinseln',en:'Marshall Islands'},
 | 
			
		||||
	'MK':{de:'Mazedonien, ehem. jugoslawische Republik',en:'Macedonia, the former Yugoslav Republic of'},
 | 
			
		||||
	'ML':{de:'Mali',en:'Mali'},
 | 
			
		||||
	'MM':{de:'Myanmar (Burma)',en:'Myanmar'},
 | 
			
		||||
	'MN':{de:'Mongolei',en:'Mongolia'},
 | 
			
		||||
	'MO':{de:'Macao',en:'Macao'},
 | 
			
		||||
	'MP':{de:'Nördliche Marianen',en:'Northern Mariana Islands'},
 | 
			
		||||
	'MQ':{de:'Martinique',en:'Martinique'},
 | 
			
		||||
	'MR':{de:'Mauretanien',en:'Mauritania'},
 | 
			
		||||
	'MS':{de:'Montserrat',en:'Montserrat'},
 | 
			
		||||
	'MT':{de:'Malta',en:'Malta'},
 | 
			
		||||
	'MU':{de:'Mauritius',en:'Mauritius'},
 | 
			
		||||
	'MV':{de:'Malediven',en:'Maldives'},
 | 
			
		||||
	'MW':{de:'Malawi',en:'Malawi'},
 | 
			
		||||
	'MX':{de:'Mexiko',en:'Mexico'},
 | 
			
		||||
	'MY':{de:'Malaysia',en:'Malaysia'},
 | 
			
		||||
	'MZ':{de:'Mosambik',en:'Mozambique'},
 | 
			
		||||
	'NA':{de:'Namibia',en:'Namibia'},
 | 
			
		||||
	'NC':{de:'Neukaledonien',en:'New Caledonia'},
 | 
			
		||||
	'NE':{de:'Niger',en:'Niger'},
 | 
			
		||||
	'NF':{de:'Norfolkinsel',en:'Norfolk Island'},
 | 
			
		||||
	'NG':{de:'Nigeria',en:'Nigeria'},
 | 
			
		||||
	'NI':{de:'Nicaragua',en:'Nicaragua'},
 | 
			
		||||
	'NL':{de:'Niederlande',en:'Netherlands'},
 | 
			
		||||
	'NO':{de:'Norwegen',en:'Norway'},
 | 
			
		||||
	'NP':{de:'Nepal',en:'Nepal'},
 | 
			
		||||
	'NR':{de:'Nauru',en:'Nauru'},
 | 
			
		||||
	'NU':{de:'Niue',en:'Niue'},
 | 
			
		||||
	'NZ':{de:'Neuseeland',en:'New Zealand'},
 | 
			
		||||
	'OM':{de:'Oman',en:'Oman'},
 | 
			
		||||
	'PA':{de:'Panama',en:'Panama'},
 | 
			
		||||
	'PE':{de:'Peru',en:'Peru'},
 | 
			
		||||
	'PF':{de:'Französisch-Polynesien',en:'French Polynesia'},
 | 
			
		||||
	'PG':{de:'Papua-Neuguinea',en:'Papua New Guinea'},
 | 
			
		||||
	'PH':{de:'Philippinen',en:'Philippines'},
 | 
			
		||||
	'PK':{de:'Pakistan',en:'Pakistan'},
 | 
			
		||||
	'PL':{de:'Polen',en:'Poland'},
 | 
			
		||||
	'PM':{de:'Saint-Pierre und Miquelon',en:'Saint Pierre and Miquelon'},
 | 
			
		||||
	'PN':{de:'Pitcairninseln',en:'Pitcairn'},
 | 
			
		||||
	'PR':{de:'Puerto Rico',en:'Puerto Rico'},
 | 
			
		||||
	'PS':{de:'Palästinensische Autonomiegebiete',en:'Palestinian Territory, Occupied'},
 | 
			
		||||
	'PT':{de:'Portugal',en:'Portugal'},
 | 
			
		||||
	'PW':{de:'Palau',en:'Palau'},
 | 
			
		||||
	'PY':{de:'Paraguay',en:'Paraguay'},
 | 
			
		||||
	'QA':{de:'Katar',en:'Qatar'},
 | 
			
		||||
	'RE':{de:'Réunion',en:'Réunion'},
 | 
			
		||||
	'RO':{de:'Rumänien',en:'Romania'},
 | 
			
		||||
	'RS':{de:'Serbien',en:'Serbia'},
 | 
			
		||||
	'RU':{de:'Russische Föderation',en:'Russian Federation'},
 | 
			
		||||
	'RW':{de:'Ruanda',en:'Rwanda'},
 | 
			
		||||
	'SA':{de:'Saudi-Arabien',en:'Saudi Arabia'},
 | 
			
		||||
	'SB':{de:'Salomonen',en:'Solomon Islands'},
 | 
			
		||||
	'SC':{de:'Seychellen',en:'Seychelles'},
 | 
			
		||||
	'SD':{de:'Sudan',en:'Sudan'},
 | 
			
		||||
	'SE':{de:'Schweden',en:'Sweden'},
 | 
			
		||||
	'SG':{de:'Singapur',en:'Singapore'},
 | 
			
		||||
	'SH':{de:'St. Helena',en:'Saint Helena, Ascension and Tristan da Cunha'},
 | 
			
		||||
	'SI':{de:'Slowenien',en:'Slovenia'},
 | 
			
		||||
	'SJ':{de:'Svalbard und Jan Mayen',en:'Svalbard and Jan Mayen'},
 | 
			
		||||
	'SK':{de:'Slowakei',en:'Slovakia'},
 | 
			
		||||
	'SL':{de:'Sierra Leone',en:'Sierra Leone'},
 | 
			
		||||
	'SM':{de:'San Marino',en:'San Marino'},
 | 
			
		||||
	'SN':{de:'Senegal',en:'Senegal'},
 | 
			
		||||
	'SO':{de:'Somalia',en:'Somalia'},
 | 
			
		||||
	'SR':{de:'Suriname',en:'Suriname'},
 | 
			
		||||
	'SS':{de:'Südsudan',en:'South Sudan'},
 | 
			
		||||
	'ST':{de:'São Tomé und Príncipe',en:'Sao Tome and Principe'},
 | 
			
		||||
	'SV':{de:'El Salvador',en:'El Salvador'},
 | 
			
		||||
	'SX':{de:'Sint Maarten (niederl. Teil)',en:'Sint Maarten (Dutch part)'},
 | 
			
		||||
	'SY':{de:'Syrien, Arabische Republik',en:'Syrian Arab Republic'},
 | 
			
		||||
	'SZ':{de:'Swasiland',en:'Swaziland'},
 | 
			
		||||
	'TC':{de:'Turks- und Caicosinseln',en:'Turks and Caicos Islands'},
 | 
			
		||||
	'TD':{de:'Tschad',en:'Chad'},
 | 
			
		||||
	'TF':{de:'Französische Süd- und Antarktisgebiete',en:'French Southern Territories'},
 | 
			
		||||
	'TG':{de:'Togo',en:'Togo'},
 | 
			
		||||
	'TH':{de:'Thailand',en:'Thailand'},
 | 
			
		||||
	'TJ':{de:'Tadschikistan',en:'Tajikistan'},
 | 
			
		||||
	'TK':{de:'Tokelau',en:'Tokelau'},
 | 
			
		||||
	'TL':{de:'Osttimor (Timor-Leste)',en:'Timor-Leste'},
 | 
			
		||||
	'TM':{de:'Turkmenistan',en:'Turkmenistan'},
 | 
			
		||||
	'TN':{de:'Tunesien',en:'Tunisia'},
 | 
			
		||||
	'TO':{de:'Tonga',en:'Tonga'},
 | 
			
		||||
	'TR':{de:'Türkei',en:'Turkey'},
 | 
			
		||||
	'TT':{de:'Trinidad und Tobago',en:'Trinidad and Tobago'},
 | 
			
		||||
	'TV':{de:'Tuvalu',en:'Tuvalu'},
 | 
			
		||||
	'TW':{de:'Republik China (Taiwan)',en:'Taiwan, Province of China'},
 | 
			
		||||
	'TZ':{de:'Tansania, Vereinigte Republik',en:'Tanzania, United Republic of'},
 | 
			
		||||
	'UA':{de:'Ukraine',en:'Ukraine'},
 | 
			
		||||
	'UG':{de:'Uganda',en:'Uganda'},
 | 
			
		||||
	'UM':{de:'United States Minor Outlying Islands',en:'United States Minor Outlying Islands'},
 | 
			
		||||
	'US':{de:'Vereinigte Staaten von Amerika',en:'United States'},
 | 
			
		||||
	'UY':{de:'Uruguay',en:'Uruguay'},
 | 
			
		||||
	'UZ':{de:'Usbekistan',en:'Uzbekistan'},
 | 
			
		||||
	'VA':{de:'Vatikanstadt',en:'Holy See (Vatican City State)'},
 | 
			
		||||
	'VC':{de:'St. Vincent und die Grenadinen',en:'Saint Vincent and the Grenadines'},
 | 
			
		||||
	'VE':{de:'Venezuela',en:'Venezuela, Bolivarian Republic of'},
 | 
			
		||||
	'VG':{de:'Britische Jungferninseln',en:'Virgin Islands, British'},
 | 
			
		||||
	'VI':{de:'Amerikanische Jungferninseln',en:'Virgin Islands, U.S.'},
 | 
			
		||||
	'VN':{de:'Vietnam',en:'Viet Nam'},
 | 
			
		||||
	'VU':{de:'Vanuatu',en:'Vanuatu'},
 | 
			
		||||
	'WF':{de:'Wallis und Futuna',en:'Wallis and Futuna'},
 | 
			
		||||
	'WS':{de:'Samoa',en:'Samoa'},
 | 
			
		||||
	'YE':{de:'Jemen',en:'Yemen'},
 | 
			
		||||
	'YT':{de:'Mayotte',en:'Mayotte'},
 | 
			
		||||
	'ZA':{de:'Südafrika',en:'South Africa'},
 | 
			
		||||
	'ZM':{de:'Sambia',en:'Zambia'},
 | 
			
		||||
	'ZW':{de:'Simbabwe',en:'Zimbabwe'},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var canvas;
 | 
			
		||||
var sizeMode;
 | 
			
		||||
var thumbWidth, thumbHeight, columns, rows, imageUrl;
 | 
			
		||||
 | 
			
		||||
$(function () {
 | 
			
		||||
	for (var i = 0; i < data.length; i++) {
 | 
			
		||||
		var entry = data[i];
 | 
			
		||||
 | 
			
		||||
		entry.publishedTS = (new Date(entry.published)).getTime();
 | 
			
		||||
		entry.updatedTS   = (new Date(entry.updated  )).getTime();
 | 
			
		||||
		
 | 
			
		||||
		entry.restrictionCountries = {};
 | 
			
		||||
		for (var j = 0; j < entry.restrictionsAll.length; j++) {
 | 
			
		||||
			entry.restrictionCountries[entry.restrictionsAll[j]] = true;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	var width = $(window).width();
 | 
			
		||||
 | 
			
		||||
	     if (width < 520) sizeMode = 1;
 | 
			
		||||
	else if (width < 640) sizeMode = 0;
 | 
			
		||||
	else if (width < 860) sizeMode = 1;
 | 
			
		||||
	else sizeMode = 2;
 | 
			
		||||
	
 | 
			
		||||
	switch (sizeMode) {
 | 
			
		||||
		case 0: thumbWidth = 11; thumbHeight =  9; columns = 25; rows = 40; imageUrl = 'assets/img/grid_520.jpg'; break;
 | 
			
		||||
		case 1: thumbWidth = 16; thumbHeight = 12; columns = 25; rows = 40; imageUrl = 'assets/img/grid_640.jpg'; break;
 | 
			
		||||
		case 2: thumbWidth = 20; thumbHeight = 15; columns = 25; rows = 40; imageUrl = 'assets/img/grid_860.jpg'; break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	$('#gridImage').attr('src', imageUrl);
 | 
			
		||||
	$('#gridImage, #gridCanvas, #gridCanvasOverlay').attr({width: thumbWidth*columns, height: thumbHeight*rows});
 | 
			
		||||
	
 | 
			
		||||
	canvas = new Canvas({
 | 
			
		||||
		imageNode: $('#gridImage'),
 | 
			
		||||
		node: $('#gridCanvas'),
 | 
			
		||||
		nodeOverlay: $('#gridCanvasOverlay'),
 | 
			
		||||
		thumbWidth: thumbWidth,
 | 
			
		||||
		thumbHeight: thumbHeight,
 | 
			
		||||
		columns: columns,
 | 
			
		||||
		data: data
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
	$('#gridFlag button').click(function (e) {
 | 
			
		||||
		updateCanvas({ flagType:$(e.target).attr('value') });
 | 
			
		||||
	})
 | 
			
		||||
	
 | 
			
		||||
	$('#gridSort button').click(function (e) {
 | 
			
		||||
		updateCanvas({ sortType:$(e.target).attr('value') });
 | 
			
		||||
	})
 | 
			
		||||
	
 | 
			
		||||
	updateCanvas({initialize:true});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function updateCanvas(options) {
 | 
			
		||||
	options = options || {};
 | 
			
		||||
	var flagType = options.flagType || $('#gridFlag .active').attr('value');
 | 
			
		||||
	var sortType = options.sortType || $('#gridSort .active').attr('value');
 | 
			
		||||
	
 | 
			
		||||
	var flag;
 | 
			
		||||
	var sort = function (entry) { return -entry.restrictedInDE };
 | 
			
		||||
	var hint;
 | 
			
		||||
	if (inEnglishPlease) {
 | 
			
		||||
		hint = function (entry) { return (entry.restrictedInDE > 1) ? 'Reason:<br><i>'+entry.reasonEN+'</i>' : '' };
 | 
			
		||||
	} else {
 | 
			
		||||
		hint = function (entry) { return (entry.restrictedInDE > 1) ? 'Begründung:<br><i>'+entry.reasonDE+'</i>' : '' };
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	switch (flagType.split('-')[0]) {
 | 
			
		||||
		case 'germany':
 | 
			
		||||
			flag = function (entry) { return [0,0,1.0,1.0,1.0][entry.restrictedInDE] };
 | 
			
		||||
			hint
 | 
			
		||||
		break;
 | 
			
		||||
		case 'gema':
 | 
			
		||||
			flag = function (entry) { return [0,0,1.0,0.2,0.2][entry.restrictedInDE] };
 | 
			
		||||
		break;
 | 
			
		||||
		case 'other':
 | 
			
		||||
			flag = function (entry) { return [0,0,0.2,1.0,1.0][entry.restrictedInDE] };
 | 
			
		||||
		break;
 | 
			
		||||
		case 'foreign':
 | 
			
		||||
			flag = function (entry) { return  (entry.restrictionsAll.length > ((entry.restrictedInDE > 1) ? 1 : 0)) ? 1 : 0 };
 | 
			
		||||
			sort = function (entry) {
 | 
			
		||||
				var inDE = (entry.restrictedInDE > 1) ? 1 : 0;
 | 
			
		||||
				var onlyForeign = entry.restrictionsAll.length - inDE;
 | 
			
		||||
				return -onlyForeign;
 | 
			
		||||
			};
 | 
			
		||||
			hint = function (entry) {
 | 
			
		||||
				if (entry.restrictedInDE > 1) {
 | 
			
		||||
					if (entry.restrictionsAll.length > 1) {
 | 
			
		||||
						if (entry.restrictionsAll.length > 2) {
 | 
			
		||||
							if (inEnglishPlease) {
 | 
			
		||||
								return 'blocked in '+(entry.restrictionsAll.length-1)+' countries<br>and in Germany';
 | 
			
		||||
							} else {
 | 
			
		||||
								return 'gesperrt in '+(entry.restrictionsAll.length-1)+' Ländern,<br>zusätzlich auch in Deutschland';
 | 
			
		||||
							}
 | 
			
		||||
						} else {
 | 
			
		||||
							var id = (entry.restrictionsAll[0] == 'DE') ? 1 : 0; 
 | 
			
		||||
							var code = countryCodes[entry.restrictionsAll[id]];
 | 
			
		||||
							if (inEnglishPlease) {
 | 
			
		||||
								return 'blocked in one country ('+code.en+')<br>and in Germany';
 | 
			
		||||
							} else {
 | 
			
		||||
								return 'gesperrt in einem Land ('+code.de+'),<br>zusätzlich auch in Deutschland';
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					} else {
 | 
			
		||||
						if (inEnglishPlease) {
 | 
			
		||||
							return 'blocked only in Germany';
 | 
			
		||||
						} else {
 | 
			
		||||
							return 'gesperrt nur in Deutschland';
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					if (entry.restrictionsAll.length > 1) {
 | 
			
		||||
 | 
			
		||||
						if (inEnglishPlease) {
 | 
			
		||||
							return 'blocked in '+entry.restrictionsAll.length+' countries,<br>but not in Germany';
 | 
			
		||||
						} else {
 | 
			
		||||
							return 'gesperrt in '+entry.restrictionsAll.length+' Ländern,<br>aber nicht in Deutschland';
 | 
			
		||||
						}
 | 
			
		||||
					} else if (entry.restrictionsAll.length > 0) {
 | 
			
		||||
							var code = countryCodes[entry.restrictionsAll[0]];
 | 
			
		||||
							if (inEnglishPlease) {
 | 
			
		||||
								return 'blocked only in '+code.en;
 | 
			
		||||
							} else {
 | 
			
		||||
								return 'gesperrt nur in '+code.de;
 | 
			
		||||
							}
 | 
			
		||||
					} else {
 | 
			
		||||
						if (inEnglishPlease) {
 | 
			
		||||
							return 'nowhere blocked';
 | 
			
		||||
						} else {
 | 
			
		||||
							return 'nirgends gesperrt';
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		break;
 | 
			
		||||
		case 'country':
 | 
			
		||||
			var country = flagType.split('-')[1];
 | 
			
		||||
			var code = countryCodes[country];
 | 
			
		||||
			flag = function (entry) { return  (entry.restrictionCountries[country] === true) ? 1 : 0 };
 | 
			
		||||
			sort = function (entry) { return -((entry.restrictionCountries[country] === true) ? 1000 : 0); };
 | 
			
		||||
			hint = function (entry) {
 | 
			
		||||
				if (entry.restrictionCountries[country] === true) {
 | 
			
		||||
					return inEnglishPlease ? 'blocked in '+code.en : 'gesperrt in „'+code.de+'”';
 | 
			
		||||
				} else {
 | 
			
		||||
					return '';
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	switch (sortType) {
 | 
			
		||||
		case 'rank':
 | 
			
		||||
			sort = function (entry) { return entry.rank	};
 | 
			
		||||
		break;
 | 
			
		||||
		case 'rating':
 | 
			
		||||
			sort = function (entry) { return -entry.rating	};
 | 
			
		||||
		break;
 | 
			
		||||
		case 'category':
 | 
			
		||||
			sort = function (entry) { return  entry.category.toLowerCase() };
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	canvas.sort({
 | 
			
		||||
		callback: sort,
 | 
			
		||||
		hint: hint
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
	var value = canvas.flag({
 | 
			
		||||
		callback: flag
 | 
			
		||||
	});
 | 
			
		||||
	
 | 
			
		||||
	setCounter(value);
 | 
			
		||||
	
 | 
			
		||||
	if (options.initialize) {
 | 
			
		||||
		canvas.makeItFast();
 | 
			
		||||
	} else {
 | 
			
		||||
		canvas.makeItSo();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var oldValue, newValue, counterInterval;
 | 
			
		||||
function setCounter(value) {
 | 
			
		||||
	function setValue(value) {
 | 
			
		||||
		value = (value/10).toFixed(1).replace(/\./, ',')+'%';
 | 
			
		||||
		if (value.length < 5) value = '  '+value;
 | 
			
		||||
		$('#display-number-content').html(value);
 | 
			
		||||
	}
 | 
			
		||||
	if (oldValue === undefined) {
 | 
			
		||||
		setValue(value);
 | 
			
		||||
		oldValue = value;
 | 
			
		||||
	} else {
 | 
			
		||||
		clearInterval(counterInterval);
 | 
			
		||||
		(function () {
 | 
			
		||||
			var frame = 1;
 | 
			
		||||
			var frameNumber = 20;
 | 
			
		||||
			counterInterval = setInterval(
 | 
			
		||||
				function () {
 | 
			
		||||
					if (frame >= frameNumber) {
 | 
			
		||||
						setValue(value);
 | 
			
		||||
						oldValue = value;
 | 
			
		||||
						clearInterval(counterInterval);
 | 
			
		||||
					} else {
 | 
			
		||||
						var a = frame/frameNumber;
 | 
			
		||||
						a = (1-Math.cos(a*Math.PI))/2;
 | 
			
		||||
						var v = (1-a)*oldValue + a*value;
 | 
			
		||||
						setValue(v);
 | 
			
		||||
						frame++
 | 
			
		||||
					}
 | 
			
		||||
				}, 30
 | 
			
		||||
			);
 | 
			
		||||
		})();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function formatRating(value) {
 | 
			
		||||
	return value.toFixed(2).replace(/\./, ',');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function formatInteger(value) {
 | 
			
		||||
	var t = value.toFixed(0);
 | 
			
		||||
	for (var i = t.length-3; i > 0; i -= 3) {
 | 
			
		||||
		t = t.substr(0, i) + '.' + t.substr(i); 
 | 
			
		||||
	}
 | 
			
		||||
	return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function formatDate(value) {
 | 
			
		||||
	value = new Date(value);
 | 
			
		||||
	var day   = value.getDate();
 | 
			
		||||
	var month = value.getMonth() + 1;
 | 
			
		||||
	var year  = value.getFullYear();
 | 
			
		||||
	return day + '.' + month + '.' + year;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,123 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html lang="de">
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>GEMA versus YouTubes Top 1000</title>
 | 
			
		||||
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | 
			
		||||
 | 
			
		||||
		<base href="http://apps.opendatacity.de/gema-vs-youtube/" target="_parent">
 | 
			
		||||
 | 
			
		||||
		<meta property="og:title" content="GEMA versus YouTubes Top 1000" />
 | 
			
		||||
		<meta property="og:type" content="article" />
 | 
			
		||||
		<meta property="og:url" content="http://apps.opendatacity.de/gema-vs-youtube/" />
 | 
			
		||||
		<meta property="og:image" content="http://datenjournalist.de/wp-content/uploads/2013/01/grid_by_reason-853x1024.jpg" />
 | 
			
		||||
 | 
			
		||||
		<link href="assets/css/bootstrap.min.css" rel="stylesheet" type="text/css">
 | 
			
		||||
		<link href="assets/css/index.css" rel="stylesheet" type="text/css">
 | 
			
		||||
 | 
			
		||||
		<script src="assets/js/jquery-1.8.3.min.js" type="text/javascript"></script>
 | 
			
		||||
		<script src="assets/js/bootstrap.min.js" type="text/javascript"></script>
 | 
			
		||||
		<script src="assets/js/helper.js" type="text/javascript"></script>
 | 
			
		||||
		<script type="text/javascript">
 | 
			
		||||
			var $embed_overlay = '<div id="embed-overlay"><div id="embed-content"><h1>Weitergeben</h1><form name="embed-form" id="embed-form" action="javascript:;" method="post"><fieldset id="embed-size" class="form-inline"><legend>Größe</legend><label class="radio"><input type="radio" name="size" value="large" checked="checked"> Groß (860×610)</label><label class="radio"><input type="radio" name="size" value="medium"> Mittel (640×490)</label><label class="radio"><input type="radio" name="size" value="small"> Klein (520×370)</label><label class="radio"><input type="radio" name="size" value="verysmall"> Sehr klein, aber hoch (420×740)</label></fieldset><fieldset class="form-inline"><legend>Sprache</legend><label class="radio"><input type="radio" name="lang" value="de" checked="checked"> Deutsch</label><label class="radio"><input type="radio" name="lang" value="en"> Englisch</label></fieldset><h2>Code</h2><p>Kopiere diesen Code in Deine Webseite:</p><code id="embed-code"></code></form><p><a href="javascript:;" class="btn btn-medium btn-primary">Schließen</a></p></div></div>';
 | 
			
		||||
		</script>
 | 
			
		||||
	</head>
 | 
			
		||||
	<body>
 | 
			
		||||
		<div id="fb-root"></div>
 | 
			
		||||
		<script>(function(d, s, id) {
 | 
			
		||||
			var js, fjs = d.getElementsByTagName(s)[0];
 | 
			
		||||
			if (d.getElementById(id)) return;
 | 
			
		||||
			js = d.createElement(s); js.id = id;
 | 
			
		||||
			js.src = "//connect.facebook.net/de_DE/all.js#xfbml=1";
 | 
			
		||||
			fjs.parentNode.insertBefore(js, fjs);
 | 
			
		||||
		}(document, 'script', 'facebook-jssdk'));</script>
 | 
			
		||||
		<div id="container">
 | 
			
		||||
			<h1>GEMA versus YouTubes Top 1000</h1>
 | 
			
		||||
			<div style="position:relative;">
 | 
			
		||||
				<p class="lead" style="width:600px;">
 | 
			
		||||
					Ein großer Teil der YouTube-Videos ist nicht überall zu sehen.<br />
 | 
			
		||||
					Fast 19% der weltweiten Top 1000-Videos sind in einem oder mehreren Ländern außerhalb Deutschlands gesperrt.<br />
 | 
			
		||||
					In Deutschland jedoch sind über <strong>60%</strong> der 1000 beliebtesten Videos nicht verfügbar, weil YouTube davon ausgeht, dass die Musikrechte <strong>„möglicherweise“</strong> bei der Musikverwertungsgesellschaft GEMA liegen.
 | 
			
		||||
				</p>
 | 
			
		||||
 | 
			
		||||
				<div id="social" style="position:absolute; bottom:10px; right:0; width:180px">
 | 
			
		||||
					<div class="social">
 | 
			
		||||
						<small><b>deutsch</b> | <a href="http://apps.opendatacity.de/gema-vs-youtube/en/">english</a></small>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div id="social-twitter" class="social">
 | 
			
		||||
						<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://apps.opendatacity.de/gema-vs-youtube/" data-text="GEMA versus YouTube" data-via="opendatacity" data-lang="de">Twittern</a>
 | 
			
		||||
						<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div id="social-google" class="social">
 | 
			
		||||
						<div class="g-plusone"></div>
 | 
			
		||||
						<script type="text/javascript">
 | 
			
		||||
							window.___gcfg = {lang: 'de'};
 | 
			
		||||
 | 
			
		||||
							(function() {
 | 
			
		||||
								var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
 | 
			
		||||
								po.src = 'https://apis.google.com/js/plusone.js';
 | 
			
		||||
								var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
 | 
			
		||||
							})();
 | 
			
		||||
						</script>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div id="social-facebook" class="social">
 | 
			
		||||
						<div class="fb-like" data-href="http://apps.opendatacity.de/gema-vs-youtube/" data-send="false" data-layout="button_count" data-width="180" data-show-faces="true"></div>
 | 
			
		||||
					</div>
 | 
			
		||||
					<div class="social"><a href="javascript:;" class="btn btn-primary embed-button">Einbetten</a></div>
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
 | 
			
		||||
			
 | 
			
		||||
			<iframe src="frame.de.html" width="860" height="610" scrolling="no" frameborder="0"><a href="">Die geblockten Top-1000-YouTube-Videos</a></iframe><p>Unterstützt durch <a href="http://www.myvideo.de" rel="follow">MyVideo</a>. Realisiert von <a href="http://www.opendatacity.de/">OpenDataCity</a>. Anwendung steht unter <a rel="license" href="http://creativecommons.org/licenses/by/3.0/de/">CC-BY 3.0</a>.</p>
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			<div class="row-fluid" style="margin-top:50px">
 | 
			
		||||
 | 
			
		||||
				<div class="span6">
 | 
			
		||||
					<h3>Weitere Informationen</h3>
 | 
			
		||||
					<p>
 | 
			
		||||
						Eine genauere Analyse der Daten so wie ein Making-of befindet sich auf <a href="http://datenjournalist.de/ueber-unsere-app-gema-vs-youtube">datenjournalist.de</a>. Außerdem bieten wir die gesammelten Daten zum Download an:
 | 
			
		||||
					</p>
 | 
			
		||||
					<p>
 | 
			
		||||
						<a href="data/top1000.tsv" class="btn btn-inverse">Download Data</a>
 | 
			
		||||
					</p>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div class="span6">
 | 
			
		||||
					<h3>Weiterverwendung</h3>
 | 
			
		||||
					<p>
 | 
			
		||||
						Die Applikation kann kann frei verwendet werden. Der HTML-Code, um die Applikation in die eigene Webseite oder den eigenen Blog einzubetten, kann hier generiert werden:
 | 
			
		||||
					</p>
 | 
			
		||||
					<p>
 | 
			
		||||
						<a href="javascript:;" class="btn btn-primary embed-button">Code zum Einbetten</a>
 | 
			
		||||
					</p>
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
 | 
			
		||||
			<hr style="margin-top:70px; border-color:#EEE">
 | 
			
		||||
 | 
			
		||||
			<div class="row-fluid">
 | 
			
		||||
				<div class="span4">
 | 
			
		||||
					Unterstützt durch <br><a href="http://www.myvideo.de/" rel="follow" id="mvlogo">MyVideo</a>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div class="span4">
 | 
			
		||||
					Realisiert von <br><a href="http://www.opendatacity.de/" id="odclogo">OpenDataCity</a>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div class="span4" id="license">
 | 
			
		||||
					Diese App steht unter einer <a rel="license" href="http://creativecommons.org/licenses/by/3.0/de/">Creative Commons Namensnennung 3.0 Lizenz</a>.
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
			 <p style="text-align: right; margin-top: 10px">Diese Seite wird mit Google Analytics ausgewertet. <a href="http://www.opendatacity.de/kontakt/">Impressum</a></p>
 | 
			
		||||
		</div>
 | 
			
		||||
		<script type="text/javascript">
 | 
			
		||||
			var _gaq = _gaq || [];
 | 
			
		||||
			_gaq.push(['_setAccount', 'UA-38022006-1']);
 | 
			
		||||
			_gaq.push(['_trackPageview']);
 | 
			
		||||
 | 
			
		||||
			(function() {
 | 
			
		||||
				var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
 | 
			
		||||
				ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
 | 
			
		||||
				var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 | 
			
		||||
			})();
 | 
			
		||||
		</script>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||