winter/modules/backend/assets/js/october.dropdown.js
2014-05-14 23:24:20 +10:00

102 lines
3.2 KiB
JavaScript

/*
* Dropdown menus.
*
* This script customizes the Twitter Bootstrap drop-downs.
*
*/
+function ($) { "use strict";
$(document).on('shown.bs.dropdown', '.dropdown', function(){
$(document.body).addClass('dropdown-open')
var dropdown = $('.dropdown-menu', this),
dropdownContainer = $(this).data('dropdown-container')
if ($('.dropdown-container', dropdown).length == 0) {
var
title = $('[data-toggle=dropdown]', this).text(),
titleAttr = dropdown.data('dropdown-title'),
timer = null;
if (titleAttr !== undefined)
title = titleAttr
$('li:first-child', dropdown).addClass('first-item')
dropdown.prepend($('<li/>').addClass('dropdown-title').text(title))
var
container = $('<li/>').addClass('dropdown-container'),
ul = $('<ul/>')
container.prepend(ul)
ul.prepend(dropdown.children())
dropdown.prepend(container)
dropdown.on('touchstart', function(){
window.setTimeout(function(){
dropdown.addClass('scroll')
}, 200)
})
dropdown.on('touchend', function(){
window.setTimeout(function(){
dropdown.removeClass('scroll')
}, 200)
})
dropdown.on('click', 'a', function(){
if (dropdown.hasClass('scroll'))
return false
})
}
if (dropdownContainer !== undefined && dropdownContainer == 'body') {
$(this).data('oc.dropdown', dropdown)
$(document.body).append(dropdown)
dropdown.css({
'visibility': 'hidden',
'left': 0,
'top' : 0,
'display': 'block'
})
var targetOffset = $(this).offset(),
targetHeight = $(this).height(),
targetWidth = $(this).width(),
position = {
x: targetOffset.left,
y: targetOffset.top + targetHeight
},
leftOffset = targetWidth < 30 ? -16 : 0,
documentHeight = $(document).height(),
dropdownHeight = dropdown.height()
if ((dropdownHeight + position.y) > $(document).height()) {
position.y = targetOffset.top - dropdownHeight - 12
dropdown.addClass('top')
} else
dropdown.removeClass('top')
dropdown.css({
'left': position.x + leftOffset,
'top': position.y,
'visibility': 'visible'
})
}
if ($('.dropdown-overlay', document.body).length == 0)
$(document.body).prepend($('<div/>').addClass('dropdown-overlay'));
})
$(document).on('hidden.bs.dropdown', '.dropdown', function(){
var dropdown = $(this).data('oc.dropdown')
if (dropdown !== undefined) {
dropdown.css('display', 'none')
$(this).append(dropdown)
}
$(document.body).removeClass('dropdown-open');
})
}(window.jQuery);