text: (function($) {
  	"use strict";
  
  	$(window).on('load', function() {
  		qodefButtonWidgetFieldDependency();
  		qodefIconWidgetFieldDependency();
  		qodefImageGalleryWidgetFieldDependency()
  		qodefSocialIconWidgetFieldDependency();
  	});
  	
  	/**
  	 * Render field dependency for button widget
  	 */
  	function qodefButtonWidgetFieldDependency() {
  		var buttons = {
  			'solid': ['size', 'background_color', 'border_color'],
  			'outline': ['size', 'background_color', 'border_color']
  		};
  		
  		qodefUpdateWidgetSelection('qodef_button_widget', 'type', buttons);
  	}
  	
  	/**
  	 * Render field dependency for icon widget
  	 */
  	function qodefIconWidgetFieldDependency() {
  		var iconPacks = {
  			'font_awesome': 'fa_icon',
  			'font_elegant': 'fe_icon',
  			'ion_icons': 'ion_icon',
  			'linea_icons': 'linea_icon',
  			'linear_icons': 'linear_icon',
  			'simple_line_icons': 'simple_line_icon',
              'dripicons': 'dripicon'
  		};
  		
  		qodefUpdateWidgetSelection('qodef_icon_widget', 'icon_pack', iconPacks);
  	}
  	
  	/**
  	 * Render field dependency for image gallery widget
  	 */
  	function qodefImageGalleryWidgetFieldDependency() {
  		var imageBehavior = {
  			'custom-link': ['custom_links', 'custom_link_target']
  		};
  		
  		qodefUpdateWidgetSelection('qodef_image_gallery_widget', 'image_behavior', imageBehavior);
  		
  		var imageType = {
  			'grid': ['number_of_columns', 'space_between_columns'],
  			'slider': ['slider_navigation', 'slider_pagination']
  		};
  		
  		qodefUpdateWidgetSelection('qodef_image_gallery_widget', 'type', imageType);
  	}
  	
  	/**
  	 * Render field dependency for socialIcon widget
  	 */
  	function qodefSocialIconWidgetFieldDependency() {
  		var iconPacks = {
  			'font_awesome': 'fa_icon',
  			'font_elegant': 'fe_icon',
  			'ion_icons': 'ion_icon',
  			'simple_line_icons': 'simple_line_icon'
  		};
  		
  		qodefUpdateWidgetSelection('qodef_social_icon_widget', 'icon_pack', iconPacks);
  	}
  
      /**
       * Function that shows/hides fields based on selection
       *
       * @param string widgetId is unique id of widget
       * @param string optionName is widget option name which trigger dependency
       * @param object optionDependencyArray is object where keys are values of option with dependency and values are options you want to show/hide
       */
      function qodefUpdateWidgetSelection(widgetId, optionName, optionDependencyArray) {
  	    qodefWidgetFields(widgetId, optionName, optionDependencyArray);
  
  	    $('body').on('change', 'select[name*="'+widgetId+'"]', function() {
  	    	if( $(this).attr('name').search(optionName) !== -1 ) {
  			    var thisWidget    = $(this).closest('.widget'),
  				    selectedValue = $(this).find('option:selected').val();
  
  			    qodefHideFields(thisWidget, optionDependencyArray);
  			    qodefShowFields(thisWidget, optionDependencyArray, selectedValue);
  		    }
          });
      }
  
  	/**
  	 * Core function which initialy loops for dependancy fields and hide non-selected ones
  	 *
  	 * @param string widgetId is unique id of widget
  	 * @param string optionName is widget option name which trigger dependency
  	 * @param object optionDependencyArray is object where keys are values of option with dependency and values are options you want to show/hide
  	 */
  	function qodefWidgetFields(widgetId, optionName, optionDependencyArray) {
  		$('div[id*="'+widgetId+'"]').each(function(){
  			var selectedValue = $(this).find('select[id*="'+optionName+'"]').val(),
  				saveButton = $(this).find('.widget-control-save');
  
  			saveButton.on('click', {widget: $(this), optionDependencyArray: optionDependencyArray, optionName: optionName}, qodefTrackAjaxChange);
  
  			qodefHideFields($(this), optionDependencyArray);
  			qodefShowFields($(this), optionDependencyArray, selectedValue);
  		});
  	}
  
  	/**
  	 * Core function which hides non selected fields and shows selected one
  	 *
  	 * @param object thisWidget is current widget
  	 * @param object optionDependencyArray is object where keys are values of option with dependency and values are options you want to show/hide
  	 */
  	function qodefHideFields(thisWidget, optionDependencyArray) {
  		$.each(optionDependencyArray, function(key, value) {
  			if( typeof value === 'string' ) {
  				thisWidget.find('[id*="' + value + '"]').parent().hide();
  			} else if (typeof value === 'object') {
  				$.each(value, function(arrayKey, arrayValue){
  					thisWidget.find('[id*="'+arrayValue+'"]').parent().hide();
  				});
  			}
  		});
  	}
  
  	/**
  	 * Core function which shows non selected fields and shows selected one
  	 *
  	 * @param object thisWidget is current widget
  	 * @param object optionDependencyArray is object where keys are values of option with dependency and values are options you want to show/hide
  	 * @param string/object selectedValue is selected value of optionName
  	 */
  	function qodefShowFields(thisWidget, optionDependencyArray, selectedValue) {
  		if( typeof optionDependencyArray[selectedValue] === 'string' ) {
  			thisWidget.find('[id*="'+optionDependencyArray[selectedValue]+'"]').parent().show();
  		} else {
  			$.each(optionDependencyArray[selectedValue], function(key, value){
  				thisWidget.find('[id*="'+value+'"]').parent().show();
  			});
  		}
  	}
  
  	/**
  	 * Core function which checks for spinner once a save button is clicked
  	 */
  	function qodefTrackAjaxChange(event) {
      	var widget = event.data.widget,
  		    optionDependencyArray = event.data.optionDependencyArray,
  		    optionName = event.data.optionName,
  		    spinner = widget.find('.spinner');
  
  	    var timer = setInterval(function(){
  		    if( spinner.hasClass('is-active') ) {
  			    clearInterval(timer);
  			    qodefAfterAjaxReset(widget, optionName, spinner, optionDependencyArray);
  		    }
  	    }, 20);
  	}
  
  	/**
  	 * Core function which runs after ajax save is reloaded
  	 *
  	 * @param object thisWidget is current widget
  	 * @param string optionName is widget option name which trigger dependency
  	 * @param object spinner is native widget spinner when you click to save widget
  	 * @param object optionDependencyArray is object where keys are values of option with dependency and values are options you want to show/hide
  	 */
  	function qodefAfterAjaxReset(thisWidget, optionName, spinner, optionDependencyArray) {
  		var timer = setInterval(function(){
  			if( ! spinner.hasClass('is-active') ) {
  				var selectedValue = thisWidget.find('select[id*="'+optionName+'"]').val();
  
  				clearInterval(timer);
  				qodefHideFields(thisWidget, optionDependencyArray);
  				qodefShowFields(thisWidget, optionDependencyArray, selectedValue);
  			}
  		}, 20);
  	}
  
  })(jQuery);