diff --git a/VERSION b/VERSION index 3fd96e9b..4f0d04a4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.4 (2012-02-02 16:35:38) stable +Version 1.99.4 (2012-02-03 11:29:23) stable diff --git a/applications/admin/static/js/web2py.js b/applications/admin/static/js/web2py.js index ec9599fc..64b0f3a1 100644 --- a/applications/admin/static/js/web2py.js +++ b/applications/admin/static/js/web2py.js @@ -23,10 +23,6 @@ function ajax(u,s,t) { String.prototype.reverse = function () { return this.split('').reverse().join('');}; function web2py_ajax_fields(target) { - jQuery('input.integer', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); - jQuery('input.double,input.decimal', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); - var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; - jQuery("input[type='checkbox'].delete", target).live('click',function(){ if(this.checked) if(!confirm(confirm_message)) this.checked=false; }); var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d"; var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S"; jQuery("input.date",target).each(function() {Calendar.setup({inputField:this, ifFormat:date_format, showsTime:false });}); @@ -38,17 +34,26 @@ function web2py_ajax_fields(target) { function web2py_ajax_init(target) { jQuery('.hidden', target).hide(); jQuery('.error', target).hide().slideDown('slow'); - jQuery('.flash', target).click(function(e) { jQuery(this).fadeOut('slow'); e.preventDefault(); }); - // jQuery('input[type=submit]').click(function(){var t=jQuery(this);t.hide();t.after('')}); web2py_ajax_fields(target); }; +function web2py_event_handlers() { + var doc = jQuery(document) + doc.on('click', '.flash', function(e){jQuery(this).fadeOut('slow'); e.preventDefault();}); + doc.on('keyup', 'input.integer', function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); + doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); + 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(!confirm(confirm_message)) this.checked=false;}); +}; + jQuery(function() { var flash = jQuery('.flash'); flash.hide(); if(flash.html()) flash.slideDown(); web2py_ajax_init(document); + web2py_event_handlers(); }); + function web2py_trap_form(action,target) { jQuery('#'+target+' form').each(function(i){ var form=jQuery(this); @@ -60,6 +65,7 @@ function web2py_trap_form(action,target) { }); }); } + function web2py_trap_link(target) { jQuery('#'+target+' a.w2p_trap').each(function(i){ var link=jQuery(this); @@ -70,11 +76,12 @@ function web2py_trap_link(target) { }); }); } -function web2py_ajax_page(method,action,data,target) { - jQuery.ajax({'type':method,'url':action,'data':data, + +function web2py_ajax_page(method, action, data, target) { + jQuery.ajax({'type':method, 'url':action, 'data':data, 'beforeSend':function(xhr) { - xhr.setRequestHeader('web2py-component-location',document.location); - xhr.setRequestHeader('web2py-component-element',target);}, + xhr.setRequestHeader('web2py-component-location', document.location); + xhr.setRequestHeader('web2py-component-element', target);}, 'complete':function(xhr,text){ var html=xhr.responseText; var content=xhr.getResponseHeader('web2py-component-content'); @@ -94,9 +101,11 @@ function web2py_ajax_page(method,action,data,target) { } }); } + function web2py_component(action,target) { - jQuery(function(){ web2py_ajax_page('get',action,null,target); }); + jQuery(function(){web2py_ajax_page('get',action,null,target);}); } + function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { var ws = new WebSocket(url); diff --git a/applications/examples/private/content/en/default/documentation/more.markmin b/applications/examples/private/content/en/default/documentation/more.markmin index 81a55093..854e076d 100644 --- a/applications/examples/private/content/en/default/documentation/more.markmin +++ b/applications/examples/private/content/en/default/documentation/more.markmin @@ -6,9 +6,9 @@ - [[Twitter http://twitter.com/#!/web2py]] - [[User Voice http://web2py.uservoice.com/ popup]] -#### Learning -- [[Interactive Demo http://www.web2py.com/demo_admin popup]] -- [[Quick Examples http://www.web2py.com/examples/default/examples]] +#### Learning and Demos +- [[Admin Demo http://www.web2py.com/demo_admin popup]] (web-based IDE) +- [[Welcome App Demo http://www.web2py.com/welcome]] (scaffolding application) - [[Videos http://www.web2py.com/examples/default/videos/]] - [[FAQ http://www.web2py.com/AlterEgo popup]] diff --git a/applications/examples/private/content/en/default/documentation/official.markmin b/applications/examples/private/content/en/default/documentation/official.markmin index 45dd1dbe..76303290 100644 --- a/applications/examples/private/content/en/default/documentation/official.markmin +++ b/applications/examples/private/content/en/default/documentation/official.markmin @@ -3,5 +3,7 @@ - [[**web2py Online Book (english)** http://web2py.com/book popup]] - [[web2py Online Book (spanish) http://www.latinuxpress.com/books/drafts/web2py/ popup]] - [[Buy E-book/Printed Version http://stores.lulu.com/web2py popup]] +- [[web2py Application Development Cookbook http://www.packtpub.com/web2py-application-development-recipes-to-master-python-web-framework-cookbook/book?utm_source=web2py.com&utm_medium=link&utm_content=pod&utm_campaign=mdb_009617]] +- [[Quick Examples http://www.web2py.com/examples/default/examples]] - [[API http://web2py.com/book/default/chapter/04#API popup]] - [[Epydoc (source code documentation) http://www.web2py.com/examples/static/epydoc/index.html popup]] diff --git a/applications/examples/private/content/en/default/what/whyweb2py.markmin b/applications/examples/private/content/en/default/what/whyweb2py.markmin index bb323fed..7f68bc0c 100644 --- a/applications/examples/private/content/en/default/what/whyweb2py.markmin +++ b/applications/examples/private/content/en/default/what/whyweb2py.markmin @@ -9,7 +9,7 @@ - **Secure** [[It prevents the most common types of vulnerabilities http://web2py.com/examples/default/security]] including Cross Site Scripting, Injection Flaws, and Malicious File Execution. - **Enforces good Software Engineering practices** (Model-View-Controller design, Server-side form validation, postbacks) that make the code more readable, scalable, and maintainable. - **Speaks multiple protocols** HTML/XML, RSS/ATOM, RTF, PDF, JSON, AJAX, XML-RPC, CSV, REST, WIKI, Flash/AMF, and Linked Data (RDF). -- **Includes** a SSL-enabled and streaming-capable web server, a relational database, a web-based integrated development environment and web-based management interface, a Database Abstraction Layer that writes SQL for you in real time, internationalization support, multiple authentication methods, role based access control, an error logging and ticketing system, multiple caching methods for scalability, the jQuery library for AJAX and effects. +- **Includes** an SSL-enabled and streaming-capable web server, a relational database, a web-based integrated development environment and web-based management interface, a Database Abstraction Layer that writes SQL for you in real time, internationalization support, multiple authentication methods, role based access control, an error logging and ticketing system, multiple caching methods for scalability, the jQuery library for AJAX and effects, and a [[scaffolding application http://www.web2py.com/welcome]] to jumpstart development. The best way to understand web2py is to try it. You can try it online [[here http://www.web2py.com/demo_admin]] (this online version is identical to the actual web2py although some functions are disabled for security reasons). diff --git a/applications/examples/static/css/examples.css b/applications/examples/static/css/examples.css index 32d71724..707211b6 100644 --- a/applications/examples/static/css/examples.css +++ b/applications/examples/static/css/examples.css @@ -37,7 +37,7 @@ sup { line-height: 2em; vertical-align: top; } -ul { list-style: circle outside;} +ul { list-style: circle outside; padding-left: 30px;} .frame { border: 3px solid #959595; diff --git a/applications/examples/static/js/web2py.js b/applications/examples/static/js/web2py.js index ec9599fc..64b0f3a1 100644 --- a/applications/examples/static/js/web2py.js +++ b/applications/examples/static/js/web2py.js @@ -23,10 +23,6 @@ function ajax(u,s,t) { String.prototype.reverse = function () { return this.split('').reverse().join('');}; function web2py_ajax_fields(target) { - jQuery('input.integer', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); - jQuery('input.double,input.decimal', target).keyup(function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); - var confirm_message = (typeof w2p_ajax_confirm_message != 'undefined') ? w2p_ajax_confirm_message : "Are you sure you want to delete this object?"; - jQuery("input[type='checkbox'].delete", target).live('click',function(){ if(this.checked) if(!confirm(confirm_message)) this.checked=false; }); var date_format = (typeof w2p_ajax_date_format != 'undefined') ? w2p_ajax_date_format : "%Y-%m-%d"; var datetime_format = (typeof w2p_ajax_datetime_format != 'undefined') ? w2p_ajax_datetime_format : "%Y-%m-%d %H:%M:%S"; jQuery("input.date",target).each(function() {Calendar.setup({inputField:this, ifFormat:date_format, showsTime:false });}); @@ -38,17 +34,26 @@ function web2py_ajax_fields(target) { function web2py_ajax_init(target) { jQuery('.hidden', target).hide(); jQuery('.error', target).hide().slideDown('slow'); - jQuery('.flash', target).click(function(e) { jQuery(this).fadeOut('slow'); e.preventDefault(); }); - // jQuery('input[type=submit]').click(function(){var t=jQuery(this);t.hide();t.after('')}); web2py_ajax_fields(target); }; +function web2py_event_handlers() { + var doc = jQuery(document) + doc.on('click', '.flash', function(e){jQuery(this).fadeOut('slow'); e.preventDefault();}); + doc.on('keyup', 'input.integer', function(){this.value=this.value.reverse().replace(/[^0-9\-]|\-(?=.)/g,'').reverse();}); + doc.on('keyup', 'input.double, input.decimal', function(){this.value=this.value.reverse().replace(/[^0-9\-\.,]|[\-](?=.)|[\.,](?=[0-9]*[\.,])/g,'').reverse();}); + 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(!confirm(confirm_message)) this.checked=false;}); +}; + jQuery(function() { var flash = jQuery('.flash'); flash.hide(); if(flash.html()) flash.slideDown(); web2py_ajax_init(document); + web2py_event_handlers(); }); + function web2py_trap_form(action,target) { jQuery('#'+target+' form').each(function(i){ var form=jQuery(this); @@ -60,6 +65,7 @@ function web2py_trap_form(action,target) { }); }); } + function web2py_trap_link(target) { jQuery('#'+target+' a.w2p_trap').each(function(i){ var link=jQuery(this); @@ -70,11 +76,12 @@ function web2py_trap_link(target) { }); }); } -function web2py_ajax_page(method,action,data,target) { - jQuery.ajax({'type':method,'url':action,'data':data, + +function web2py_ajax_page(method, action, data, target) { + jQuery.ajax({'type':method, 'url':action, 'data':data, 'beforeSend':function(xhr) { - xhr.setRequestHeader('web2py-component-location',document.location); - xhr.setRequestHeader('web2py-component-element',target);}, + xhr.setRequestHeader('web2py-component-location', document.location); + xhr.setRequestHeader('web2py-component-element', target);}, 'complete':function(xhr,text){ var html=xhr.responseText; var content=xhr.getResponseHeader('web2py-component-content'); @@ -94,9 +101,11 @@ function web2py_ajax_page(method,action,data,target) { } }); } + function web2py_component(action,target) { - jQuery(function(){ web2py_ajax_page('get',action,null,target); }); + jQuery(function(){web2py_ajax_page('get',action,null,target);}); } + function web2py_comet(url,onmessage,onopen,onclose) { if ("WebSocket" in window) { var ws = new WebSocket(url); diff --git a/applications/examples/views/default/index.html b/applications/examples/views/default/index.html index e587719f..46783d29 100644 --- a/applications/examples/views/default/index.html +++ b/applications/examples/views/default/index.html @@ -39,7 +39,7 @@ Current version: {{="%s.%s.%s (%s) %s" % request.env.web2py_version}}
Start with some quick examples, then read the reference manual, watch videos, and join a user group for discussion. Take advantage of the layouts, plugins, and recipes.
+Start with some quick examples, then read the manual, watch videos, and join a user group for discussion. Take advantage of the layouts, plugins, appliances, and recipes.