awselect_count = 0; (function ( $ ) { $(document).mouseup(function (e) { var awselect = $(".awselect"); if (!awselect.is(e.target) // if the target of the click isn't the container... && awselect.has(e.target).length === 0) // ... nor a descendant of the container { deanimate() } }); $.fn.awselect = function(options){ var element = $(this); var opts = $.extend({}, $.fn.awselect.defaults, options) element.each(function(){ awselect_count += 1 build($(this), opts); }) this.on('click', function(){ animate(getawselectElement($(this))); }) this.on('change', function(){ setValue(this); }) console.log(element.attr('id')) return { blue: function(){ element.css('color', 'blue') } } }; $.fn.awselect.defaults = { background: "#e5e5e5", active_background: "#fff", placeholder_color: "#000", placeholder_active_color: "#000", option_color: "#000", vertical_padding: "15px", horizontal_padding: "40px" } function getawselectElement(select){ return $('.awselect[data-select="' + select.attr('id') + '"]') } function build(element, opts){ var placeholder = element.attr('data-placeholder') var id = element.attr('id') var options = element.children('option') var selected = false; var classes = "awselect"; var options_html = ''; var background = opts["background"] var active_background = opts["active_background"] var placeholder_color = opts["placeholder_color"] var placeholder_active_color = opts["placeholder_active_color"] var option_color = opts["option_color"] var vertical_padding = opts["vertical_padding"] var horizontal_padding = opts["horizontal_padding"] options.each(function(){ if ( $(this).attr('selected') == "selected") { selected = $(this).text() } options_html += '
  • '+ $(this).text() +'
  • '; }) if ( selected !== false ) { classes += ' hasValue'; } if (typeof id !== typeof undefined && id !== false) { id_html = id } else { id_html = 'awselect_' + awselect_count; $(element).attr('id', id_html) } var awselect_html = '
    '; awselect_html += '
    ' awselect_html += '
    ' awselect_html += '
    ' if ( selected !== false ) { awselect_html += ''+ selected +''; } awselect_html += ''+ placeholder +'' awselect_html += ''+ icon(placeholder_color) +'' awselect_html += '
    ' awselect_html += '
    '; awselect_html += '
    '; awselect_html += '
    '; $(awselect_html).insertAfter(element) //$('#euler_' + id_html).css("height", $('#euler_' + id_html).outerHeight() - $('#euler_' + id_html).find('.back_face').outerHeight() ) element.hide() } function animate(element){ if ( element.hasClass('animating') == false ) { element.addClass('animating') if ( $('.awselect.animate').length > 0 ) { deanimate($('.awselect').not(element)) var timeout = 600 } else { var timeout = 100 } setTimeout(function(){ var back_face = element.find('.back_face') back_face.show() var bg = element.find('> .bg') bg.css({ "height" : element.outerHeight() + back_face.outerHeight() }) back_face.css({ "margin-top" : $(element).outerHeight() }) element.addClass('placeholder_animate') setTimeout(function(){ switchPlaceholderColor(element) if ( back_face.outerHeight() == 200 ) { back_face.addClass('overflow') } element.addClass('placeholder_animate2') element.addClass('animate') element.addClass('animate2') element.removeClass('animating') }, 100) }, timeout) } } function deanimate(awselects){ if (awselects == null ) { var awselect = $('.awselect') } else { var awselect = awselects } $(awselect).each(function(){ var element = $(this); if ( element.hasClass('animate') ) { setTimeout(function(){ element.removeClass('animate2') setTimeout(function(){ element.find('.back_face').hide() element.removeClass('animate') switchPlaceholderColor(element) element.children(".bg").css({ "height" : 0 }) element.removeClass('placeholder_animate2') setTimeout(function(){ element.removeClass('placeholder_animate') },100) }, 200) }, 400) } }) } function switchPlaceholderColor(element) { var placeholder_inactive_color = element.find('.front_face .content').attr('data-inactive-color') var placeholder_normal_color = element.find('.front_face .content').css('color') element.find('.front_face .content').attr('data-inactive-color', placeholder_normal_color) element.find('.front_face .content').css('color', placeholder_inactive_color) element.find('.front_face .icon svg').css('fill', placeholder_inactive_color) } function setValue(select){ var val = $(select).val() var euler_awselect = getawselectElement($(select)) var option_value = $(select).children('option[value="'+ val +'"]').eq(0) var callback = $(select).attr('data-callback') $(euler_awselect).find('.current_value').remove() $(euler_awselect).find('.front_face .content').prepend(''+ option_value.text() + '') $(euler_awselect).addClass('hasValue') if (typeof callback !== typeof undefined && callback !== false) { window[callback](option_value.val()) } setTimeout(function(){ deanimate() }, 200) } function icon(color){ return ''; } function change(elem){ elem.css('color', 'green') } }( jQuery )); function hello(value){ console.log("hello world! the selected value is " + value) } $(document).ready(function(){ $('body').on('click', '.awselect', function(){ if ( $(this).hasClass('animate') == false ) { $('select#' + $(this).attr('id').replace('euler_', '')).trigger('click') } }) $('body').on('click', '.awselect ul li a', function(){ var awselect = $(this).parents('.awselect') var value_index = $(this).parent('li').index() var id = awselect.attr('data-select') var select = $('select#' + id) var option_value = $(select).children('option').eq(value_index) var callback = $(select).attr('data-callback') $(select).val(option_value.val()) $(select).trigger('change') }) })