Files
web2py/applications/welcome3/static/js/web2py-bootstrap3.js
T
mdipierro 46e0dcebf2 welcome3
2015-03-10 13:42:58 -05:00

254 lines
9.7 KiB
JavaScript

/*!
* part of the package to convert web2py elements to bootstrap3 theme
* Developed by Paolo Caruccio ( paolo.caruccio66@gmail.com )
* Released under MIT license
* version 1 rev.201402261600
*
* Supported version of bootstrap framework: 3.0.2+
* The full package includes:
* - bootstrap3.py python module
* - web2py-bootstrap3.css
* - this js file
* - example of layout.html
*/
(function ($) {
// bootstrap3 classes for elements of horizontal form - data
var FH_CL_PREFIX = 'col-md-', // class prefix
FH_LABEL_COLW = '4', // nr. of columns of 12
FH_CONTROL_COLW = '8' // 12 - FH_LABEL_COLW;
// bootstrap3 classes for elements of horizontal form - calculations
var fh_label_class = FH_CL_PREFIX + FH_LABEL_COLW,
fh_offest_class = FH_CL_PREFIX+'offset-'+FH_LABEL_COLW,
fh_control_class = FH_CL_PREFIX + FH_CONTROL_COLW;
// functions
function menu_is_collapsed() {
return !$('.navbar-toggle').is(':hidden')
};
function closeSubmenu() {
$(".dropdown-submenu>a.active").each(function(){
var o = $(this);
o.parent().children("ul").toggleClass('open').data('phase', null);
o.toggleClass('active');
});
};
$.fn.center = function (options) {
var defaults = {'parent': false, 'mode': "both"};
var settings = $.extend(defaults, options);
var parent;
if (settings.parent) {
parent = this.parent();
} else {
parent = window;
}
if (settings.mode != "horizontally") {
this.css("top", Math.max(0, (($(parent).height() - $(this).outerHeight()) / 2) + $(parent).scrollTop()) + "px");}
if (settings.mode != "vertically") {
this.css("left", Math.max(0, (($(parent).width() - $(this).outerWidth()) / 2) + $(parent).scrollLeft()) + "px");}
return this;
};
function adjust_maxheight_of_collapsed_nav() {
var cn = $('div.navbar-collapse');
var sh = $(window).height();
if (cn.get(0)) {
if (sh<320) {
cn.addClass('short-screen');
}
else {
cn.removeClass('short-screen');
}
}
};
// alert centering
$('.flash.alert.centered').center({'mode': "horizontally"});
// navs
$(".nav ul.dropdown-menu").not("#w2p-auth-bar").each(function() {
var toggle = $(this).parent();
if (toggle.parent().hasClass("nav")) {
toggle.attr("data-w2pmenulevel", "l0");
toggle.children("a")
.addClass("dropdown-toggle")
.append('<span class="caret"> </span>')
.attr("data-toggle", "dropdown");
} else {
toggle.addClass("dropdown-submenu").removeClass("dropdown");
};
});
$('.navbar-nav a.dropdown-toggle').click(function(e) {
if (menu_is_collapsed()) {
e.preventDefault();
}else{
window.location=$(this).attr('href');
};
});
$(".dropdown-submenu>a").click(function(event) {
if (menu_is_collapsed()) {
event.preventDefault();
event.stopPropagation();
var submenu = $(this).parent().children("ul");
submenu.data('phase','opening');
var dropdownOfThis = $(this).parent().parent();
var actives = dropdownOfThis.find('ul.dropdown-menu.open');
if (actives && actives.length) {
var hasData = actives.data('phase');
if (hasData && hasData=='opened') {
actives.removeClass('open');
actives.siblings('a.active').removeClass('active');
hasData || actives.data('phase', null);
};
};
submenu.toggleClass('open').data('phase','opened');
$(this).toggleClass('active');
}else{
window.location=$(this).attr('href');
};
});
$(".nav-tabs .web2py-menu-active").addClass('active');
$(".nav-tabs a").not(".dropdown-toggle").attr("data-toggle", "tab");
// form fixes
$(document).ready(function() {
$("form.bs3-form .w2p_list a").each(function() {
// the plus and minus buttons are generated by web2py.js
$(this).addClass('btn btn-default');
});
$("form.bs3-form p.w2p-autocomplete-widget").each(function() {
// not generated by formstyle
$(this).children('input').addClass('form-control');
});
$("form.bs3-form input[name='password_two']").each(function() {
// auth addition after form creation
var $this = $(this).addClass('form-control');
var groupClass = 'form-group'
var labelClass = 'control-label';
var commentClass = 'help-block';
var comment;
var mode;
var hasError = false;
if ($this.parent().hasClass('form-horizontal')) {
mode = 'horizontal';
labelClass = fh_label_class+' control-label';
};
if ($this.parent().hasClass('form-inline')) {
mode = 'inline';
labelClass = 'sr-only';
commentClass = 'sr-only';
var labelText = $this.prev('label').text();
$this.attr("placeholder", labelText.slice(0,-2));
};
var error = $this.next('div.error_wrapper');
if (error.length > 0) {
var hasError = true;
groupClass = 'form-group has-error'
var text = error[0].nextSibling.nodeValue;
if (text) {
comment = "<span class='"+commentClass+"'>"+text+"</span>";
error[0].parentNode.removeChild(error[0].nextSibling);
};
} else {
var text = $this[0].nextSibling.nodeValue;
if (text) {
comment = "<span class='"+commentClass+"'>"+text+"</span>";
$this[0].parentNode.removeChild($this[0].nextSibling);
};
};
$this.prev('label').addClass(labelClass).andSelf().wrapAll("<div class='"+groupClass+"' id='auth_user_verify_password__row'></div>");
if (mode == 'horizontal') {
$this.wrap('<div class="'+fh_control_class+'"></div>');
};
if (hasError) {
$this.parent().append(error);
};
$this.parent().append(comment);
});
$('form.bs3-form #auth_user_remember').each(function() {
// auth addition after form creation
var $input = $(this);
var $label = $input.next('label');
var $iParent = $input.parent();
$input.removeClass('checkbox');
$iParent.prev('label').remove();
$input.prependTo($label);
var newGroup = $label;
$iParent.replaceWith(newGroup);
if (newGroup.parent().hasClass('form-horizontal')) {
newGroup.wrap($('<div class="form-group"><div class="'+fh_offest_class+' '+fh_control_class+'"><div class="checkbox"></div></div></div>'));
} else {
newGroup.wrap($('<div class="form-group"><div class="checkbox"></div></div>'));
};
});
});
// form errors
$('form.bs3-form .error_wrapper').each(function() {
var $this = $(this)
var rcContainer = $this.parents('.rc_container');
if (rcContainer.length > 0) {
$this.appendTo(rcContainer);
}
});
$('form.bs3-form').find('div.error').addClass('text-danger').closest(".form-group").addClass('has-error');
// uploadwidget
$('#file-reset-btn').click(function() {
var el = $('div.w2p-uploaded-file')[0];
var whatReset = jQuery.data(el, "reset");
if (whatReset == "changed") {
$('.w2p-uploaded-file input[type="file"]')
.replaceWith(
$('.w2p-uploaded-file input[type="file"]')
.clone());
$('.w2p-file-preview, .w2p-uploaded-file input[type="file"], #edit-btn-dd, #file-reset-btn').toggle();
}else{
$('.w2p-file-preview, #no-file, #edit-btn-dd, #file-reset-btn').toggle();
$('div.w2p-uploaded-file').children('input[type=checkbox]').trigger('click');
}
jQuery.removeData(el, "reset");
});
$('#change-file-option').click(function(e) {
e.preventDefault();
$('.w2p-file-preview, .w2p-uploaded-file input[type="file"], #edit-btn-dd, #file-reset-btn').toggle();
jQuery.data($('div.w2p-uploaded-file')[0], "reset", "changed");
});
$('#delete-file-option').click(function(e) {
e.preventDefault();
var wimg = $('#image-thumb').outerWidth(),
himg = $('#image-thumb').outerHeight();
$('#no-file')
.width(wimg)
.height(himg)
.css({'line-height':himg+'px'});
$('.w2p-file-preview, #no-file, #edit-btn-dd, #file-reset-btn').toggle();
$('div.w2p-uploaded-file').children('input[type=checkbox]').trigger('click');
jQuery.data($('div.w2p-uploaded-file')[0], "reset", "deleted");
});
// on page load
adjust_maxheight_of_collapsed_nav();
// resize and orientation change events
$(window).on('orientationchange resize', function(event) {
adjust_maxheight_of_collapsed_nav();
$('.flash.alert').center({'mode':"horizontally"});
if (menu_is_collapsed() === false) {
closeSubmenu();
$('.navbar-nav .dropdown.open a.dropdown-toggle').dropdown('toggle');
$('#main-menu.in, #login-menu.in').collapse('hide');
};
});
}(jQuery));