<div id="acl-wrapper">
	<div class="panel-group" id="visibility-accordion-{{$input_group_id}}" role="tablist" aria-multiselectable="true">
		<div class="panel panel-success">
			<label class="panel-heading{{if $visibility != 'public'}} collapsed{{/if}}" id="visibility-public-heading-{{$input_group_id}}" aria-expanded="{{if $visibility == 'public'}}true{{else}}false{{/if}}">
				<input type="radio" name="{{$input_names.visibility}}" id="visibility-public-{{$input_group_id}}" value="public" tabindex="14" {{if $visibility == 'public'}}checked{{/if}}>
				<i class="fa fa-globe"></i> {{$public_title}}
			</label>
			<fieldset id="visibility-public-panel-{{$input_group_id}}" class="panel-collapse collapse{{if $visibility == 'public'}} in{{/if}}" role="tabpanel" aria-labelledby="visibility-public-heading-{{$input_group_id}}" {{if $visibility != 'public'}}disabled{{/if}}>
				<div class="panel-body">
					<p>{{$public_desc}}</p>
	                {{if $for_federation}}
		                {{if $jotnets_fields}}
		                    {{if $jotnets_fields|count < 3}}
								<div class="profile-jot-net">
		                    {{else}}
								<details class="profile-jot-net">
								<summary>{{$jotnets_summary}}</summary>
		                    {{/if}}

		                    {{foreach $jotnets_fields as $jotnets_field}}
		                        {{if $jotnets_field.type == 'checkbox'}}
		                            {{include file="field_checkbox.tpl" field=$jotnets_field.field}}
		                        {{elseif $jotnets_field.type == 'select'}}
		                            {{include file="field_select.tpl" field=$jotnets_field.field}}
		                        {{/if}}
		                    {{/foreach}}

		                    {{if $jotnets_fields|count >= 3}}
								</details>
		                    {{else}}
								</div>
		                    {{/if}}
			            {{/if}}
	                {{/if}}
				</div>
			</fieldset>
		</div>
		<div class="panel panel-info">
			<label class="panel-heading{{if $visibility != 'custom'}} collapsed{{/if}}" id="visibility-custom-heading-{{$input_group_id}}" aria-expanded="{{if $visibility == 'custom'}}true{{else}}false{{/if}}">
				<input type="radio" name="{{$input_names.visibility}}" id="visibility-custom-{{$input_group_id}}" value="custom" tabindex="15" {{if $visibility == 'custom'}}checked{{/if}}>
				<i class="fa fa-lock"></i> {{$custom_title}}
			</label>
			<fieldset id="visibility-custom-panel-{{$input_group_id}}" class="panel-collapse collapse{{if $visibility == 'custom'}} in{{/if}}" role="tabpanel" aria-labelledby="visibility-custom-heading-{{$input_group_id}}" {{if $visibility != 'custom'}}disabled{{/if}}>
				<input type="hidden" name="{{$input_names.group_allow}}" value="{{$group_allow}}"/>
				<input type="hidden" name="{{$input_names.contact_allow}}" value="{{$contact_allow}}"/>
				<input type="hidden" name="{{$input_names.group_deny}}" value="{{$group_deny}}"/>
				<input type="hidden" name="{{$input_names.contact_deny}}" value="{{$contact_deny}}"/>
				<div class="panel-body">
					<p>{{$custom_desc}}</p>

					<div class="form-group">
						<label for="acl_allow-{{$input_group_id}}">{{$allow_label}}</label>
						<input type="text" class="form-control input-lg" id="acl_allow-{{$input_group_id}}">
					</div>

					<div class="form-group">
						<label for="acl_deny-{{$input_group_id}}">{{$deny_label}}</label>
						<input type="text" class="form-control input-lg" id="acl_deny-{{$input_group_id}}">
					</div>
				</div>
			</fieldset>
		</div>
	</div>


