//# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // //# CLASSIE //# class helper functions //# from bonzo https://github.com/ded/bonzo //# classie.has( elem, 'my-class' ) -> true/false //# classie.add( elem, 'my-new-class' ) //# classie.remove( elem, 'my-unwanted-class' ) //# classie.toggle( elem, 'my-class' ) (function(window) { 'use strict'; function classReg( className ) { return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); } var hasClass, addClass, removeClass; if ( 'classList' in document.documentElement ) { hasClass = function( elem, c ) { return elem.classList.contains( c ); }; addClass = function( elem, c ) { elem.classList.add( c ); }; removeClass = function( elem, c ) { elem.classList.remove( c ); }; } else { hasClass = function( elem, c ) { return classReg( c ).test( elem.className ); }; addClass = function( elem, c ) { if ( !hasClass( elem, c ) ) { elem.className = elem.className + ' ' + c; } }; removeClass = function( elem, c ) { elem.className = elem.className.replace( classReg( c ), ' ' ); }; } function toggleClass( elem, c ) { var fn = hasClass( elem, c ) ? removeClass : addClass; fn( elem, c ); } var classie = { hasClass: hasClass, addClass: addClass, removeClass: removeClass, toggleClass: toggleClass, has: hasClass, add: addClass, remove: removeClass, toggle: toggleClass }; if ( typeof define === 'function' && define.amd ) { define( classie ); } else { window.classie = classie; } })(window); //# ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // //# SELECT //# v1.0.0 //# http://www.codrops.com //# Licensed under the MIT license. //# http://www.opensource.org/licenses/mit-license.php //# Copyright 2014, Codrops //# http://www.codrops.com //# mod by DW ;(function(window) { 'use strict'; function hasParent( e, p ) { if (!e) return false; var el = e.target||e.srcElement||e||false; while (el && el != p) { el = el.parentNode||false; } return (el!==false); } function extend( a, b ) { for( var key in b ) { if ( b.hasOwnProperty( key ) ) { a[key] = b[key]; } } return a; } function SelectFx( el, options ) { this.el = el; this.options = extend( {}, this.options ); extend( this.options, options ); this._init(); } SelectFx.prototype.options = { newTab : true, stickyPlaceholder : true, onChange : function( val ) { return false; } } SelectFx.prototype._init = function() { var selectedOpt = this.el.querySelector( 'option[selected]' ); this.hasDefaultPlaceholder = selectedOpt && selectedOpt.disabled; this.selectedOpt = selectedOpt || this.el.querySelector( 'option' ); this._createSelectEl(); this.selOpts = [].slice.call( this.selEl.querySelectorAll( 'li[data-option]' ) ); this.selOptsCount = this.selOpts.length; this.current = this.selOpts.indexOf( this.selEl.querySelector( 'li.cs-selected' ) ) || -1; this.selPlaceholder = this.selEl.querySelector( 'span.cs-placeholder' ); this._initEvents(); } SelectFx.prototype._createSelectEl = function() { var self = this, options = '', createOptionHTML = function(el) { var optclass = '', classes = '', link = ''; //: NEW ( el.selectedOpt && !this.foundSelected && !this.hasDefaultPlaceholder ) if ( el.getAttribute('selected') && !self.foundSelected ) { classes += 'cs-selected '; self.foundSelected = true; } if ( el.getAttribute( 'data-class' ) ) { classes += el.getAttribute( 'data-class' ); } if ( el.getAttribute( 'data-link' ) ) { link = 'data-link=' + el.getAttribute( 'data-link' ); } if ( classes !== '' ) { optclass = 'class="' + classes + '" '; } return '
  • ' + el.textContent + '
  • '; }; [].slice.call( this.el.children ).forEach( function(el) { if ( el.disabled ) { return; } var tag = el.tagName.toLowerCase(); if ( tag === 'option' ) { options += createOptionHTML(el); } else if ( tag === 'optgroup' ) { options += '
  • ' + el.label + '
  • '; } }); var wrap_name = 'cs-wrapper'; //: NEW var data_type = ( this.el.disabled ) ? 'disabled' : 'enabled'; //: NEW var class_name = ( this.el.className ) ? this.el.className + ' ' + wrap_name : wrap_name; //: NEW var opts_el = '
    '; this.selEl = document.createElement( 'div' ); this.selEl.className = class_name; this.selEl.tabIndex = this.el.tabIndex; this.selEl.innerHTML = '' + this.selectedOpt.textContent + '' + opts_el; //: NEW this.el.parentNode.appendChild( this.selEl ); this.selEl.appendChild( this.el ); } SelectFx.prototype._initEvents = function() { var self = this; this.selPlaceholder.addEventListener('click', function() { if ( this.getAttribute('data-type') == 'enabled' ) { self._toggleSelect(); } }); this.selOpts.forEach( function(opt, idx) { opt.addEventListener('click', function() { self.current = idx; self._changeOption(); self._toggleSelect(); }); }); document.addEventListener('click', function(ev) { var target = ev.target; if ( self._isOpen() && target !== self.selEl && !hasParent(target, self.selEl) ) { self._toggleSelect(); } }); this.selEl.addEventListener('keydown', function(ev) { var keyCode = ev.keyCode || ev.which; switch (keyCode) { case 38: // up key ev.preventDefault(); self._navigateOpts('prev'); break; case 40: // down key ev.preventDefault(); self._navigateOpts('next'); break; case 32: // space key ev.preventDefault(); if ( self._isOpen() && typeof self.preSelCurrent != 'undefined' && self.preSelCurrent !== -1 ) { self._changeOption(); } self._toggleSelect(); break; case 13: // enter key ev.preventDefault(); if ( self._isOpen() && typeof self.preSelCurrent != 'undefined' && self.preSelCurrent !== -1 ) { self._changeOption(); self._toggleSelect(); } break; case 27: // esc key ev.preventDefault(); if ( self._isOpen() ) { self._toggleSelect(); } break; } }); //: NEW - 'jq' $(this.el).on('chosen:updated', function(ev) { self.current = $(this.options[this.selectedIndex]).index(); //: lub '$(this).find('option:selected').index()' self._chosenUpdate(); }); } SelectFx.prototype._navigateOpts = function(dir) { if ( !this._isOpen() ) { this._toggleSelect(); } var tmpcurrent = typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1 ? this.preSelCurrent : this.current; if ( dir === 'prev' && tmpcurrent > 0 || dir === 'next' && tmpcurrent < this.selOptsCount - 1 ) { this.preSelCurrent = dir === 'next' ? tmpcurrent + 1 : tmpcurrent - 1; this._removeFocus(); classie.add( this.selOpts[this.preSelCurrent], 'cs-focus' ); } } SelectFx.prototype._toggleSelect = function() { this._removeFocus(); if ( this._isOpen() ) { if ( this.current !== -1 ) { this.selPlaceholder.textContent = this.selOpts[ this.current ].textContent; } classie.remove( this.selEl, 'cs-active' ); } else { if ( this.hasDefaultPlaceholder && this.options.stickyPlaceholder ) { this.selPlaceholder.textContent = this.selectedOpt.textContent; } classie.add( this.selEl, 'cs-active' ); } } SelectFx.prototype._changeOption = function() { if ( typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1 ) { this.current = this.preSelCurrent; this.preSelCurrent = -1; } var opt = this.selOpts[ this.current ]; this.selPlaceholder.textContent = opt.textContent; this.el.value = opt.getAttribute( 'data-value' ); var oldOpt = this.selEl.querySelector( 'li.cs-selected' ); if ( oldOpt ) { classie.remove( oldOpt, 'cs-selected' ); } classie.add( opt, 'cs-selected' ); if ( opt.getAttribute( 'data-link' ) ) { if ( this.options.newTab ) { window.open( opt.getAttribute( 'data-link' ), '_blank' ); } else { window.location = opt.getAttribute( 'data-link' ); } } this.options.onChange( this.el.value ); } //: NEW SelectFx.prototype._chosenUpdate = function() { if ( typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1 ) { this.current = this.preSelCurrent; this.preSelCurrent = -1; } var opt = this.selOpts[ this.current ]; this.selPlaceholder.textContent = opt.textContent; this.el.value = opt.getAttribute( 'data-value' ); var oldOpt = this.selEl.querySelector( 'li.cs-selected' ); if ( oldOpt ) { classie.remove( oldOpt, 'cs-selected' ); } classie.add( opt, 'cs-selected' ); } SelectFx.prototype._isOpen = function(opt) { return classie.has( this.selEl, 'cs-active' ); } SelectFx.prototype._removeFocus = function(opt) { var focusEl = this.selEl.querySelector( 'li.cs-focus' ) if ( focusEl ) { classie.remove( focusEl, 'cs-focus' ); } } window.SelectFx = SelectFx; })(window); //# INIT SELECTFX $(document).ready(function() { initSelectFx = function(_obj) { if ( $(_obj).length > 0 ) { [].slice.call( document.querySelectorAll(_obj) ).forEach(function(el) { new SelectFx(el, { newTab: false, stickyPlaceholder: false, onChange: function(val) { $(el).change(); } }); }); } } initSelectFx('select.selectFix'); });