/**  Modified from original Node-Red source, for audio system visualization
 * vim: set ts=4:
 * Copyright 2013 IBM Corp.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 **/
 
RED.palette = (function() {

	var exclusion = ['config','unknown','deprecated'];
	var core = ['input', 'output', 'mixer', 'play', 'record', 'synth', 'effect', 'filter', 'analyze'];
	
	function createCategoryContainer(category){

		$("#palette-container").append('<div class="palette-category">'+
			'<div id="header-'+category+'" class="palette-header"><i class="expanded icon-chevron-down"></i><span>'+category+'</span></div>'+
			'<div class="palette-content" id="palette-base-category-'+category+'">'+
			  '<div id="palette-'+category+'-input"></div>'+
			  '<div id="palette-'+category+'-output"></div>'+
			  '<div id="palette-'+category+'-function"></div>'+
			'</div>'+
			'</div>');
		  
	}
	
	core.forEach(createCategoryContainer);
	
	function addNodeType(nt,def) {
		
		if ($("#palette_node_"+nt).length) {
			return;
		}
		
		if (exclusion.indexOf(def.category)===-1) {
		  
		  var category = def.category.split("-");
		  
		  var d = document.createElement("div");
		  d.id = "palette_node_"+nt;
		  d.type = nt;

		  //var label = /^(.*?)([ -]in|[ -]out)?$/.exec(nt)[1];
		  var label = (def.shortName) ? def.shortName : nt;

		  d.innerHTML = '<div class="palette_label">'+label+"</div>";
		  d.className="palette_node";
		  if (def.icon) {
			  d.style.backgroundImage = "url(icons/"+def.icon+")";
			  if (def.align == "right") {
				  d.style.backgroundPosition = "95% 50%";
			  } else if (def.inputs > 0) {
				  d.style.backgroundPosition = "10% 50%";
			  }
		  }
		  
		  d.style.backgroundColor = def.color;
		  
		  if (def.outputs > 0) {
			  var portOut = document.createElement("div");
			  portOut.className = "palette_port palette_port_output";
			  d.appendChild(portOut);
		  }
		  
		  if (def.inputs > 0) {
			  var portIn = document.createElement("div");
			  portIn.className = "palette_port";
			  d.appendChild(portIn);
		  }
		  
		  if ($("#palette-base-category-"+category[0]).length === 0){
			  createCategoryContainer(category[0]);
		  }
		  
		  if ($("#palette-"+def.category).length === 0) {          
			  $("#palette-base-category-"+category[0]).append('<div id="palette-'+def.category+'"></div>');            
		  }
		  
		  $("#palette-"+def.category).append(d);
		  d.onmousedown = function(e) { e.preventDefault(); };

		  setTooltipContent('', nt, d);

		  $(d).click(function() {
				RED.nodes.selectNode(d.type);
			  RED.sidebar.info.setHelpContent('', d.type);
		  });
		  $(d).draggable({
			  helper: 'clone',
			  appendTo: 'body',
			  revert: true,
			  revertDuration: 50
		  });
		 
		  $("#header-"+category[0]).off('click').on('click', function(e) {
			  $(this).next().slideToggle();
			  $(this).children("i").toggleClass("expanded");
		  });
		}
	}

	function setTooltipContent(prefix, key, elem) {
		// server test switched off - test purposes only
		var patt = new RegExp(/^[http|https]/);
		var server = false && patt.test(location.protocol);

		var options = {
			title: elem.type,
			placement: "right",
			trigger: "hover",
			delay: { show: 750, hide: 50 },
			html: true,
			container:'body',
			content : ""
		};

		if (!server) {
			data = $("script[data-help-name|='" + key + "']").html();
			var firstP = $("<div/>").append(data).children("div").first().html();
			options.content = firstP;
			$(elem).popover(options);
		} else {
			$.get( "resources/help/" + key + ".html", function( data ) {
				var firstP = $("<div/>").append(data).children("div").first().html();
				options.content = firstP;
				$(elem).popover(options);
			});
		}
	}
	
	function removeNodeType(type) {
		$("#palette_node_"+type).remove();
	}
	
	function filterChange() {
		var val = $("#palette-search-input").val();
		if (val === "") {
			$("#palette-search-clear").hide();
		} else {
			$("#palette-search-clear").show();
		}
		
		var re = new RegExp(val, "i");
		$(".palette_node").each(function(i,el) {
			if (val === "" || re.test(el.id)) {
				$(this).show();
			} else {
				$(this).hide();
			}
		});
	}
	
	$("#palette-search-input").focus(function(e) {
		RED.keyboard.disable();
	});
	$("#palette-search-input").blur(function(e) {
		RED.keyboard.enable();
	});
	
	$("#palette-search-clear").on("click",function(e) {
		e.preventDefault();
		$("#palette-search-input").val("");
		filterChange();
		$("#palette-search-input").focus();
	});
	
	$("#palette-search-input").val("");
	$("#palette-search-input").on("keyup",function() {
		filterChange();
	});

	$("#palette-search-input").on("focus",function() {
		$("body").one("mousedown",function() {
			$("#palette-search-input").blur();
		});
	});
	
	return {
		add:addNodeType,
		remove:removeNodeType
	};
})();
