( function( $, api ) {


	var control = api.Control.extend( {
		ready: function() {

			var control = this;
			control.container.find( '.buttonset' ).buttonset();

			api.bind( 'ready',function () {

				api( control.id, function ( value ) {
					var func = function ( newval ) {
						var i, j, k, controlName, selector,
							currentControl, currentControl2,
							selector2, subControlsToShow, controlName2;

						var controls = control.params.subcontrols;
						var sectionName = control.section();
						var sectionContainer = wp.customize.section( sectionName ).container;

						var currentValue = newval;
						var controlsToShow = controls[currentValue];

						if( typeof control.params.parent !== 'undefined' ){
							var parentName = control.params.parent;
							var parentControl = wp.customize.control( parentName );
							if( typeof parentControl !== 'undefined' ){
								var parentValue = parentControl.setting._value;
								var parentOptions = parentControl.params.subcontrols[parentValue];
								if( typeof parentOptions !== 'undefined' && parentOptions.length === 0 ){
									controlsToShow = [];
								}
							}
						}


						var allControlsArray = Object.values( controls );
						allControlsArray = [].concat.apply( [], allControlsArray );

						for ( i in allControlsArray ) {
							controlName = allControlsArray[i];

							if ( controlName === 'widgets' ) {
								jQuery( sectionContainer ).children( 'li[class*="widget"]' ).css( 'display', 'none' );
							} else {
								currentControl = wp.customize.control( controlName );
								if( typeof currentControl.params.subcontrols !== 'undefined' ){
									for ( j in currentControl.params.subcontrols ){
										for( k in currentControl.params.subcontrols[j] ){
											selector = api.control( currentControl.params.subcontrols[j][k] ).selector;
											jQuery( selector ).hide();
										}
									}
								}
								if ( typeof currentControl === 'object' && currentControl.hasOwnProperty( selector ) ) {
									selector = currentControl.selector;
									jQuery( selector ).hide();
								}
							}
						}



						for( i in controlsToShow ){
							controlName = controlsToShow[i];
							if( controlName === 'widgets' ){
								jQuery( sectionContainer ).children( 'li[class*="widget"]' ).css( 'display', 'list-item' );
							} else {
								currentControl = wp.customize.control( controlName );
								if( typeof currentControl !== 'undefined' ){
									selector = currentControl.selector;
									jQuery( selector ).show();

									currentValue = currentControl.setting._value;
									if( typeof wp.customize.control( controlName ).params.subcontrols !== 'undefined' ){
										subControlsToShow =  wp.customize.control( controlName ).params.subcontrols[currentValue];
										for( j in subControlsToShow ){
											controlName2 = subControlsToShow[j];
											currentControl2 = wp.customize.control( controlName2 );
											if( typeof currentControl2 !== 'undefined' ){
												selector2 = currentControl2.selector;
												jQuery( selector2 ).show();
											}
										}
									}
								}
							}
						}
					};


					func( value.get() );
					value.bind( func );
				}
				);
			} );

		}
	} );

	api.controlConstructor['radio-image'] = control;
	api.controlConstructor['select-hiding'] = control;
} )( jQuery, wp.customize );