/*jshint browser:true, devel:true */
/*global jQuery, wp, document, wpml_language_switcher_admin, _, iclSaveForm_success_cb, iclSaveForm */
var WPML_core = WPML_core || {};

WPML_core.languageSwitcher = (function( $, wpml_ls ) {
	"use strict";

	/** @namespace wpml_ls.strings */
	/** @namespace wpml_ls.strings.confirmation_item_remove */
	/** @namespace wpml_ls.color_schemes */
	/** @namespace wpml_ls.strings.table_no_item */
	/** @namespace wpml_ls.templates */

	var form,
		dialogBox,
		formAndDialogBox,
		additionalCssStyleId = 'wpml-ls-inline-styles-additional-css',
		dialogInlineStyleId  = 'wpml-ls-inline-styles-dialog',
		currentItemSlug,
		slotInlineStylesBackup;

	var init = function () {
		form         	 = $('#wpml-ls-settings-form');
		dialogBox        = $('#wpml-ls-dialog');
		formAndDialogBox = form.add(dialogBox);

		maybeInitAdditionalCssStyle();
		initDialogNode();
		initColorPicker();
		initLanguageSortable();
		attachEvents();
		openDialogFromHash();
		$(document).trigger('wpml_ls_admin_loaded');
	};

	var attachEvents = function () {
        attachAutoSaveEvents();
        attachToggleEvents();
        attachSubOptionsEvents();
        attachTooltipEvents();
        attachDialogEvents();
        attachRowActionEvents();
        attachSelectedSlotChangeEvents();
        attachPresetColorsEvent();
        attachTemplateChangeEvents();
        attachMenuHierarchicalEvents();
        attachUpdatePreviewEvents();
        attachSaveClickEvents();
        fixSelectedOption();
        forceRefreshOnBrowserBackButton();
        setupWizardNextEvent();
        preventClickOnPreviewLinks();
    };

	var maybeInitAdditionalCssStyle = function() {
		if ($('#' + additionalCssStyleId).length < 1) {
			var style = $('<style>');
			style.attr('id', additionalCssStyleId);
			style.appendTo($('head'));
		}
	};

    var attachAutoSaveEvents = function () {
        formAndDialogBox.on('change', '.js-wpml-ls-trigger-save', function () {
            updateSettings($(this));
        });

        formAndDialogBox.on('keyup', '.js-wpml-ls-trigger-need-save', function () {
            var triggerNode = $(this),
                messageWrapper = triggerNode.closest('.js-wpml-ls-option').find('.js-wpml-ls-messages');

            showUpdatedContent(messageWrapper, wpml_ls.strings.leave_text_box_to_save, 0, 'notice');
        });
    };

    var attachSubOptionsEvents = function () {
        formAndDialogBox
            .on('click', '.js-wpml-ls-toggle-suboptions', function () {
                const triggerNode = $(this);
                const targetNode = $(triggerNode.data('target'));

                // Use this with non-boolean inputs (e.g. radio buttons group).
                const showOnValue = !!triggerNode.data('show-on-value') && "" + triggerNode.val() === "" + triggerNode.data('show-on-value');
                // Use this with a checkbox.
                const showOnChecked = !!triggerNode.data('show-on-checked') && triggerNode.prop('checked');

                if (showOnValue || showOnChecked) {
                    targetNode.slideDown();
                } else {
                    targetNode.slideUp();
                }
            });
    };

    var attachToggleEvents = function () {
        formAndDialogBox
            .on('click', '.js-wpml-ls-toggle-slot', function () {
                var triggerNode = $(this);
                var targetNode = $(triggerNode.data('target'));

                targetNode.slideToggle({
                                           complete: function () {
                                               if (targetNode.is(':visible')) {
                                                   triggerNode.addClass('open');
                                                   targetNode.find('.js-wpml-ls-row-edit').trigger('click');
                                               } else {
                                                   triggerNode.removeClass('open');
                                               }
                                               repositionDialog();

                                           }
                                       });
            })
            .on('click', '.js-wpml-ls-toggle-once', function () {
                var targetNode = $(this).nextAll('.js-wpml-ls-toggle-target');
                $(this).find('label').unwrap().find('.js-arrow-toggle').remove();
                targetNode.slideToggle();
                return false;
            });
    };

    var attachTooltipEvents = function () {
        formAndDialogBox.on('click.tooltip', '.js-wpml-ls-tooltip-open', function (e) {
            e.preventDefault();
            openTooltip($(this));
        });
    };

    var initLanguageSortable = function () {
        $('#wpml-ls-languages-order').sortable({
                                                   stop: function () {
                                                       updateSettings($(this));
                                                   }
                                               });
    };

    var initDialogNode = function () {
        dialogBox.dialog({
                             dialogClass: 'dialog-fixed otgs-ui-dialog wpml-ls-dialog',
                             width      : '90%',
				modal:       true,
				autoOpen:    false,
				draggable:   true,
				resizable:   false
			})
			.on('dialogopen', function () {
				$('body').css('overflow', 'hidden');
				$('.js-wpml-ls-active-tooltip').pointer('close');
				repositionDialog();
				attachDialogScrollEvent();
			})
			.on('dialogclose', function () {
				$('body').css('overflow', '');
				$('.js-wpml-ls-active-tooltip').pointer('close');
				updateDialogInlineStyle();
			});

		$(window).resize(resizeWindowEvent);
	};

	var openDialogFromHash = function() {
		var item = getItemFromHash();

		if (item) {
			var section = $('#wpml-language-switcher-' + item.type),
				row     = getItemRow(item);

			$('html, body').animate({
				scrollTop: section.offset().top
			}, 1, function() {
				var subform;

				if (row) {
					subform = row.find('.js-wpml-ls-subform');
				} else {
					var targetNode = $('#wpml-ls-new-' + item.type + '-template');
					subform = prepareTemplateSubform(targetNode);
					currentItemSlug = item.slug;
				}

				cloneSubformIntoDialog(subform);
			});
		}
	};

	var getItemFromHash = function() {
		var hashParts = WPML_core.sanitize(window.location.hash).substring(1).split('/'),
			item = null,
			type = hashParts[0] || '',
			slug = hashParts[1] || '';

		if (0 <= $.inArray(type, ['menus', 'sidebars', 'statics'])) {
			item = {
				'type': type,
				'slug': slug
			};

			parent.location.hash = '';
		}

		return item;
	};

	var getItemRow = function(item) {
		var itemTypeSelector = '[data-item-type=' + item.type + ']',
			itemSlugSelector = item.slug ? '[data-item-slug=' + item.slug + ']' : '',
			row              = $('tr' + itemTypeSelector + itemSlugSelector);

		return 1 === row.length ? row : null;
	};

	var resizeWindowEvent = _.debounce(function() {
		repositionDialog();
		attachDialogScrollEvent();
	}, 200);

	var repositionDialog = function () {
		var winH = $(window).height() - 180;
		dialogBox.dialog("option", "maxHeight", winH);

		dialogBox.dialog("option", "position", {
			my: "center",
			at: "center",
			of: window
		});
	};

	var attachDialogScrollEvent = function() {
		var preview = dialogBox.find('.js-wpml-ls-preview-wrapper'),
			has_two_columns = dialogBox.width() > 900,
			has_minimal_height = (preview.height() + 200) < dialogBox.height();

		has_minimal_height = has_minimal_height || (has_two_columns && preview.height() < dialogBox.height());

		if (has_minimal_height) {
			dialogBox.on('scroll.preview', function(){
				dialogBox.find('.js-wpml-ls-preview-wrapper').css({
					position: 'relative',
					top: dialogBox.scrollTop()
				});
			});
		} else {
			dialogBox
				.off('scroll.preview')
				.find('.js-wpml-ls-preview-wrapper').css({
					position: 'relative',
					top: 0
				});
		}
	};

	var initColorPicker = function(node) {
		node = node || form;
		node.find('.js-wpml-ls-colorpicker').wpColorPicker({
			change: function(e){
				var subform = $(e.target).parents('.js-wpml-ls-subform');
				updatePreview(subform);
			},
			clear: function(e){
				var subform = $(e.target).parents('.js-wpml-ls-subform');
				updatePreview(subform);
			}
		});
	};

	var attachDialogEvents = function() {
		$('.js-wpml-ls-dialog-close').on('click', function(e) {
			e.preventDefault();
			restoreInlineStyles();
			dialogBox.dialog('close');
		});

		$('.js-wpml-ls-dialog-save').on('click', function(e) {
			e.preventDefault();
			$(this).prop('disabled', true);
			var subform = dialogBox.find('.js-wpml-ls-subform');
			replaceDialogSubformIntoOrigin(subform);
		});

		$('.js-wpml-ls-open-dialog').on('click', function(e) {
			e.preventDefault();

			var subform,
				targetNode = $($(e.target).data('target'));

			if (targetNode.hasClass('js-wpml-ls-template')) {
				subform = prepareTemplateSubform(targetNode);
			} else {
				subform = targetNode.find('.js-wpml-ls-subform');
			}

			cloneSubformIntoDialog(subform);
		});
	};

	var attachRowActionEvents = function() {
		$('.js-wpml-ls-slot-list')
			.on('click', '.js-wpml-ls-row-edit', function(e) {
				e.preventDefault();

				var targetNode = $($(e.target).parents('tr.js-wpml-ls-row')),
					subform    = targetNode.find('.js-wpml-ls-subform');

				cloneSubformIntoDialog(subform);
			})
			.on('click', '.js-wpml-ls-row-remove', function(e) {
				e.preventDefault();
				if (confirm(wpml_ls.strings.confirmation_item_remove)) {
					var rowNode  = $(this).parents('tr.js-wpml-ls-row'),
						itemType = rowNode.data('item-type');

					rowNode.find('.js-wpml-ls-subform input, .js-wpml-ls-subform select').remove();

					updateSettings(rowNode, function(){
						rowNode.fadeOut(800, function(){
							rowNode.remove();
							updateSlotSectionStatus(itemType);
						});
					});
				}
			});
	};

	var attachSelectedSlotChangeEvents = function() {
		formAndDialogBox.on('change', '.js-wpml-ls-available-slots', function(){
			var newSlug = WPML_core.sanitize( $(this).val() ),
				subform = $(this).closest('.js-wpml-ls-subform'),
				itemType = subform.data('item-type');

			$(this).removeClass('wpml-ls-required');

			if (isSlotAllowed(newSlug, itemType)) {
				replaceSubformElementsAttributes(subform, newSlug);
			}
		});
	};

	var resetColorpickers = function(node) {
		node.find('.js-wpml-ls-colorpicker').each( function() {
			var nodeClone  = $(this).clone(),
				parentNode = $(this).parents('.js-wpml-ls-colorpicker-wrapper');

			parentNode.empty().html(nodeClone);
		});

		initColorPicker(node);
	};

	var preselectSlot = function(subform) {
		if (currentItemSlug) {
			var selector = '.js-wpml-ls-available-slots option[value="' + currentItemSlug + '"]';
			subform.find(selector).prop('selected', true);
			subform.find(selector).attr('selected', 'selected');
			currentItemSlug = null;
		}
	};

	var attachPresetColorsEvent = function() {
		formAndDialogBox.on('change', '.js-wpml-ls-colorpicker-preset', function(){
			var slug = WPML_core.sanitize( $(this).val() ),
				subform = $(this).parents('.js-wpml-ls-subform');

			if (slug) {
				var pickerSets = $(this).parents('.js-wpml-ls-panel-colors'),
					colors     = wpml_ls.color_schemes[ slug ].values;

				$.each(colors, function(k, v){
					var inputTags = pickerSets.find('.js-wpml-ls-color-' + k);
					inputTags.attr('value', v);
					inputTags.parents('.wp-picker-container').find('.wp-color-result').css('background-color', v);
				});

				updatePreview(subform);
			}
		});
	};

	var fixSelectedOption = function() {
		// Prevent loosing selected after replacing in original id
		formAndDialogBox.on('change', 'select', function () {
			var selectedVal = WPML_core.sanitize( $(this).val() );
			$('option', this).prop('selected', false);
			$('option', this).attr('selected', false);
			$('option[value="' + selectedVal + '"]', this).prop('selected', true);
			$('option[value="' + selectedVal + '"]', this).attr('selected', 'selected');
		});
	};

	/**
	 * @see http://stackoverflow.com/a/19196020
	 */
	var forceRefreshOnBrowserBackButton = function() {
		var input = $('#wpml-ls-refresh-on-browser-back-button');

		if(input.val() === 'yes') {
			location.reload(true);
		} else {
			input.val('yes');
		}
	};

	var setupWizardNextEvent = function() {
		form.submit(function(e){
			e.preventDefault();

			form.find('input[name="submit_setup_wizard"]').val(1);

			updateSettings(form, function(){
				location.href = WPML_core.sanitize(location.href).replace(/#.*/,'');
			});
		});
	};

	var preventClickOnPreviewLinks = function () {
		$('.js-wpml-ls-preview').on('click', function(e) {
			e.preventDefault();
		});
	};

	var openTooltip = function(triggerNode) {
		var content = triggerNode.data('content');
		var link_text = triggerNode.data('link-text');
		var link_url = triggerNode.data('link-url');
		var link_target = triggerNode.data('link-target');

		if (link_text.length > 0) {
			if (link_url.length === 0) {
				link_url = '#';
			}
			var content_link_target = 'target="' + link_target + '"';
			content += '<br><br><a href="' + link_url + '" ' + content_link_target + '>';
			content += link_text;
			content += '</a>';
		}

		$('.js-wpml-ls-active-tooltip').pointer('close');

		if(triggerNode.length && content) {
			triggerNode.addClass('js-wpml-ls-active-tooltip');
			triggerNode.pointer({
				pointerClass : 'js-wpml-ls-tooltip wpml-ls-tooltip',
				content:       content,
				position: {
					edge:  'bottom',
					align: 'left'
				},
				show: function(event, t){
					t.pointer.css('marginLeft', '-54px');
				},
				close: function(event, t){
					t.pointer.css('marginLeft', '0');
				},
				buttons: function( event, t ) {
					var button = $('<a class="close" href="#">&nbsp;</a>');

					return button.on( 'click.pointer', function(e) {
						e.preventDefault();
						t.element.pointer('close');
					});
				},

			}).pointer('open');
		}
	};

	var cloneSubformIntoDialog = function(subform) {
		var subformClone = subform.clone(true);

		dialogBox.find('.js-wpml-ls-dialog-inner').empty().append(subformClone);

		if('' === subformClone.find('.js-wpml-ls-preview').html()) {
			updatePreview(subformClone);
		}

		prepareSlotInlineStyles(subform);
		updateAvailableSlotsSelector(subformClone);
		resetColorpickers(subformClone);
		preselectSlot(subformClone);

		dialogBox.dialog('option', 'title', subformClone.data('title'))
			.dialog('open');
	};

	var prepareSlotInlineStyles = function(subform) {
		var type = subform.data('item-type');
		var slug = subform.data('item-slug');

		slug = '%id%' === slug ? '__id__' : slug;
		var inlineStyles = $('#wpml-ls-inline-styles-' + type + '-' + slug);
		slotInlineStylesBackup = inlineStyles.detach();
		updateDialogInlineStyle(slotInlineStylesBackup.clone());
	};

	var restoreInlineStyles = function() {
		if ( slotInlineStylesBackup instanceof jQuery && slotInlineStylesBackup.length > 0) {
			$('#' + additionalCssStyleId).before(slotInlineStylesBackup);
		}
	};

	var replaceDialogSubformIntoOrigin = function(subform) {
		var subformClone = subform.clone(true),
			itemType     = subform.data('item-type');

		subformClone.find('.js-wpml-ls-preview-wrapper').css('top', 0);

		if(0 <= $.inArray(itemType, ["menus", "sidebars"] )) {
			var selectedSlot = subform.find('.js-wpml-ls-available-slots').val();

			if (isSlotAllowed(selectedSlot, itemType)) {
				if (typeof subformClone.data('origin-id') === 'undefined') {
					appendNewRowAndSubform(subformClone);
				} else {
					updateRowAndSubform(subformClone);
				}

				updateSlotSectionStatus(itemType);
			} else {
				missingSlotWarning(subform);
			}
		} else if(subformClone.data('item-type') === 'statics'){
			updateStaticSlot(subformClone);
		}
	};

	var updateSlotSectionStatus = function(itemType) {
		var section    = $('#wpml-language-switcher-' + itemType),
			numItems   = section.find('.js-wpml-ls-row').length,
			numAllowed = $.map(wpml_ls[ itemType ], function(n, i) { return i; }).length;

		if (numItems === 0) {
			section.find('.js-wpml-ls-slot-list').fadeOut();
		} else {
			section.find('.js-wpml-ls-slot-list').fadeIn();
		}

		if (numItems === numAllowed) {
			section.find('button.js-wpml-ls-open-dialog').attr('disabled', 'disabled')
				.siblings('.js-wpml-ls-tooltip-wrapper').removeClass('hidden');
		} else {
			section.find('button.js-wpml-ls-open-dialog').prop('disabled', false)
				.siblings('.js-wpml-ls-tooltip-wrapper').addClass('hidden');
		}
	};

	var updateStaticSlot = function(subform) {
		var wrapper = $('#' + subform.data('origin-id')),
			slug    = subform.data('item-slug');

		wrapper.find('.js-wpml-ls-subform').replaceWith(subform);

		copyDialogInlineStyleToSlot('statics', slug);

		updateSettings(wrapper, function() {
			dialogBox.find('.js-wpml-ls-dialog-inner').empty();
			dialogBox.dialog('close');
		});
	};

	var updateRowAndSubform = function(subform) {
		var row      = $('#' + subform.data('origin-id')),
			itemType = subform.data('item-type'),
			slug     = WPML_core.sanitize( subform.find('.js-wpml-ls-available-slots').val() );

		row.find('.js-wpml-ls-subform').replaceWith(subform);

		if(row.attr('id') !== 'wpml-ls-' + itemType +'-row-' + slug){
			updateRowOnItemSlotChange(row, itemType, slug);
		}

		copyDialogInlineStyleToSlot(itemType, slug);

		updateSettings(row, function() {
			dialogBox.find('.js-wpml-ls-dialog-inner').empty();
			dialogBox.dialog('close');
		});
	};

	var appendNewRowAndSubform = function(subform) {
		var itemType = subform.data('item-type'),
			slug     = WPML_core.sanitize( subform.find('.js-wpml-ls-available-' + itemType).val() );

		replaceSubformElementsAttributes(subform, slug);

		var tplString = $.trim($('#wpml-ls-new-' + itemType + '-row-template').html()),
			newRow    = $($.parseHTML(tplString));

		newRow.find('.js-wpml-ls-subform').replaceWith(subform);
		updateRowOnItemSlotChange(newRow, itemType, slug);
		newRow.hide().appendTo(form.find('#wpml-ls-slot-list-' + itemType + ' > tbody')).show(800);

		copyDialogInlineStyleToSlot(itemType, slug);

		updateSettings(newRow, function() {
			dialogBox.find('.js-wpml-ls-dialog-inner').empty();
			dialogBox.dialog('close');
		});
	};

	var missingSlotWarning = function(subform) {
		subform.find('.js-wpml-ls-available-slots').addClass('wpml-ls-required');
		dialogBox.animate({scrollTop:0}, 300);
		$('.js-wpml-ls-dialog-save').prop('disabled', false);
	};

	var updateRowOnItemSlotChange = function(row, itemType, slug) {
		var newRowId = 'wpml-ls-' + itemType +'-row-' + slug,
			newTitle = wpml_ls[ itemType ][ slug ].name;

		row.attr('id', newRowId);
		row.data('item-type', itemType);
		row.find('.js-wpml-ls-subform').addBack().data('item-slug', slug);
		row.find('.js-wpml-ls-subform').data('origin-id', newRowId);
		row.find('.js-wpml-ls-row-title').html(newTitle);
	};

	var replaceSubformElementsAttributes = function(subform, newSlug) {
		var attr     = '',
			itemType = subform.data('item-type'),
			oldSlug  = subform.data('item-slug');

		subform.find('input, select').each(function(i, el){
			attr = $(el).attr('name');
			if( typeof attr === 'string') {
				$(el).attr('name', attr.replace(itemType + '[' + oldSlug +']', itemType + '[' + newSlug +']') );
			}

			attr = $(el).attr('id');
			if( typeof attr === 'string') {
				$(el).attr('id', attr.replace(oldSlug, newSlug) );
			}
		});

		subform.find('label').each(function(i, el){
			attr = $(el).attr('for');
			if( typeof attr === 'string') {
				$(el).attr('for', attr.replace(oldSlug, newSlug) );
			}
		});
	};

	var prepareTemplateSubform = function(targetNode) {
		var tplString = $.trim(targetNode.html()),
			subform   = $($.parseHTML(tplString));

		updateAvailableSlotsSelector(subform);

		return subform;
	};

	var getUsedSlots = function( type ) {
		var slotSlugs = [];
		$('#wpml-ls-slot-list-' + type + ' .js-wpml-ls-row').each( function() {
			slotSlugs.push($(this).data('item-slug'));
		});

		return slotSlugs;
	};

	var isSlotAllowed = function(slot, itemType) {
		var allowedSlots = $.map(wpml_ls[ itemType ], function(el) {
			return itemType === 'menus' ? el.term_id.toString() : el.id;
		});

		return 0 <= $.inArray(slot, allowedSlots);
	};

	var updateAvailableSlotsSelector = function(subform) {
		var itemType            = subform.data('item-type'),
			alreadyUsed         = getUsedSlots(itemType),
			selectedOption      = subform.data('item-slug'),
			selectorOptionsNode = subform.find('.js-wpml-ls-available-slots option');

		selectorOptionsNode.each(function(){
			var optionNode    = $(this),
				usedOption    = $.inArray(optionNode.val(), alreadyUsed) >= 0,
				currentOption = optionNode.val();

			optionNode.prop('disabled', usedOption && selectedOption !== currentOption);
		});
	};

	var attachUpdatePreviewEvents = function() {
		formAndDialogBox
			.on('change', '[type!="text"].js-wpml-ls-trigger-update', function(){
				var subform = $(this).parents('.js-wpml-ls-subform');
				updatePreview(subform);
			})
			.on('keyup', '[type="text"].js-wpml-ls-trigger-update', function(){
				var subform = $(this).parents('.js-wpml-ls-subform');
				updatePreview(subform);
			})
			.on('keyup', '.js-wpml-ls-additional-css', function(){
				var styleId      = 'wpml-ls-inline-styles-additional-css',
					newStyleNode = $('<style id="' + styleId + '" type="text/css">' + WPML_core.sanitize( $(this).val() ) + '</style>');

				$('#' + styleId).replaceWith(newStyleNode);
			});
	};

	var attachTemplateChangeEvents = function() {
		formAndDialogBox.on('change', '.js-wpml-ls-template-selector', function() {
			var selected = $(this).val(),
				subform  = $(this).closest('.js-wpml-ls-subform'),
				force    = wpml_ls.templates[ selected ].force_settings;

			subform.find('.js-wpml-ls-to-include input').prop('disabled', false);

			jQuery.each(force, function(k, v){
				if(v === 1) {
					subform.find('.js-wpml-ls-setting-' + k).prop('checked', true).prop('disabled', true);
				} else {
					subform.find('.js-wpml-ls-setting-' + k).prop('checked', false).prop('disabled', true);
				}
			});
		});
	};

	var attachMenuHierarchicalEvents = function() {
		formAndDialogBox.on('change', '.js-wpml-ls-menu-is-hierarchical', function() {
			var isHierarchical          = parseInt($(this).val()),
				subform                 = $(this).closest('.js-wpml-ls-subform'),
				includeCurrentLangInput = subform.find('.js-wpml-ls-setting-display_link_for_current_lang');

			includeCurrentLangInput.prop('disabled', false);

			if(isHierarchical === 1) {
				includeCurrentLangInput.prop('checked', true).prop('disabled', true);
			}
		});
	};

	var updatePreview = _.debounce( function(subform) {
		$('.js-wpml-ls-dialog-save').prop('disabled', true);
		var preview = subform.find('.js-wpml-ls-preview');

		if(preview.length > 0) {
			showSpinner(preview);
			var previewData = getSerializedSettings(subform);

			wp.ajax.send({
				data: {
					action:        'wpml-ls-update-preview',
					nonce:         wpml_ls.nonce,
					slot_settings: previewData
				},
				success:  function (data) {
					preview.empty();
					updateDialogInlineStyle(data.styles);
					buildCSSLinks(data.css);
					buildJSScripts(data.js);
					showUpdatedContent(preview, data.html);
				},
				error: function (data) {
					showUpdatedContent(preview, data, 0, 'error');
				}
			});
		}
	}, 500);

	var attachSaveClickEvents = function() {
		form.on('click', '.js-wpml-ls-save-settings', function(e){
			e.preventDefault();
			updateSettings($(this));
		});
	};

	var updateSettings = _.debounce(function (wrapper, successCallback) {
		var messageWrapper = wrapper.closest('.js-wpml-ls-option').find('.js-wpml-ls-messages'),
			settings       = getSerializedSettings(form);

		if(messageWrapper.length === 0) {
			messageWrapper = wrapper.closest('.js-wpml-ls-section').find('.js-wpml-ls-messages');
		}

		messageWrapper.empty();
		showSpinner(messageWrapper);

		wp.ajax.send({
			data: {
				action:   'wpml-ls-save-settings',
				nonce:    wpml_ls.nonce,
				settings: settings
			},
			success:  function (data) {
				showUpdatedContent(messageWrapper, data, 2500, 'updated');

				if(typeof successCallback === 'function') {
					successCallback();
				}
			},
			error: function (data) {
				showUpdatedContent(messageWrapper, data, 2500, 'error');
			}
		});
	}, 500);

	var getSerializedSettings = function(form) {
		var disabled = form.find(':input:disabled').prop('disabled', false),
			settings = form.find('input, select, textarea').serialize();

		disabled.attr('disabled','disabled');

		return settings;
	};

	var showSpinner = function(wrapper) {
		$('.js-wpml-ls-messages').removeClass('success error').hide().empty();
		wrapper.siblings('.spinner').addClass('is-active');
	};

	var showUpdatedContent = function(wrapper, content, delay, type) {
		wrapper.siblings('.spinner').removeClass('is-active');

		wrapper.removeClass('updated notice error');

		if(type) {
			wrapper.addClass(type);
		}

		wrapper.html(content).fadeIn();

		if(delay) {
			wrapper.delay(delay).fadeOut();
		}

		$('.js-wpml-ls-dialog-save').prop('disabled', false);
	};

	var updateDialogInlineStyle = function (styles) {
		 $('#' + dialogInlineStyleId).remove();

		if(styles) {
			var newDialogStyle;

			if (styles instanceof jQuery) {
				newDialogStyle = styles;
			} else {
				newDialogStyle = $($.parseHTML(styles)).first();
			}

			newDialogStyle.attr('id', dialogInlineStyleId);
			$('#' + additionalCssStyleId).before(newDialogStyle);
		}
	};

	var copyDialogInlineStyleToSlot = function (itemType, slug) {
		var dialogStyleClone = $('#' + dialogInlineStyleId).clone(),
			targetId         = 'wpml-ls-inline-styles-' + itemType + '-' + slug,
			targetStyle      = $('#' + targetId);

		dialogStyleClone.attr('id', targetId);

		if (targetStyle.length) {
			targetStyle.replaceWith(dialogStyleClone);
		} else {
			$('#' + additionalCssStyleId).before(dialogStyleClone);
		}
	};

	var buildCSSLinks = function (css) {
		var i,
			linkTag;

		if (typeof css !== typeof undefined && null !== css) {
			for (i = 0; i < css.length; i++) {
				linkTag = $('link[href="' + css[i] + '"]');

				if (0 === linkTag.length) {
					linkTag = $('<link>');
					linkTag.attr('rel', 'stylesheet');
					linkTag.attr('type', 'text/css');
					linkTag.attr('media', 'all');
					linkTag.attr('href', css[i]);
					linkTag.prependTo('head');
				}
			}
		}
	};

	var buildJSScripts = function (js) {
		var i,
			jsTag;

		if (typeof js !== typeof undefined && null !== js) {
			for (i = 0; i < js.length; i++) {
				jsTag = $('script[src="' + js[i] + '"]');

				if (0 === jsTag.length) {
					jsTag = $('<script></script>');
					jsTag.attr('type', 'text/javascript');
					jsTag.attr('src', js[i]);
					jsTag.prependTo('head');
				}
			}
		}
	};

	return {
		'init': init
	};

})( jQuery, wpml_language_switcher_admin );

jQuery(function () {
    "use strict";

    WPML_core.languageSwitcher.init();
});
