/**
 * Nextcloud - passman
 *
 * @copyright Copyright (c) 2019, Felix Nüsse (felix.nuesse@t-online.de)
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

(function () {
	'use strict';
	/**
	 * @ngdoc service
	 * @name passmanApp.SearchboxexpanderService
	 * @description
	 * # SearchboxexpanderService
	 * Service in the passmanApp.
	 */
	angular.module('passmanApp')
		.service('SearchboxexpanderService', ['SettingsService', '$translate', function (SettingsService, $translate) {

			var defaults = {'label':true, 'username':true, 'email':true, 'custom_fields':true, 'password':false, 'description':false, 'url':false};
			var searchfields = {'label':true, 'username':true, 'email':true, 'custom_fields':true, 'password':false, 'description':false, 'url':false};
			var native_search = document.getElementById("searchbox");

			var title="Loading...";
			var defaults_button="Loading...";
			var translations ={};

			$translate.onReady(function() {
				for (var key in defaults) {
					translations[key]=$translate.instant('search.settings.input.'+key);
				}

				title=$translate.instant('search.settings.title');
				defaults_button=$translate.instant('search.settings.defaults_button');
			});

			function getSearchFieldArraySettings(){

				var res = SettingsService.getSetting('searchbox_settings');

				if(res!== ""){
					searchfields = JSON.parse(res);
				}else{
					searchfields=defaults;
				}


			}

			function getSearchFieldArrayForFiltering(){
				var fields=[];
				for (var key in searchfields) {
					if(searchfields[key]){
						fields.push(key);
					}
				}
				return fields;
			}

			//searchboxfix
			function buildDefaultFix(rootScope, scope) {
				if (native_search === null) {
					return;
				}
				native_search.nextElementSibling.addEventListener('click', function (e) {
					scope.$apply(function () {
						rootScope.$broadcast('nc_searchbox', "");
					});
				});

				native_search.classList.remove('hidden');
				native_search.addEventListener('keypress', function (e) {
					if (e.keyCode === 13) {
						e.preventDefault();
					}
				});

				native_search.addEventListener('keyup', function (e) {
					scope.$apply(function () {
						rootScope.$broadcast('nc_searchbox', native_search.value, getSearchFieldArrayForFiltering());
					});
				});

			}

			function buildCog() {
				if (native_search === null) {
					return;
				}

				var parent = document.createElement("div");
				parent.classList.add("notifications");
				parent.id = "searchbox-settings";
				parent.classList.add("hidden");

				var node = document.createElement("div");
				node.classList.add("icon-settings-white");
				node.classList.add("searchbox-settings");
				node.id = "searchbox-settings-icon";

				parent.appendChild(node);
				native_search.after(parent);
			}

			function addListenerToCog() {
				if (native_search === null) {
					return;
				}

				$('#searchbox').on("focus", function (evt) {
					$('#searchbox-settings').removeClass("hidden");

				});

				$('#searchbox').on("blur", function (evt) {
					if (!native_search.value) {
						setTimeout(function() {
								$('#searchbox-settings').addClass("hidden");
							}, 150);
					}
				});
			}

			function openPopup() {
				if (native_search === null) {
					return;
				}

				buildPopup(title, defaults_button);

				$(function () {
					$("#dialog-searchboxsettings").dialog({
						width: 280,
						height: 280,
						dialogClass: 'custom-search-dialog',
						close: function() {
							$(this).dialog('destroy');
						}
					}).removeClass('ui-corner-all');

				});
			}

			function buildPopup(title) {

				if ( $("#dialog-searchboxsettings").length ) {
					$( "#dialog-searchboxsettings" ).remove();
				}

				var dialogdiv = document.createElement("div");
				dialogdiv.id = "dialog-searchboxsettings";
				dialogdiv.title = title;
				dialogdiv.classList.add("hidden");

				native_search.after(dialogdiv);

				getSearchFieldArraySettings();
				for (var key in searchfields) {

					var div_inner=document.createElement("div");
					div_inner.id=key+"_div";

					var input = document.createElement("input");
					input.id=key+"_input";
					input.classList.add("searchbox_settings_input");
					input.setAttribute('key', key);
					input.type="checkbox";
					if(searchfields[key]){
						input.checked="true";
					}
					input.innerText=key;

					var label = document.createElement("label");
					label.classList.add("searchbox_settings_label");
					//label.htmlFor=key+"_input";
					label.innerHTML=translations[key];
					label.setAttribute('key', key);

					div_inner.appendChild(input);
					div_inner.appendChild(label);

					dialogdiv.appendChild(div_inner);



				}
				attachListener();

			}

			function attachListener(){

				$('.searchbox_settings_input').on("change", function(evt) {

					var key = $(this).attr('key');
					searchfields[key]=$("#"+key+"_input").prop('checked');
					var string = JSON.stringify(searchfields);
					SettingsService.setSetting('searchbox_settings', string);

				});

				$('.searchbox_settings_label').on("click", function(evt) {

					return;
					/*var key = $(this).attr("key");

					var checkBoxes = $("#"+key+"_input");
					checkBoxes.prop("checked", !checkBoxes.prop("checked"));

					//todo add functionality here
*/
				});
			}


			return {
				expandSearch: function ($rootScope, $scope, translation) {

					getSearchFieldArraySettings();
					buildDefaultFix($rootScope, $scope);
					buildCog();
					addListenerToCog();

					$('#searchbox-settings-icon').on("click", function (evt) {
						openPopup();
					});

				},
			};
		}]);
}());
@@ -1990,16 +1990,63 @@
 %0A%09%09%09%09if(
+typeof(res) !== %22undefined%22 && res !== null && 
 res!== %22

Fix wrong json parse breaking navigation pane with null/undefined-check