function um_sanitize_value( value, el ) {
	var element = document.createElement( 'div' );
	element.innerText = value;
	var sanitized_value = element.innerHTML;
	if ( el ) {
		jQuery( el ).val( sanitized_value );
	}

	return sanitized_value;
}

function um_unsanitize_value( input ) {
	var e = document.createElement( 'textarea' );
	e.innerHTML = input;
	// handle case of empty input
	return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}


function um_init_datetimepicker() {
	jQuery('.um-datepicker:not(.picker__input)').each(function(){
		var elem = jQuery(this);

		var disable = false;
		if ( typeof elem.attr('data-disabled_weekdays') != 'undefined' && elem.attr('data-disabled_weekdays') !== '' ) {
			disable = JSON.parse( elem.attr('data-disabled_weekdays') );
		}

		var years_n = null;
		if ( typeof elem.attr('data-years') != 'undefined' ) {
			years_n = elem.attr('data-years');
		}

		var minRange = elem.attr('data-date_min');
		var maxRange = elem.attr('data-date_max');

		var minSplit = [], maxSplit = [];
		if ( typeof minRange != 'undefined' ) {
			minSplit = minRange.split(",");
		}
		if ( typeof maxRange != 'undefined' ) {
			maxSplit = maxRange.split(",");
		}

		var min = minSplit.length ? new Date(minSplit) : null;
		var max = minSplit.length ? new Date(maxSplit) : null;

		// fix min date for safari
		if ( min && min.toString() == 'Invalid Date' && minSplit.length == 3 ) {
			var minDateString = minSplit[1] + '/' + minSplit[2] + '/' + minSplit[0];
			min = new Date(Date.parse(minDateString));
		}

		// fix max date for safari
		if ( max && max.toString() == 'Invalid Date' && maxSplit.length == 3 ) {
			var maxDateString = maxSplit[1] + '/' + maxSplit[2] + '/' + maxSplit[0];
			max = new Date(Date.parse(maxDateString));
		}

		var data = {
			disable: disable,
			format: elem.attr( 'data-format' ),
			formatSubmit: 'yyyy/mm/dd',
			hiddenName: true,
			onOpen: function() { elem.blur(); },
			onClose: function() { elem.blur(); }
		};

		if ( years_n !== null ) {
			data.selectYears = years_n;
		}

		if ( min !== null ) {
			data.min = min;
		}

		if ( max !== null ) {
			data.max = max;
		}

		elem.pickadate( data );
	});

	jQuery('.um-timepicker:not(.picker__input)').each(function(){
		var elem = jQuery(this);

		elem.pickatime({
			format: elem.attr('data-format'),
			interval: parseInt( elem.attr('data-intervals') ),
			formatSubmit: 'HH:i',
			hiddenName: true,
			onOpen: function() { elem.blur(); },
			onClose: function() { elem.blur(); }
		});
	});
}



function init_tipsy() {
	if ( typeof( jQuery.fn.tipsy ) === 'function' ) {
		jQuery('.um-tip-n').tipsy({gravity: 'n', opacity: 1, live: 'a.live', offset: 3 });
		jQuery('.um-tip-w').tipsy({gravity: 'w', opacity: 1, live: 'a.live', offset: 3 });
		jQuery('.um-tip-e').tipsy({gravity: 'e', opacity: 1, live: 'a.live', offset: 3 });
		jQuery('.um-tip-s').tipsy({gravity: 's', opacity: 1, live: 'a.live', offset: 3 });
	}
}

