/** 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.sidebar = (function() {

	//$('#sidebar').tabs();
	var sidebar_tabs = RED.tabs.create({
		id:"sidebar-tabs",
		onchange:function(tab) {
			$("#sidebar-content").children().hide();
			$("#"+tab.id).show();
		},
		onremove: function(tab) {
			$("#"+tab.id).remove();
		}
	});
	function addTab(title,content,closeable) {
		$("#sidebar-content").append(content);
		$(content).hide();
		sidebar_tabs.addTab({id:"tab-"+title,label:title,closeable:closeable});
		//content.style.position = "absolute";
		//$('#sidebar').tabs("refresh");
	}
	
	$('#btn-sidebar').click(function() {toggleSidebar();});
	RED.keyboard.add(/* SPACE */ 32,{ctrl:true},function(){toggleSidebar();d3.event.preventDefault();});

	var sidebarSeparator =  {};
	$("#sidebar-separator").draggable({
			axis: "x",
			start:function(event,ui) {
				sidebarSeparator.closing = false;
				sidebarSeparator.opening = false;
				var winWidth = $(window).width();
				sidebarSeparator.start = ui.position.left;
				sidebarSeparator.chartWidth = $("#workspace").width();
				sidebarSeparator.chartRight = winWidth-$("#workspace").width()-$("#workspace").offset().left-2;


				if (!btnSidebar.hasClass("active")) {
					sidebarSeparator.opening = true;
					var newChartRight = 15;
					$("#sidebar").addClass("closing");
					$("#workspace").css("right",newChartRight);
					$("#chart-zoom-controls").css("right",newChartRight+20);
					$("#sidebar").width(0);
					toggleSidebar();
					RED.view.resize();
				}

				
				sidebarSeparator.width = $("#sidebar").width();
			},
			drag: function(event,ui) {
				var d = ui.position.left-sidebarSeparator.start;
				var newSidebarWidth = sidebarSeparator.width-d;
				if (sidebarSeparator.opening) {
					newSidebarWidth -= 13;
				}
				
				if (newSidebarWidth > 150) {
					if (sidebarSeparator.chartWidth+d < 200) {
						ui.position.left = 200+sidebarSeparator.start-sidebarSeparator.chartWidth;
						d = ui.position.left-sidebarSeparator.start;
						newSidebarWidth = sidebarSeparator.width-d;
					}
				}
					
				if (newSidebarWidth < 150) {
					if (!sidebarSeparator.closing) {
						$("#sidebar").addClass("closing");
						sidebarSeparator.closing = true;
					}
					if (!sidebarSeparator.opening) {
						newSidebarWidth = 150;
						ui.position.left = sidebarSeparator.width-(150 - sidebarSeparator.start);
						d = ui.position.left-sidebarSeparator.start;
					}
				} else if (newSidebarWidth > 150 && (sidebarSeparator.closing || sidebarSeparator.opening)) {
					sidebarSeparator.closing = false;
					$("#sidebar").removeClass("closing");
				}

				var newChartRight = sidebarSeparator.chartRight-d;
				$("#workspace").css("right",newChartRight);
				$("#chart-zoom-controls").css("right",newChartRight+20);
				$("#sidebar").width(newSidebarWidth);

				sidebar_tabs.resize();
				RED.view.resize();
					
			},
			stop:function(event,ui) {
				RED.view.resize();
				if (sidebarSeparator.closing) {
					$("#sidebar").removeClass("closing");
					toggleSidebar();
					if ($("#sidebar").width() < 180) {
						$("#sidebar").width(180);
						$("#workspace").css("right",208);
						$("#chart-zoom-controls").css("right",228);
					}
				}
				$("#sidebar-separator").css("left","auto");
				$("#sidebar-separator").css("right",($("#sidebar").width()+13)+"px");
			}
	});
	
	var btnSidebar = $("#btn-sidebar");
	function toggleSidebar() {
		//if ($('#sidebar').tabs( "option", "active" ) === false) {
		//    $('#sidebar').tabs( "option", "active",0);
		//}
		btnSidebar.toggleClass("active");
		
		if (!btnSidebar.hasClass("active")) {
			$("#main-container").addClass("sidebar-closed");
		} else {
			$("#main-container").removeClass("sidebar-closed");
		}
	}
	toggleSidebar();
	
	function showSidebar(id) {
		if (!$("#btn-sidebar").hasClass("active")) {
			toggleSidebar();
		}
		sidebar_tabs.activateTab("tab-"+id);
	}
	
	function containsTab(id) {
		return sidebar_tabs.contains("tab-"+id);
	}
	
	return {
		addTab: addTab,
		show: showSidebar,
		containsTab: containsTab
	}
	
})();
