text: "use strict";
  
  const $ = require("jquery");
  const Mousetrap = require("mousetrap");
  const input = $("#input");
  const sidebar = $("#sidebar");
  const windows = $("#windows");
  const contextMenuContainer = $("#context-menu-container");
  
  Mousetrap.bind([
  	"pageup",
  	"pagedown",
  ], function(e, key) {
  	let container = windows.find(".window.active");
  
  	// Chat windows scroll message container
  	if (container.attr("id") === "chat-container") {
  		container = container.find(".chan.active .chat");
  	}
  
  	container.finish();
  
  	const offset = container.get(0).clientHeight * 0.9;
  	let scrollTop = container.scrollTop();
  
  	if (key === "pageup") {
  		scrollTop = Math.floor(scrollTop - offset);
  	} else {
  		scrollTop = Math.ceil(scrollTop + offset);
  	}
  
  	container.animate({
  		scrollTop: scrollTop,
  	}, 200);
  
  	return false;
  });
  
  Mousetrap.bind([
  	"mod+up",
  	"mod+down",
  ], function(e, keys) {
  	const channels = sidebar.find(".chan");
  	const index = channels.index(channels.filter(".active"));
  	const direction = keys.split("+").pop();
  	let target;
  
  	switch (direction) {
  	case "up":
  		target = (channels.length + (index - 1 + channels.length)) % channels.length;
  		break;
  
  	case "down":
  		target = (channels.length + (index + 1 + channels.length)) % channels.length;
  		break;
  	}
  
  	channels.eq(target).click();
  });
  
  Mousetrap.bind([
  	"escape",
  ], function() {
  	contextMenuContainer.hide();
  });
  
  const colorsHotkeys = {
  	k: "\x03",
  	b: "\x02",
  	u: "\x1F",
  	i: "\x1D",
  	o: "\x0F",
  	s: "\x1e",
  	m: "\x11",
  };
  
  for (const hotkey in colorsHotkeys) {
  	Mousetrap.bind("mod+" + hotkey, function(e) {
  		e.preventDefault();
  
  		const cursorPosStart = input.prop("selectionStart");
  		const cursorPosEnd = input.prop("selectionEnd");
  		const value = input.val();
  		let newValue = value.substring(0, cursorPosStart) + colorsHotkeys[e.key];
  
  		if (cursorPosStart === cursorPosEnd) {
  			// If no text is selected, insert at cursor
  			newValue += value.substring(cursorPosEnd, value.length);
  		} else {
  			// If text is selected, insert formatting character at start and the end
  			newValue += value.substring(cursorPosStart, cursorPosEnd) + colorsHotkeys[e.key] + value.substring(cursorPosEnd, value.length);
  		}
  
  		input
  			.val(newValue)
  			.get(0).setSelectionRange(cursorPosStart + 1, cursorPosEnd + 1);
  	});
  }
  