welcome3
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,6 @@
|
||||
/*! Respond.js v1.4.2: min/max-width media query polyfill
|
||||
* Copyright 2014 Scott Jehl
|
||||
* Licensed under MIT
|
||||
* http://j.mp/respondjs */
|
||||
|
||||
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
|
||||
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
|
||||
Created and copyrighted by Massimo Di Pierro <massimo.dipierro@gmail.com>
|
||||
(MIT license)
|
||||
|
||||
Example:
|
||||
|
||||
<script src="share.js"></script>
|
||||
|
||||
**/
|
||||
|
||||
jQuery(function(){
|
||||
var script_source = jQuery('script[src*="share.js"]').attr('src');
|
||||
var params = function(name,default_value) {
|
||||
var match = RegExp('[?&]' + name + '=([^&]*)').exec(script_source);
|
||||
return match && decodeURIComponent(match[1].replace(/\+/g, ' '))||default_value;
|
||||
}
|
||||
var path = params('static','social');
|
||||
var url = encodeURIComponent(window.location.href);
|
||||
var host = window.location.hostname;
|
||||
var title = escape(jQuery('title').text());
|
||||
var twit = 'http://twitter.com/home?status='+title+'%20'+url;
|
||||
var facebook = 'http://www.facebook.com/sharer.php?u='+url;
|
||||
var gplus = 'https://plus.google.com/share?url='+url;
|
||||
var tbar = '<div id="socialdrawer"><span>Share<br/></span><div id="sicons"><a href="'+twit+'" id="twit" title="Share on twitter"><img src="'+path+'/twitter.png" alt="Share on Twitter" width="32" height="32" /></a><a href="'+facebook+'" id="facebook" title="Share on Facebook"><img src="'+path+'/facebook.png" alt="Share on facebook" width="32" height="32" /></a><a href="'+gplus+'" id="gplus" title="Share on Google Plus"><img src="'+path+'/gplus-32.png" alt="Share on Google Plus" width="32" height="32" /></a></div></div>';
|
||||
// Add the share tool bar.
|
||||
jQuery('body').append(tbar);
|
||||
var st = jQuery('#socialdrawer');
|
||||
st.css({'opacity':'.7','z-index':'3000','background':'#FFF','border':'solid 1px #666','border-width':' 1px 0 0 1px','height':'20px','width':'40px','position':'fixed','bottom':'0','right':'0','padding':'2px 5px','overflow':'hidden','-webkit-border-top-left-radius':' 12px','-moz-border-radius-topleft':' 12px','border-top-left-radius':' 12px','-moz-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','-webkit-box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)','box-shadow':' -3px -3px 3px rgba(0,0,0,0.5)'});
|
||||
jQuery('#socialdrawer a').css({'float':'left','width':'32px','margin':'3px 2px 2px 2px','padding':'0','cursor':'pointer'});
|
||||
jQuery('#socialdrawer span').css({'float':'left','margin':'2px 3px','text-shadow':' 1px 1px 1px #FFF','color':'#444','font-size':'12px','line-height':'1em'});
|
||||
jQuery('#socialdrawer img').hide();
|
||||
// hover
|
||||
st.click(function(){
|
||||
jQuery(this).animate({height:'40px', width:'160px', opacity: 0.95}, 300);
|
||||
jQuery('#socialdrawer img').show();
|
||||
});
|
||||
//leave
|
||||
st.mouseleave(function(){
|
||||
st.animate({height:'20px', width: '40px', opacity: .7}, 300);
|
||||
jQuery('#socialdrawer img').hide();
|
||||
return false;
|
||||
} );
|
||||
});
|
||||
@@ -0,0 +1,253 @@
|
||||
/*!
|
||||
* 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));
|
||||
@@ -0,0 +1,721 @@
|
||||
(function ($, undefined) {
|
||||
/*
|
||||
* Unobtrusive scripting adapter for jQuery, largely taken from
|
||||
* the wonderful https://github.com/rails/jquery-ujs
|
||||
*
|
||||
*
|
||||
* Released under the MIT license
|
||||
*
|
||||
*/
|
||||
if($.web2py !== undefined) {
|
||||
$.error('web2py.js has already been loaded!');
|
||||
}
|
||||
|
||||
|
||||
String.prototype.reverse = function () {
|
||||
return this.split('').reverse().join('');
|
||||
};
|
||||
var web2py;
|
||||
|
||||
$.web2py = web2py = {
|
||||
|
||||
popup: function (url) {
|
||||
/* popup a window */
|
||||
newwindow = window.open(url, 'name', 'height=400,width=600');
|
||||
if(window.focus) newwindow.focus();
|
||||
return false;
|
||||
},
|
||||
collapse: function (id) {
|
||||
/* toggle an element */
|
||||
$('#' + id).slideToggle();
|
||||
},
|
||||
fade: function (id, value) {
|
||||
/*fade something*/
|
||||
if(value > 0) $('#' + id).hide().fadeIn('slow');
|
||||
else $('#' + id).show().fadeOut('slow');
|
||||
},
|
||||
ajax: function (u, s, t) {
|
||||
/*simple ajax function*/
|
||||
query = '';
|
||||
if(typeof s == "string") {
|
||||
d = $(s).serialize();
|
||||
if(d) {
|
||||
query = d;
|
||||
}
|
||||
} else {
|
||||
pcs = [];
|
||||
if(s != null && s != undefined)
|
||||
for(i = 0; i < s.length; i++) {
|
||||
q = $("[name=" + s[i] + "]").serialize();
|
||||
if(q) {
|
||||
pcs.push(q);
|
||||
}
|
||||
}
|
||||
if(pcs.length > 0) {
|
||||
query = pcs.join("&");
|
||||
}
|
||||
}
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: u,
|
||||
data: query,
|
||||
success: function (msg) {
|
||||
if(t) {
|
||||
if(t == ':eval') eval(msg);
|
||||
else if(typeof t == 'string') $("#" + t).html(msg);
|
||||
else t(msg);
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
ajax_fields: function (target) {
|
||||
/*
|
||||
*this attaches something to a newly loaded fragment/page
|
||||
* Ideally all events should be bound to the document, so we can avoid calling
|
||||
* this over and over... all will be bound to the document
|
||||
*/
|
||||
/*adds btn class to buttons*/
|
||||
$('button', target).addClass('btn').addClass('btn-default');
|
||||
$('form input[type="submit"], form input[type="button"]', target).addClass('btn').addClass('btn-default');
|
||||
/* javascript for PasswordWidget*/
|
||||
$('input[type=password][data-w2p_entropy]', target).each(function () {
|
||||
web2py.validate_entropy($(this));
|
||||
});
|
||||
/* javascript for ListWidget*/
|
||||
$('ul.w2p_list', target).each(function () {
|
||||
function pe(ul, e) {
|
||||
var new_line = ml(ul);
|
||||
rel(ul);
|
||||
if($(e.target).parent().is(':visible')) {
|
||||
/* make sure we didn't delete the element before we insert after */
|
||||
new_line.insertAfter($(e.target).parent());
|
||||
} else {
|
||||
/* the line we clicked on was deleted, just add to end of list */
|
||||
new_line.appendTo(ul);
|
||||
}
|
||||
new_line.find(":text").focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
function rl(ul, e) {
|
||||
if($(ul).children().length > 1) {
|
||||
/* only remove if we have more than 1 item so the list is never empty */
|
||||
$(e.target).parent().remove();
|
||||
}
|
||||
}
|
||||
|
||||
function ml(ul) {
|
||||
/* clone the first field */
|
||||
var line = $(ul).find("li:first").clone(true);
|
||||
line.find(':text').val('');
|
||||
return line;
|
||||
}
|
||||
|
||||
function rel(ul) {
|
||||
/* keep only as many as needed*/
|
||||
$(ul).find("li").each(function () {
|
||||
var trimmed = $.trim($(this.firstChild).val());
|
||||
if(trimmed == '') $(this).remove();
|
||||
else $(this.firstChild).val(trimmed);
|
||||
});
|
||||
}
|
||||
var ul = this;
|
||||
$(ul).find(":text").after('<a href="#">+</a> <a href="#">-</a>').keypress(function (e) {
|
||||
return(e.which == 13) ? pe(ul, e) : true;
|
||||
}).next().click(function (e) {
|
||||
pe(ul, e);
|
||||
e.preventDefault();
|
||||
}).next().click(function (e) {
|
||||
rl(ul, e);
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
},
|
||||
ajax_init: function (target) {
|
||||
/*called whenever a fragment gets loaded */
|
||||
$('.hidden', target).hide();
|
||||
web2py.manage_errors(target);
|
||||
web2py.ajax_fields(target);
|
||||
web2py.show_if_handler(target);
|
||||
web2py.component_handler(target);
|
||||
},
|
||||
/* manage errors in forms */
|
||||
manage_errors: function (target) {
|
||||
$('.error', target).hide().slideDown('slow');
|
||||
},
|
||||
after_ajax: function (xhr) {
|
||||
/* called whenever an ajax request completes */
|
||||
var command = xhr.getResponseHeader('web2py-component-command');
|
||||
var flash = xhr.getResponseHeader('web2py-component-flash');
|
||||
if(command !== null) {
|
||||
eval(decodeURIComponent(command));
|
||||
}
|
||||
if(flash) {
|
||||
web2py.flash(decodeURIComponent(flash))
|
||||
}
|
||||
},
|
||||
event_handlers: function () {
|
||||
/*
|
||||
* This is called once for page
|
||||
* Ideally it should bound all the things that are needed
|
||||
* and require no dom manipulations
|
||||
*/
|
||||
var doc = $(document);
|
||||
doc.on('click', '.flash', function (e) {
|
||||
var t = $(this);
|
||||
if(t.css('top') == '0px') t.slideUp('slow');
|
||||
else t.fadeOut();
|
||||
});
|
||||
doc.on('keyup', 'input.integer', function () {
|
||||
var nvalue = this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g, '').reverse();
|
||||
if(this.value!=nvalue) this.value = nvalue;
|
||||
});
|
||||
doc.on('keyup', 'input.double, input.decimal', function () {
|
||||
var nvalue = this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g, '').reverse();
|
||||
if(this.value!=nvalue) this.value = nvalue;
|
||||
});
|
||||
var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?";
|
||||
doc.on('click', "input[type='checkbox'].delete", function () {
|
||||
if(this.checked)
|
||||
if(!web2py.confirm(confirm_message)) this.checked = false;
|
||||
});
|
||||
var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S";
|
||||
doc.on('click', "input.datetime", function () {
|
||||
var tformat = $(this).data('w2p_datetime_format');
|
||||
var active = $(this).data('w2p_datetime');
|
||||
var format = (typeof tformat != 'undefined') ? tformat : datetime_format;
|
||||
if(active === undefined) {
|
||||
Calendar.setup({
|
||||
inputField: this,
|
||||
ifFormat: format,
|
||||
showsTime: true,
|
||||
timeFormat: "24"
|
||||
});
|
||||
$(this).attr('autocomplete', 'off');
|
||||
$(this).data('w2p_datetime', 1);
|
||||
$(this).trigger('click');
|
||||
}
|
||||
});
|
||||
var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d";
|
||||
doc.on('click', "input.date", function () {
|
||||
var tformat = $(this).data('w2p_date_format');
|
||||
var active = $(this).data('w2p_date');
|
||||
var format = (typeof tformat != 'undefined') ? tformat : date_format;
|
||||
if(active === undefined) {
|
||||
Calendar.setup({
|
||||
inputField: this,
|
||||
ifFormat: format,
|
||||
showsTime: false
|
||||
});
|
||||
$(this).data('w2p_date', 1);
|
||||
$(this).attr('autocomplete', 'off');
|
||||
$(this).trigger('click');
|
||||
}
|
||||
});
|
||||
doc.on('focus', "input.time", function () {
|
||||
var active = $(this).data('w2p_time');
|
||||
if(active === undefined) {
|
||||
$(this).timeEntry({
|
||||
spinnerImage: ''
|
||||
}).attr('autocomplete', 'off');
|
||||
$(this).data('w2p_time', 1);
|
||||
}
|
||||
});
|
||||
/* help preventing double form submission for normal form (not LOADed) */
|
||||
$(doc).on('submit', 'form', function () {
|
||||
var submit_button = $(this).find(web2py.formInputClickSelector);
|
||||
web2py.disableElement(submit_button);
|
||||
});
|
||||
doc.ajaxSuccess(function (e, xhr) {
|
||||
var redirect = xhr.getResponseHeader('web2py-redirect-location');
|
||||
if(redirect !== null) {
|
||||
window.location = redirect;
|
||||
};
|
||||
/* run this here only if this Ajax request is NOT for a web2py component. */
|
||||
if(xhr.getResponseHeader('web2py-component-content') == null) {
|
||||
web2py.after_ajax(xhr);
|
||||
};
|
||||
});
|
||||
|
||||
doc.ajaxError(function (e, xhr, settings, exception) {
|
||||
/*personally I don't like it.
|
||||
*if there's an error it it flashed and can be removed
|
||||
*as any other message
|
||||
*doc.off('click', '.flash')
|
||||
*/
|
||||
switch(xhr.status) {
|
||||
case 500:
|
||||
web2py.flash(ajax_error_500);
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
trap_form: function (action, target) {
|
||||
/* traps any LOADed form */
|
||||
$('#' + target + ' form').each(function (i) {
|
||||
var form = $(this);
|
||||
if (form.hasClass('no_trap')) {
|
||||
return;
|
||||
}
|
||||
|
||||
form.attr('data-w2p_target', target);
|
||||
var url = form.attr('action');
|
||||
|
||||
if ((url === "") || (url === "#")) {
|
||||
/* form has no action. Use component url. */
|
||||
url = action;
|
||||
}
|
||||
|
||||
form.submit(function (e) {
|
||||
web2py.disableElement(form.find(web2py.formInputClickSelector));
|
||||
web2py.hide_flash();
|
||||
web2py.ajax_page('post', url, form.serialize(), target, form);
|
||||
e.preventDefault();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
ajax_page: function (method, action, data, target, element) {
|
||||
/* element is a new parameter, but should be put be put in front */
|
||||
if(element == undefined) element = $(document);
|
||||
/* if target is not there, fill it with something that there isn't in the page*/
|
||||
if(target == undefined || target == '') target = 'w2p_none';
|
||||
if(web2py.fire(element, 'ajax:before', null, target )) { /*test a usecase, should stop here if returns false */
|
||||
$.ajax({
|
||||
'type': method,
|
||||
'url': action,
|
||||
'data': data,
|
||||
'beforeSend': function (xhr, settings) {
|
||||
xhr.setRequestHeader('web2py-component-location', document.location);
|
||||
xhr.setRequestHeader('web2py-component-element', target);
|
||||
return web2py.fire(element, 'ajax:beforeSend', [xhr, settings], target); //test a usecase, should stop here if returns false
|
||||
},
|
||||
'success': function (data, status, xhr) {
|
||||
/*bummer for form submissions....the element is not there after complete
|
||||
*because it gets replaced by the new response....
|
||||
*/
|
||||
web2py.fire(element, 'ajax:success', [data, status, xhr], target);
|
||||
},
|
||||
'error': function (xhr, status, error) {
|
||||
/*bummer for form submissions....in addition to the element being not there after
|
||||
*complete because it gets replaced by the new response, standard form
|
||||
*handling just returns the same status code for good and bad
|
||||
*form submissions (i.e. that triggered a validator error)
|
||||
*/
|
||||
web2py.fire(element, 'ajax:error', [xhr, status, error], target);
|
||||
},
|
||||
'complete': function (xhr, status) {
|
||||
web2py.fire(element, 'ajax:complete', [xhr, status], target);
|
||||
web2py.updatePage(xhr, target); /* Parse and load the html received */
|
||||
web2py.trap_form(action, target);
|
||||
web2py.ajax_init('#' + target);
|
||||
web2py.after_ajax(xhr);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
component: function (action, target, timeout, times, el) {
|
||||
/* element is a new parameter, but should be put in front */
|
||||
$(function () {
|
||||
var jelement = $("#" + target);
|
||||
var element = jelement.get(0);
|
||||
var statement = "jQuery('#" + target + "').get(0).reload();";
|
||||
element.reload = function () {
|
||||
/* Continue if times is Infinity or
|
||||
* the times limit is not reached
|
||||
*/
|
||||
if(element.reload_check()) {
|
||||
web2py.ajax_page('get', action, null, target, el);
|
||||
}
|
||||
};
|
||||
/* Method to check timing limit */
|
||||
element.reload_check = function () {
|
||||
if(jelement.hasClass('w2p_component_stop')) {
|
||||
clearInterval(this.timing);
|
||||
return false;
|
||||
}
|
||||
if(this.reload_counter == Infinity) {
|
||||
return true;
|
||||
} else {
|
||||
if(!isNaN(this.reload_counter)) {
|
||||
this.reload_counter -= 1;
|
||||
if(this.reload_counter < 0) {
|
||||
if(!this.run_once) {
|
||||
clearInterval(this.timing);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
if(!isNaN(timeout)) {
|
||||
element.timeout = timeout;
|
||||
element.reload_counter = times;
|
||||
if(times > 1) {
|
||||
/* Multiple or infinite reload
|
||||
* Run first iteration
|
||||
*/
|
||||
web2py.ajax_page('get', action, null, target, el);
|
||||
element.run_once = false;
|
||||
element.timing = setInterval(statement, timeout);
|
||||
element.reload_counter -= 1;
|
||||
} else if(times == 1) {
|
||||
/* Run once with timeout */
|
||||
element.run_once = true;
|
||||
element.setTimeout = setTimeout;
|
||||
element.timing = setTimeout(statement, timeout);
|
||||
}
|
||||
} else {
|
||||
/* run once (no timeout specified) */
|
||||
element.reload_counter = Infinity;
|
||||
web2py.ajax_page('get', action, null, target, el);
|
||||
}
|
||||
});
|
||||
},
|
||||
updatePage: function (xhr, target) {
|
||||
var t = $('#' + target);
|
||||
var html = $.parseHTML(xhr.responseText, document, true);
|
||||
var title_elements = $(html).filter('title').add($(html).find('title'));
|
||||
var title = title_elements.last().text();
|
||||
if (title) {
|
||||
title_elements.remove(); /* Remove any title elements from the response */
|
||||
document.title = $.trim(title); /* Set the new document title */
|
||||
}
|
||||
var content = xhr.getResponseHeader('web2py-component-content');
|
||||
if(content == 'prepend') t.prepend(xhr.responseText);
|
||||
else if(content == 'append') t.append(xhr.responseText);
|
||||
else if(content != 'hide') t.html(html);
|
||||
},
|
||||
calc_entropy: function (mystring) {
|
||||
/* calculate a simple entropy for a given string */
|
||||
var csets = new Array(
|
||||
'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
||||
'0123456789', '!@#$\%^&*()', '~`-_=+[]{}\|;:\'",.<>?/',
|
||||
'0123456789abcdefghijklmnopqrstuvwxyz');
|
||||
var score = 0,
|
||||
other = {}, seen = {}, lastset = null,
|
||||
mystringlist = mystring.split('');
|
||||
for(var i = 0; i < mystringlist.length; i++) { /* classify this character */
|
||||
var c = mystringlist[i],
|
||||
inset = 5;
|
||||
for(var j = 0; j < csets.length; j++)
|
||||
if(csets[j].indexOf(c) != -1) {
|
||||
inset = j;
|
||||
break;
|
||||
}
|
||||
/*calculate effect of character on alphabet size */
|
||||
if(!(inset in seen)) {
|
||||
seen[inset] = 1;
|
||||
score += csets[inset].length;
|
||||
} else if(!(c in other)) {
|
||||
score += 1;
|
||||
other[c] = 1;
|
||||
}
|
||||
if(inset != lastset) {
|
||||
score += 1;
|
||||
lastset = inset;
|
||||
}
|
||||
}
|
||||
var entropy = mystring.length * Math.log(score) / 0.6931471805599453;
|
||||
return Math.round(entropy * 100) / 100
|
||||
},
|
||||
validate_entropy: function (myfield, req_entropy) {
|
||||
if(myfield.data('w2p_entropy') != undefined) req_entropy = myfield.data('w2p_entropy');
|
||||
var validator = function () {
|
||||
var v = (web2py.calc_entropy(myfield.val()) || 0) / req_entropy;
|
||||
var r = 0,
|
||||
g = 0,
|
||||
b = 0,
|
||||
rs = function (x) {
|
||||
return Math.round(x * 15).toString(16)
|
||||
};
|
||||
if(v <= 0.5) {
|
||||
r = 1.0;
|
||||
g = 2.0 * v;
|
||||
} else {
|
||||
r = (1.0 - 2.0 * (Math.max(v, 0) - 0.5));
|
||||
g = 1.0;
|
||||
}
|
||||
var color = '#' + rs(r) + rs(g) + rs(b);
|
||||
myfield.css('background-color', color);
|
||||
entropy_callback = myfield.data('entropy_callback');
|
||||
if(entropy_callback) entropy_callback(v);
|
||||
}
|
||||
if(!myfield.hasClass('entropy_check')) myfield.on('keyup', validator).on('keydown', validator).addClass('entropy_check');
|
||||
},
|
||||
web2py_websocket: function (url, onmessage, onopen, onclose) {
|
||||
if("WebSocket" in window) {
|
||||
var ws = new WebSocket(url);
|
||||
ws.onopen = onopen ? onopen : (function () {});
|
||||
ws.onmessage = onmessage;
|
||||
ws.onclose = onclose ? onclose : (function () {});
|
||||
return true; /* supported */
|
||||
} else return false; /* not supported */
|
||||
},
|
||||
/* new from here */
|
||||
/* Form input elements bound by web2py.js */
|
||||
formInputClickSelector: 'input[type=submit]:not([name]), input[type=image]:not([name]), button[type=submit]:not([name]), button:not([type]):not([name])',
|
||||
/* Form input elements disabled during form submission */
|
||||
disableSelector: 'input, button, textarea, select',
|
||||
/* Form input elements re-enabled after form submission */
|
||||
enableSelector: 'input:disabled, button:disabled, textarea:disabled, select:disabled',
|
||||
/* Triggers an event on an element and returns false if the event result is false */
|
||||
fire: function (obj, type, data, target) {
|
||||
var event = $.Event(type, {'containerTarget': $('#' + target)[0]});
|
||||
obj.trigger(event, data);
|
||||
return event.result !== false;
|
||||
},
|
||||
/* Helper function, needed to provide consistent behavior in IE */
|
||||
stopEverything: function (e) {
|
||||
$(e.target).trigger('w2p:everythingStopped');
|
||||
e.stopImmediatePropagation();
|
||||
return false;
|
||||
},
|
||||
confirm: function (message) {
|
||||
return confirm(message);
|
||||
},
|
||||
/* replace element's html with the 'data-disable-with' after storing original html
|
||||
* and prevent clicking on it */
|
||||
disableElement: function (el) {
|
||||
el.addClass('disabled');
|
||||
var method = el.prop('type') == 'submit' ? 'val' : 'html';
|
||||
var disable_with_message = (typeof w2p_ajax_disable_with_message != 'undefined') ? w2p_ajax_disable_with_message : "Working...";
|
||||
/*store enabled state if not already disabled */
|
||||
if (el.data('w2p:enable-with') === undefined) {
|
||||
el.data('w2p:enable-with', el[method]());
|
||||
}
|
||||
/*if you don't want to see "working..." on buttons, replace the following
|
||||
* two lines with this one
|
||||
* el.data('w2p_disable_with', el[method]());
|
||||
*/
|
||||
if((el.data('w2p_disable_with') == 'default') || (el.data('w2p_disable_with') === undefined)) {
|
||||
el.data('w2p_disable_with', disable_with_message);
|
||||
}
|
||||
|
||||
/* set to disabled state*/
|
||||
el[method](el.data('w2p_disable_with'));
|
||||
|
||||
el.bind('click.w2pDisable', function (e) { /* prevent further clicking*/
|
||||
return web2py.stopEverything(e);
|
||||
});
|
||||
},
|
||||
|
||||
/* restore element to its original state which was disabled by 'disableElement' above*/
|
||||
enableElement: function (el) {
|
||||
var method = el.prop('type') == 'submit' ? 'val' : 'html';
|
||||
if(el.data('w2p:enable-with') !== undefined) {
|
||||
/* set to old enabled state */
|
||||
el[method](el.data('w2p:enable-with'));
|
||||
el.removeData('w2p:enable-with');
|
||||
}
|
||||
el.removeClass('disabled');
|
||||
el.unbind('click.w2pDisable');
|
||||
},
|
||||
/*convenience wrapper, internal use only */
|
||||
simple_component: function (action, target, element) {
|
||||
web2py.component(action, target, 0, 1, element);
|
||||
},
|
||||
/*helper for flash messages*/
|
||||
flash: function (message, status) {
|
||||
var flash = $('.flash');
|
||||
web2py.hide_flash();
|
||||
flash.html(message).addClass(status);
|
||||
if(flash.html()) flash.append('<span id="closeflash"> × </span>').slideDown();
|
||||
},
|
||||
hide_flash: function () {
|
||||
$('.flash').fadeOut(0).html('');
|
||||
},
|
||||
show_if_handler: function (target) {
|
||||
var triggers = {};
|
||||
var show_if = function () {
|
||||
var t = $(this);
|
||||
var id = t.attr('id');
|
||||
t.attr('value', t.val());
|
||||
for(var k = 0; k < triggers[id].length; k++) {
|
||||
var dep = $('#' + triggers[id][k], target);
|
||||
var tr = $('#' + triggers[id][k] + '__row', target);
|
||||
if(t.is(dep.attr('data-show-if'))) tr.slideDown();
|
||||
else tr.hide();
|
||||
}
|
||||
};
|
||||
$('[data-show-trigger]', target).each(function () {
|
||||
var name = $(this).attr('data-show-trigger');
|
||||
if(!triggers[name]) triggers[name] = [];
|
||||
triggers[name].push($(this).attr('id'));
|
||||
});
|
||||
for(var name in triggers) {
|
||||
$('#' + name, target).change(show_if).keyup(show_if);
|
||||
show_if.call($('#' + name, target));
|
||||
};
|
||||
},
|
||||
component_handler: function (target) {
|
||||
$('div[data-w2p_remote]', target).each(function () {
|
||||
var remote, times, timeout, target;
|
||||
var el = $(this);
|
||||
remote = el.data('w2p_remote');
|
||||
times = el.data('w2p_times');
|
||||
timeout = el.data('w2p_timeout');
|
||||
target = el.attr('id');
|
||||
web2py.component(remote, target, timeout, times, $(this));
|
||||
})
|
||||
},
|
||||
a_handler: function (el, e) {
|
||||
e.preventDefault();
|
||||
var method = el.data('w2p_method');
|
||||
var action = el.attr('href');
|
||||
var target = el.data('w2p_target');
|
||||
var confirm_message = el.data('w2p_confirm');
|
||||
|
||||
var pre_call = el.data('w2p_pre_call');
|
||||
if(pre_call != undefined) {
|
||||
eval(pre_call);
|
||||
}
|
||||
if(confirm_message != undefined) {
|
||||
if(confirm_message == 'default') confirm_message = w2p_ajax_confirm_message || 'Are you sure you want to delete this object?';
|
||||
if(!web2py.confirm(confirm_message)) {
|
||||
web2py.stopEverything(e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(target == undefined) {
|
||||
if(method == 'GET') {
|
||||
web2py.ajax_page('get', action, [], '', el);
|
||||
} else if(method == 'POST') {
|
||||
web2py.ajax_page('post', action, [], '', el);
|
||||
}
|
||||
} else {
|
||||
if(method == 'GET') {
|
||||
web2py.ajax_page('get', action, [], target, el);
|
||||
} else if(method == 'POST') {
|
||||
web2py.ajax_page('post', action, [], target, el);
|
||||
}
|
||||
}
|
||||
},
|
||||
a_handlers: function () {
|
||||
var el = $(document);
|
||||
el.on('click', 'a[data-w2p_method]', function (e) {
|
||||
web2py.a_handler($(this), e);
|
||||
});
|
||||
/* removal of element should happen only on success */
|
||||
el.on('ajax:success', 'a[data-w2p_method][data-w2p_remove]', function (e) {
|
||||
var el = $(this);
|
||||
var toremove = el.data('w2p_remove');
|
||||
if(toremove != undefined) {
|
||||
toremove = el.closest(toremove);
|
||||
if(!toremove.length) {
|
||||
/*this enables removal of whatever selector if a closest is not found */
|
||||
toremove = $(toremove);
|
||||
}
|
||||
toremove.remove();
|
||||
}
|
||||
});
|
||||
el.on('ajax:beforeSend', 'a[data-w2p_method][data-w2p_disable_with]', function (e) {
|
||||
web2py.disableElement($(this));
|
||||
});
|
||||
/*re-enable click on completion*/
|
||||
el.on('ajax:complete', 'a[data-w2p_method][data-w2p_disable_with]', function (e) {
|
||||
web2py.enableElement($(this));
|
||||
});
|
||||
},
|
||||
/* Disables form elements:
|
||||
- Caches element value in 'ujs:enable-with' data store
|
||||
- Replaces element text with value of 'data-disable-with' attribute
|
||||
- Sets disabled property to true
|
||||
*/
|
||||
disableFormElements: function (form) {
|
||||
form.find(web2py.disableSelector).each(function () {
|
||||
var element = $(this),
|
||||
method = element.is('button') ? 'html' : 'val';
|
||||
var disable_with = element.data('w2p_disable_with');
|
||||
if(disable_with == undefined) {
|
||||
element.data('w2p_disable_with', element[method]())
|
||||
}
|
||||
if (element.data('w2p:enable-with') === undefined) {
|
||||
element.data('w2p:enable-with', element[method]());
|
||||
}
|
||||
element[method](element.data('w2p_disable_with'));
|
||||
element.prop('disabled', true);
|
||||
});
|
||||
},
|
||||
|
||||
/* Re-enables disabled form elements:
|
||||
- Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`)
|
||||
- Sets disabled property to false
|
||||
*/
|
||||
enableFormElements: function (form) {
|
||||
form.find(web2py.enableSelector).each(function () {
|
||||
var element = $(this),
|
||||
method = element.is('button') ? 'html' : 'val';
|
||||
if(element.data('w2p:enable-with')) {
|
||||
element[method](element.data('w2p:enable-with'));
|
||||
element.removeData('w2p:enable-with');
|
||||
}
|
||||
element.prop('disabled', false);
|
||||
});
|
||||
},
|
||||
form_handlers: function () {
|
||||
var el = $(document);
|
||||
el.on('ajax:beforeSend', 'form[data-w2p_target]', function (e) {
|
||||
web2py.disableFormElements($(this));
|
||||
});
|
||||
el.on('ajax:complete', 'form[data-w2p_target]', function (e) {
|
||||
web2py.enableFormElements($(this));
|
||||
});
|
||||
},
|
||||
/* Invalidate and force reload of a web2py component
|
||||
*/
|
||||
invalidate: function(target) {
|
||||
$('div[data-w2p_remote]', target).each(function () {
|
||||
var el = $('#' + $(this).attr('id')).get(0);
|
||||
if (el.timing !== undefined) { // Block triggering regular routines
|
||||
clearInterval(el.timing);
|
||||
}
|
||||
});
|
||||
$.web2py.component_handler(target);
|
||||
},
|
||||
}
|
||||
|
||||
/*end of functions */
|
||||
/*main hook*/
|
||||
$(function () {
|
||||
var flash = $('.flash');
|
||||
flash.hide();
|
||||
if(flash.html()) web2py.flash(flash.html());
|
||||
web2py.ajax_init(document);
|
||||
web2py.event_handlers();
|
||||
web2py.a_handlers();
|
||||
web2py.form_handlers();
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
||||
/* compatibility code - start */
|
||||
ajax = jQuery.web2py.ajax;
|
||||
web2py_component = jQuery.web2py.component;
|
||||
web2py_websocket = jQuery.web2py.web2py_websocket;
|
||||
web2py_ajax_page = jQuery.web2py.ajax_page;
|
||||
/*needed for IS_STRONG(entropy)*/
|
||||
web2py_validate_entropy = jQuery.web2py.validate_entropy;
|
||||
/*needed for crud.search and SQLFORM.grid's search*/
|
||||
web2py_ajax_fields = jQuery.web2py.ajax_fields;
|
||||
/*used for LOAD(ajax=False)*/
|
||||
web2py_trap_form = jQuery.web2py.trap_form;
|
||||
|
||||
/*undocumented - rare*/
|
||||
popup = jQuery.web2py.popup;
|
||||
collapse = jQuery.web2py.collapse;
|
||||
fade = jQuery.web2py.fade;
|
||||
|
||||
/* internals - shouldn't be needed
|
||||
web2py_ajax_init = jQuery.web2py.ajax_init;
|
||||
web2py_event_handlers = jQuery.web2py.event_handlers;
|
||||
web2py_trap_link = jQuery.web2py.trap_link;
|
||||
web2py_calc_entropy = jQuery.web2py.calc_entropy;
|
||||
*/
|
||||
/* compatibility code - end*/
|
||||
|
||||
Reference in New Issue
Block a user