{{if $for_federation}}
	<div class="form-group">
		<label for="profile-jot-email" id="profile-jot-email-label-{{$input_group_id}}">{{$emailcc}}</label>
		<input type="text" name="{{$input_names.emailcc}}" id="profile-jot-email-{{$input_group_id}}" class="form-control" title="{{$emtitle}}" />
	</div>
	<div id="profile-jot-email-end-{{$input_group_id}}"></div>
{{/if}}
</div>
<script type="text/javascript">
	$(function() {
		let $acl_allow_input = $('#acl_allow-{{$input_group_id}}');
		let $contact_allow_input = $('[name="{{$input_names.contact_allow}}"]');
		let $group_allow_input = $('[name="{{$input_names.group_allow}}"]');
		let $acl_deny_input = $('#acl_deny-{{$input_group_id}}');
		let $contact_deny_input = $('[name="{{$input_names.contact_deny}}"]');
		let $group_deny_input = $('[name="{{$input_names.group_deny}}"]');
		let $visibility_public_panel = $('#visibility-public-panel-{{$input_group_id}}');
		let $visibility_custom_panel = $('#visibility-custom-panel-{{$input_group_id}}');
		let $visibility_public_radio = $('#visibility-public-{{$input_group_id}}');
		let $visibility_custom_radio = $('#visibility-custom-{{$input_group_id}}');

		// Frio specific
		if ($.fn.collapse) {
			$visibility_public_panel.collapse({parent: '#visibility-accordion-{{$input_group_id}}', toggle: false});
			$visibility_custom_panel.collapse({parent: '#visibility-accordion-{{$input_group_id}}', toggle: false});
		}

		$visibility_public_radio.on('change', function (e) {
			if ($.fn.collapse) {
				$visibility_public_panel.collapse('show');
			}

			$visibility_public_panel.prop('disabled', false);
			$visibility_custom_panel.prop('disabled', true);

			$('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input[type=checkbox]').each(function() {
				// Restores checkbox state if it had been saved
				if ($(this).attr('data-checked') !== undefined) {
					$(this).prop('checked', $(this).attr('data-checked') === 'true');
				}
			});
			$('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input').attr('disabled', false);
		});

		$visibility_custom_radio.on('change', function(e) {
			if ($.fn.collapse) {
				$visibility_custom_panel.collapse('show');
			}

			$visibility_public_panel.prop('disabled', true);
			$visibility_custom_panel.prop('disabled', false);

			$('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input[type=checkbox]').each(function() {
				// Saves current checkbox state
				$(this)
					.attr('data-checked', $(this).prop('checked'))
					.prop('checked', false);
			});
			$('#visibility-public-panel-{{$input_group_id}} .profile-jot-net input').attr('disabled', 'disabled');
		});

		// Custom visibility tags inputs
		let acl_groups = new Bloodhound({
			local: {{$acl_groups|@json_encode nofilter}},
			identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
			datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name']),
			queryTokenizer: Bloodhound.tokenizers.whitespace,
		});
		let acl_contacts = new Bloodhound({
			local: {{$acl_contacts|@json_encode nofilter}},
			identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
			datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
			queryTokenizer: Bloodhound.tokenizers.whitespace,
		});
		let acl = new Bloodhound({
			local: {{$acl_list|@json_encode nofilter}},
			identify: function(obj) { return obj.type + '-' + obj.id.toString(); },
			datumTokenizer: Bloodhound.tokenizers.obj.whitespace(['name', 'addr']),
			queryTokenizer: Bloodhound.tokenizers.whitespace,
			sorter: function (itemA, itemB) {
				if (itemA.name === itemB.name) {
					return 0;
				} else if (itemA.name > itemB.name) {
					return 1;
				} else {
					return -1;
				}
			},
		});
		acl.initialize();

		let suggestionTemplate = function (item) {
			return '<div><img src="' + item.micro + '" alt="" style="float: left; width: auto; height: 2.8em; margin-right: 0.5em;"><p style="margin-left: 3.3em;"><strong>' + item.name + '</strong><br /><em>' + item.addr + '</em></p></div>';
		};

		$acl_allow_input.tagsinput({
			confirmKeys: [13, 44],
			freeInput: false,
			tagClass: function(item) {
				switch (item.type) {
					case 'group'   : return 'label label-primary';
					case 'contact'  :
					default:
						return 'label label-info';
				}
			},
			itemValue: function (item) { return item.type + '-' + item.id.toString(); },
			itemText: 'name',
			itemThumb: 'micro',
			itemTitle: function(item) {
				return item.addr;
			},
			typeaheadjs: {
				name: 'contacts',
				displayKey: 'name',
				templates: {
					suggestion: suggestionTemplate
				},
				source: acl.ttAdapter()
			}
		});

		$acl_deny_input
			.tagsinput({
				confirmKeys: [13, 44],
				freeInput: false,
				tagClass: function(item) {
					switch (item.type) {
						case 'group'   : return 'label label-primary';
						case 'contact'  :
						default:
							return 'label label-info';
					}
				},
				itemValue: function (item) { return item.type + '-' + item.id.toString(); },
				itemText: 'name',
				itemThumb: 'micro',
				itemTitle: function(item) {
					return item.addr;
				},
				typeaheadjs: {
					name: 'contacts',
					displayKey: 'name',
					templates: {
						suggestion: suggestionTemplate
					},
					source: acl.ttAdapter()
				}
			});

		// Import existing ACL into the tags input fields.

		$group_allow_input.val().split(',').forEach(function (group_id) {
			$acl_allow_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
		});
		$contact_allow_input.val().split(',').forEach(function (contact_id) {
			$acl_allow_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
		});
		$group_deny_input.val().split(',').forEach(function (group_id) {
			$acl_deny_input.tagsinput('add', acl_groups.get('group-' + group_id)[0]);
		});
		$contact_deny_input.val().split(',').forEach(function (contact_id) {
			$acl_deny_input.tagsinput('add', acl_contacts.get('contact-' + contact_id)[0]);
		});

		// Anti-duplicate callback + acl fields value generation

		$acl_allow_input.on('itemAdded itemRemoved', function (event) {
			if (event.type === 'itemAdded') {
				// Removes duplicate in the opposite acl box
				$acl_deny_input.tagsinput('remove', event.item);
			}

			// Update the real acl field
			$group_allow_input.val('');
			$contact_allow_input.val('');
			[].forEach.call($acl_allow_input.tagsinput('items'), function (item) {
				if (item.type === 'group') {
					$group_allow_input.val($group_allow_input.val() + ',' + item.id);
				} else {
					$contact_allow_input.val($contact_allow_input.val() + ',' + item.id);
				}
			});
		});

		$acl_deny_input.on('itemAdded itemRemoved', function (event) {
			if (event.type === 'itemAdded') {
				// Removes duplicate in the opposite acl box
				$acl_allow_input.tagsinput('remove', event.item);
			}

			// Update the real acl field
			$group_deny_input.val('');
			$contact_deny_input.val('');
			[].forEach.call($acl_deny_input.tagsinput('items'), function (item) {
				if (item.type === 'group') {
					$group_deny_input.val($group_deny_input.val() + ',' + item.id);
				} else {
					$contact_deny_input.val($contact_deny_input.val() + ',' + item.id);
				}
			});
		});
	});
</script>
