<html>

	<meta charset="utf-8">

	<head>
	
		<script src="js/wordcloud2.js"></script>
		<script src="js/jquery-3.4.1.min.js"></script>
		<script src="data/Data.js"></script>

	</head>
	
	<body onload="run(2000, 1000);">
	
		<center>
			<canvas id="canvas" class="canvas" style="display:block;" ondblclick="$filePicker.toggle();"></canvas>
			<div id="html-canvas" class="canvas" style="display:none;"></div>
			<input type="file" name="filePicker" accept="image/*" id="filein">			
    	</center>
        
		<script>
		
			// Establecemos la transparencia del fondo de las letras...
			var alphaBGWords = 22;

			// Convertimos el JSON de Data.js en una lista para WordCloud...
			var maxWords = 0; 	// Establecemos el número máximo de palabras, 0 para todas.
			list = [];			// Generamos una lista vacía...
			
			// Por cada elemento en db hacemos una entrada (palabra, frecuencia) en la lista...
			for (var i in db) {
				// Guardamos el elemento...
				list.push([db[i]["word"], db[i]["freq"]]);
				// Salimos cuando lleguemos al máximo permitido (0 para todas)...
				if (i == maxWords && maxWords != 0) break;
			}
			
			// Tomamos los elementos HTML que vamos a ocupar...
			var $mainCanvas = $('#canvas');
			var $htmlCanvas = $('#html-canvas');
			var $filePicker = $('#filein');
			
			$filePicker.hide();
			
			// Creamos los elementos globales que vamos a ocupar...
			var maskCanvas = null;
			var img = new Image();
			var url;
			
			
			// Cuando se selecciona un archivo TODO: Que lo tome automáticamente...
			$filePicker.on('change', function() {
			
				var file = $filePicker[0].files[0];
				if (!file) return;
				url = window.URL.createObjectURL(file);		
				img.src = url;
				$filePicker.hide();

			});	

			// Cuando la imagen se cargue...
			img.onload = function readPixels() {
			
				// Destruimos URL
				window.URL.revokeObjectURL(url)
				
			   	// Creamos un nuevo canvas...
				maskCanvas = document.createElement('canvas');
				maskCanvas.width = img.width;
				maskCanvas.height = img.height;

				var ctx = maskCanvas.getContext('2d');
					ctx.drawImage(img, 0, 0, img.width, img.height);

				var imageData = ctx.getImageData(0, 0, maskCanvas.width, maskCanvas.height);
				var newImageData = ctx.createImageData(imageData);
			
				for (var i = 0; i < imageData.data.length; i += 4){
					var alpha = imageData.data[i + 3];
					//Si el alpha es menor que 128 (transparente) pero mayor que 10 (no es fondo)...
					if (alpha < 128 && alpha > 10 ){
						// Dibujamos, lo marcamos de negro y sin transparencia...
						newImageData.data[i] = newImageData.data[i + 1] = newImageData.data[i + 2] = 0;
						newImageData.data[i + 3] = 255;
					
					}else{
						// No dibujamos y lo pintamos de blanco y transparente en la máscara...
						newImageData.data[i] = newImageData.data[i + 1] = newImageData.data[i + 2] = 255;
						newImageData.data[i + 3] = 0;						
					}
				}
				
				ctx.putImageData(newImageData, 0, 0);

				run(img.width, img.height);
			};

			var run = function run(imgWidth, imgHeight) {
			
				console.log("voy");
			
				// Set the width and height

				var cScale = 0.8;
				
				// Obtenemos la resolución del navegador...
				var navWidth = window.innerWidth;
				var navHeight = window.innerHeight;
				
				// Ajustamos la imagen para que entre en el navegador...
				var wScale = (navWidth / imgWidth);
				var hScale = (navHeight / imgHeight);
				if(wScale >	hScale){				
					imgWidth = (imgWidth*hScale*cScale);
					imgHeight = (imgHeight*hScale*cScale);
				}else{
					imgWidth = (imgWidth*hScale*cScale);
					imgHeight = (imgHeight*hScale*cScale);
				}

				$mainCanvas.attr('width', imgWidth);
				$mainCanvas.attr('height', imgHeight);

				$htmlCanvas.css({'width': imgWidth + 'px', 'height': imgHeight + 'px'});


				if (maskCanvas){

					var maskCanvasScaled = document.createElement('canvas');
						maskCanvasScaled.width = $mainCanvas[0].width;
						maskCanvasScaled.height = $mainCanvas[0].height;

					var ctx = maskCanvasScaled.getContext('2d');
						ctx.drawImage(maskCanvas, 0, 0, maskCanvas.width, maskCanvas.height, 0, 0, maskCanvasScaled.width, maskCanvasScaled.height);

					var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
					var newImageData = ctx.createImageData(imageData);
					
				   	// Creamos un nuevo canvas...
					var oImgCanvas = document.createElement('canvas');
						oImgCanvas.width = $mainCanvas[0].width;
						oImgCanvas.height = $mainCanvas[0].height;

					var oIctx = oImgCanvas.getContext('2d');
						oIctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, oImgCanvas.width, oImgCanvas.height);
					var oIData = oIctx.getImageData(0, 0, canvas.width, canvas.height);
						
				
					for (var i = 0; i < imageData.data.length; i += 4){
						if (imageData.data[i + 3] > 128){
							// Donde SI podemos poner palabras...
							newImageData.data[i] = oIData.data[i];
							newImageData.data[i + 1] = oIData.data[i+1];
							newImageData.data[i + 2] = oIData.data[i+2];
							newImageData.data[i + 3] = alphaBGWords;							
						}else{
							// Donde NO podemos poner palabras...
							newImageData.data[i] = oIData.data[i];
							newImageData.data[i + 1] = oIData.data[i+1];
							newImageData.data[i + 2] = oIData.data[i+2];
							newImageData.data[i + 3] = oIData.data[i+3];
						}
					}

					ctx.putImageData(newImageData, 0, 0);
					ctx = $mainCanvas[0].getContext('2d');
					ctx.drawImage(maskCanvasScaled, 0, 0);

					maskCanvasScaled = ctx = imageData = newImageData = oImgCanvas = oIctx = oIData = undefined;
					
				}else{
				
					var maskCanvasScaled = document.createElement('canvas');
						maskCanvasScaled.width = $mainCanvas[0].width;
						maskCanvasScaled.height = $mainCanvas[0].height;
					var ctx = maskCanvasScaled.getContext('2d');
					var newImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
				
					for (var i = 0; i < newImageData.data.length; i += 4){
						// Donde SI podemos poner palabras...
						newImageData.data[i] = 255;
						newImageData.data[i + 1] = 255;
						newImageData.data[i + 2] = 255;
						newImageData.data[i + 3] = alphaBGWords;							
					}

					ctx.putImageData(newImageData, 0, 0);
					ctx = $mainCanvas[0].getContext('2d');
					ctx.drawImage(maskCanvasScaled, 0, 0);

					maskCanvasScaled = ctx = imageData = newImageData = undefined;
				
				}


			WordCloud([$mainCanvas[0], $htmlCanvas[0]], { list: list,
									gridSize: 2,
									weightFactor: 4,
									clearCanvas: false,
									rotateRatio: 1,
									shuffle: false,
									alphaBGWords: alphaBGWords
		//							fontFamily: 'Impact, serif', 
		//							color: '#000', 
		//							backgroundColor: '#fff', 
		//							rotationSteps: 10, 
		//							ellipticity: 1}
									}
					  );
				  
			};

		</script>
	</body>
</html>