jQuery(document).ready(function() {

	jQuery( document.body ).on('click', '.um-dropdown a.real_url', function() {
		window.location = jQuery(this).attr('href');
	});

	jQuery( document.body ).on( 'click', '.um-trigger-menu-on-click', function() {
		var menu = jQuery(this).find('.um-dropdown');
		UM.dropdown.show( menu );
		return false;
	});

	jQuery( document.body ).on('click', '.um-dropdown-hide', function() {
		UM.dropdown.hideAll();
		return false;
	});

	jQuery( document.body ).on('click', 'a.um-manual-trigger', function() {
		var child = jQuery(this).attr('data-child');
		var parent = jQuery(this).attr('data-parent');
		jQuery(this).parents( parent ).find( child ).trigger('click');
		UM.dropdown.hideAll();
		return false;
	});

	jQuery('.um-s1,.um-s2').css({'display':'block'});

	/**
	 * Unselect empty option if something is selected
	 *
	 * @since   2.1.16
	 * @param   {object} e
	 * @returns {undefined}
	 */
	function unselectEmptyOption( e ) {
		var $element = jQuery( e.currentTarget );
		var $selected = $element.find(':selected');

		if ( $selected.length > 1 ) {
			$selected.each( function ( i, option ) {
				if ( option.value === '' ) {
					option.selected = false;
					$element.trigger( 'change' );
				}
			});
		}
	}

	if ( typeof( jQuery.fn.select2 ) === 'function' ) {
		jQuery(".um-s1").each( function( e ) {
			var obj = jQuery(this);

			obj.select2({
				allowClear: true,
				dropdownParent: obj.parent()
			}).on( 'change', unselectEmptyOption );
		} );

		jQuery(".um-s2").each( function( e ) {
			var obj = jQuery(this);

			// fix https://github.com/ultimatemember/ultimatemember/issues/941
			// using .um-custom-shortcode-tab class as temporarily solution
			var atts = {};
			if ( obj.parents('.um-custom-shortcode-tab').length ) {
				atts = {
					allowClear: false
				};
			} else {
				atts = {
					allowClear: false,
					minimumResultsForSearch: 10,
					dropdownParent: obj.parent()
				};
			}
			obj.select2( atts ).on( 'change', unselectEmptyOption );
		} );

		jQuery(".um-s3").each( function( e ) {
			var obj = jQuery(this);

			obj.select2({
				allowClear: false,
				minimumResultsForSearch: -1,
				dropdownParent: obj.parent()
			}).on( 'change', unselectEmptyOption );
		} );
	}

	init_tipsy();

	if ( typeof( jQuery.fn.um_raty ) === 'function' ) {
		jQuery('.um-rating').um_raty({
			half:       false,
			starType:   'i',
			number:     function() {
				return jQuery(this).attr('data-number');
			},
			score:      function() {
				return jQuery(this).attr('data-score');
			},
			scoreName:  function() {
				return jQuery(this).attr('data-key');
			},
			hints:      false,
			click:      function( score, evt ) {
				um_live_field = this.id;
				um_live_value = score;
				um_apply_conditions( jQuery(this), false );
			}
		});

		jQuery('.um-rating-readonly').um_raty({
			half:       false,
			starType:   'i',
			number:     function() {
				return jQuery(this).attr('data-number');
			},
			score:      function() {
				return jQuery(this).attr('data-score');
			},
			scoreName:  function() {
				return jQuery(this).attr('data-key');
			},
			hints:      false,
			readOnly:   true
		});
	}

	jQuery(document).on('change', '.um-field-area input[type="radio"]', function() {
		var field = jQuery(this).parents('.um-field-area');
		var this_field = jQuery(this).parents('label');
		field.find('.um-field-radio').removeClass('active');
		field.find('.um-field-radio').find('i').removeAttr('class').addClass('um-icon-android-radio-button-off');
		this_field.addClass('active');
		this_field.find('i').removeAttr('class').addClass('um-icon-android-radio-button-on');
	});

	jQuery(document).on('change', '.um-field-area input[type="checkbox"]', function() {
		var this_field = jQuery(this).parents('label');
		if ( this_field.hasClass('active') ) {
			this_field.removeClass('active');
			this_field.find('i').removeAttr('class').addClass('um-icon-android-checkbox-outline-blank');
		} else {
			this_field.addClass('active');
			this_field.find('i').removeAttr('class').addClass('um-icon-android-checkbox-outline');
		}
	});


	um_init_datetimepicker();

	jQuery(document).on('click', '.um .um-single-image-preview a.cancel', function( e ) {
		e.preventDefault();
		var parent = jQuery(this).parents('.um-field');

		var filename = parent.find( 'input[type="hidden"]#' + parent.data('key') + '-' + jQuery(this).parents('form').find('input[type="hidden"][name="form_id"]').val() ).val();

		var src = jQuery(this).parents('.um-field').find('.um-single-image-preview img').attr('src');
		var mode = parent.data('mode');

		var args = {
			data: {
				mode: mode,
				filename: filename,
				src: src,
				nonce: um_scripts.nonce
			},
			success: function() {
				parent.find('.um-single-image-preview img').attr( 'src', '' );
				parent.find('.um-single-image-preview').hide();
				parent.find('.um-btn-auto-width').html( parent.data('upload-label') );
				parent.find('input[type="hidden"]').val( 'empty_file' );
			}
		};

		if ( mode !== 'register' ) {
			args.data.user_id = jQuery(this).parents('form' ).find( '#user_id' ).val();
		}

		wp.ajax.send( 'um_remove_file', args );

		return false;
	});

	jQuery(document).on('click', '.um .um-single-file-preview a.cancel', function( e ) {
		e.preventDefault();
		var parent = jQuery(this).parents('.um-field');
		var filename = parent.find( 'input[type="hidden"]#' + parent.data('key') + '-' + jQuery(this).parents('form').find('input[type="hidden"][name="form_id"]').val() ).val();
		var src = jQuery(this).parents('.um-field').find('.um-single-fileinfo a').attr('href');
		var mode = parent.data('mode');

		var args = {
			data: {
				mode: mode,
				filename: filename,
				src: src,
				nonce: um_scripts.nonce
			},
			success: function() {
				parent.find('.um-single-file-preview').hide();
				parent.find('.um-btn-auto-width').html( parent.data('upload-label') );
				parent.find('input[type=hidden]').val( 'empty_file' );
			}
		};

		if ( mode !== 'register' ) {
			args.data.user_id = jQuery(this).parents('form' ).find( '#user_id' ).val();
		}

		wp.ajax.send( 'um_remove_file', args );

		return false;
	});

	jQuery(document).on('click', '.um-field-group-head:not(.disabled)', function() {
		var field = jQuery(this).parents('.um-field-group');
		var limit = field.data('max_entries');

		if ( field.find('.um-field-group-body').is(':hidden')){
			field.find('.um-field-group-body').show();
		} else {
			field.find('.um-field-group-body:first').clone().appendTo( field );
		}

		var increase_id = 0;
		field.find('.um-field-group-body').each(function(){
			increase_id++;
			jQuery(this).find('input').each(function(){
				var input = jQuery(this);
				input.attr('id', input.data('key') + '-' + increase_id );
				input.attr('name', input.data('key') + '-' + increase_id );
				input.parent().parent().find('label').attr('for', input.data('key') + '-' + increase_id );
			});
		});

		if ( limit > 0 && field.find('.um-field-group-body').length == limit ) {

			jQuery(this).addClass('disabled');

		}
	});

	jQuery(document).on('click', '.um-field-group-cancel', function( e ) {
		e.preventDefault();
		var field = jQuery(this).parents('.um-field-group');

		var limit = field.data('max_entries');

		if ( field.find('.um-field-group-body').length > 1 ) {
			jQuery(this).parents('.um-field-group-body').remove();
		} else {
			jQuery(this).parents('.um-field-group-body').hide();
		}

		if ( limit > 0 && field.find('.um-field-group-body').length < limit ) {
			field.find('.um-field-group-head').removeClass('disabled');
		}

		return false;
	});


	jQuery( document.body ).on( 'click', '.um-ajax-paginate', function( e ) {
		e.preventDefault();

		var obj = jQuery(this);
		var parent = obj.parent();
		parent.addClass( 'loading' );

		var pages = obj.data('pages')*1;
		var next_page = obj.data('page')*1 + 1;

		var hook = obj.data('hook');

		if ( 'um_load_posts' === hook ) {

			jQuery.ajax({
				url: wp.ajax.settings.url,
				type: 'post',
				data: {
					action: 'um_ajax_paginate_posts',
					author: jQuery(this).data('author'),
					page:   next_page,
					nonce: um_scripts.nonce
				},
				complete: function() {
					parent.removeClass( 'loading' );
				},
				success: function( data ) {
					parent.before( data );
					if ( next_page === pages ) {
						parent.remove();
					} else {
						obj.data( 'page', next_page );
					}
				}
			});
		} else if ( 'um_load_comments' === hook ) {

			jQuery.ajax({
				url: wp.ajax.settings.url,
				type: 'post',
				data: {
					action: 'um_ajax_paginate_comments',
					user_id: jQuery(this).data('user_id'),
					page: next_page,
					nonce: um_scripts.nonce
				},
				complete: function() {
					parent.removeClass( 'loading' );
				},
				success: function( data ) {
					parent.before( data );
					if ( next_page === pages ) {
						parent.remove();
					} else {
						obj.data( 'page', next_page );
					}
				}
			});
		} else {
			var args = jQuery(this).data('args');
			var container = jQuery(this).parents('.um').find('.um-ajax-items');

			jQuery.ajax({
				url: wp.ajax.settings.url,
				type: 'post',
				data: {
					action: 'um_ajax_paginate',
					hook: hook,
					args: args,
					nonce: um_scripts.nonce
				},
				complete: function() {
					parent.removeClass( 'loading' );
				},
				success: function(data){
					parent.remove();
					container.append( data );
				}
			});
		}
	});


	jQuery(document).on('click', '.um-ajax-action', function( e ) {
		e.preventDefault();
		var hook = jQuery(this).data('hook');
		var user_id = jQuery(this).data('user_id');
		var arguments = jQuery(this).data('arguments');

		if ( jQuery(this).data('js-remove') ){
			jQuery(this).parents('.'+jQuery(this).data('js-remove')).fadeOut('fast');
		}

		jQuery.ajax({
			url: wp.ajax.settings.url,
			type: 'post',
			data: {
				action: 'um_muted_action',
				hook: hook,
				user_id: user_id,
				arguments: arguments,
				nonce: um_scripts.nonce
			},
			success: function(data){

			}
		});
		return false;
	});

	jQuery( document.body ).on('click', '#um-search-button', function() {
		var action = jQuery(this).parents('.um-search-form').data('members_page');

		var search_keys = [];
		jQuery(this).parents('.um-search-form').find('input[name="um-search-keys[]"]').each( function() {
			search_keys.push( jQuery(this).val() );
		});

		var search = jQuery(this).parents('.um-search-form').find('.um-search-field').val();

		var url;
		if ( search === '' ) {
			url = action;
		} else {
			var query = '?';
			for ( var i = 0; i < search_keys.length; i++ ) {
				query += search_keys[i] + '=' + search;
				if ( i !== search_keys.length - 1 ) {
					query += '&';
				}
			}

			url = action + query;
		}
		window.location = url;
	});

	//make search on Enter click
	jQuery( document.body ).on( 'keypress', '.um-search-field', function(e) {
		if ( e.which === 13 ) {
			var action = jQuery(this).parents('.um-search-form').data('members_page');

			var search_keys = [];
			jQuery(this).parents('.um-search-form').find('input[name="um-search-keys[]"]').each( function() {
				search_keys.push( jQuery(this).val() );
			});

			var search = jQuery(this).val();

			var url;
			if ( search === '' ) {
				url = action;
			} else {
				var query = '?';
				for ( var i = 0; i < search_keys.length; i++ ) {
					query += search_keys[i] + '=' + search;
					if ( i !== search_keys.length - 1 ) {
						query += '&';
					}
				}

				url = action + query;
			}
			window.location = url;
		}
	});

	jQuery('.um-form input[class="um-button"][type="submit"]').prop('disabled', false);

	jQuery(document).one('click', '.um:not(.um-account) .um-form input[class="um-button"][type="submit"]:not(.um-has-recaptcha)', function() {
		jQuery(this).attr('disabled','disabled');
		jQuery(this).parents('form').trigger('submit');
	});


	var um_select_options_cache = {};

	/**
	 * Find all select fields with parent select fields
	 */
	jQuery('select[data-um-parent]').each( function() {

		var me = jQuery(this);
		var parent_option = me.data('um-parent');
		var um_ajax_source = me.data('um-ajax-source');

		me.attr('data-um-init-field', true );

		jQuery(document).on('change','select[name="' + parent_option + '"]',function() {
			var parent  = jQuery(this);
			var form_id = parent.closest( 'form' ).find( 'input[type="hidden"][name="form_id"]' ).val();

			var arr_key;
			if ( me.attr( 'data-member-directory' ) === 'yes' ) {
				var directory = parent.parents('.um-directory');
				arr_key = um_get_data_for_directory( directory, 'filter_' + parent_option );
				if ( typeof arr_key != 'undefined' ) {
					arr_key = arr_key.split('||');
				} else {
					arr_key = '';
				}
			} else {
				arr_key = parent.val();
			}

			if ( typeof arr_key != 'undefined' && arr_key !== '' && typeof um_select_options_cache[ arr_key ] !== 'object' ) {

				if ( typeof( me.um_wait ) === 'undefined' || me.um_wait === false ) {
					me.um_wait = true;
				} else {
					return;
				}

				jQuery.ajax({
					url: wp.ajax.settings.url,
					type: 'post',
					data: {
						action: 'um_select_options',
						parent_option_name: parent_option,
						parent_option: arr_key,
						child_callback: um_ajax_source,
						child_name: me.attr('name'),
						members_directory: me.attr('data-member-directory'),
						form_id: form_id,
						nonce: um_scripts.nonce
					},
					success: function( data ) {
						if ( data.status === 'success' && arr_key !== '' ) {
							um_select_options_cache[ arr_key ] = data;
							um_field_populate_child_options( me, data, arr_key );
						}

						if ( typeof data.debug !== 'undefined' ) {
							console.log( data );
						}

						me.um_wait = false;
					},
					error: function( e ) {
						console.log( e );
						me.um_wait = false;
					}
				});

			}

			if ( typeof arr_key != 'undefined' && arr_key !== '' && typeof um_select_options_cache[ arr_key ] == 'object' ) {
				setTimeout( um_field_populate_child_options, 10, me, um_select_options_cache[ arr_key ], arr_key );
			}

			if ( typeof arr_key != 'undefined' || arr_key === '' ) {
				me.find('option[value!=""]').remove();
				me.val('').trigger('change');
			}

		});

		jQuery('select[name="' + parent_option + '"]').trigger('change');

	});


	/**
	 * Populates child options and cache ajax response
	 *
	 * @param me
	 * @param data
	 * @param arr_key
	 */
	function um_field_populate_child_options( me, data, arr_key ) {
		var directory = me.parents('.um-directory');
		var child_name = me.attr('name');
		me.find('option[value!=""]').remove();

		if ( ! me.hasClass('um-child-option-disabled') ) {
			me.prop('disabled', false);
		}

		var arr_items = [],
			search_get = '';

		if ( data.post.members_directory === 'yes' ) {
			arr_items.push({id: '', text: '', selected: 1});
		}
		jQuery.each( data.items, function(k,v){
			arr_items.push({id: k, text: v, selected: (v === search_get)});
		});

		me.select2('destroy');
		me.select2({
			data: arr_items,
			allowClear: true,
			minimumResultsForSearch: 10
		});

		if ( data.post.members_directory === 'yes' ) {
			me.find('option').each( function() {
				if ( jQuery(this).html() !== '' ) {
					jQuery(this).data( 'value_label', jQuery(this).html() ).attr( 'data-value_label', jQuery(this).html() );
				}
			});

			var current_filter_val = um_get_data_for_directory( directory, 'filter_' + child_name );
			if ( typeof current_filter_val !== 'undefined' ) {
				current_filter_val = current_filter_val.split('||');

				var temp_filter_val = [];
				jQuery.each( current_filter_val, function(i) {
					if ( me.find('option[value="' + current_filter_val[ i ] + '"]').length ) {
						temp_filter_val.push( current_filter_val[ i ] );
					}
					me.find('option[value="' + current_filter_val[ i ] + '"]').prop('disabled', true).hide();
					if ( me.find('option:not(:disabled)').length === 1 ) {
						me.prop('disabled', true);
					}

					me.select2('destroy').select2();
					me.val('').trigger( 'change' );
				});

				temp_filter_val = temp_filter_val.join('||');
				if ( current_filter_val !== temp_filter_val ) {
					um_set_url_from_data( directory, 'filter_' + child_name, temp_filter_val );
					um_ajax_get_members( directory );
				}
			}

			um_change_tag( directory );
		}

		if ( data.post.members_directory !== 'yes' ) {
			if ( typeof data.field.default !== 'undefined' && ! me.data('um-original-value') ) {
				me.val( data.field.default ).trigger('change');
			} else if ( me.data('um-original-value') !== '' ) {
				me.val( me.data('um-original-value') ).trigger('change');
			}

			if ( data.field.editable == 0 ) {
				me.addClass('um-child-option-disabled');
				me.attr('disabled','disabled');
			}
		}
	}

	jQuery( document.body ).on('click', '.um-toggle-password', function (){
		let parent = jQuery(this).closest('.um-field-area-password');
		let passwordField = parent.find('input');
		let type = passwordField.attr('type');
		if ( 'text' === type ) {
			passwordField.attr('type', 'password');
			parent.find('i').toggleClass('um-icon-eye um-icon-eye-disabled');
		} else {
			passwordField.attr('type', 'text');
			parent.find('i').toggleClass('um-icon-eye um-icon-eye-disabled');
		}
	});
});
