p.coords[0]?"swipeleft":"swiperight");
+m=p=b})})}};(function(a,b){function c(){var a=f();a!==e&&(e=a,d.trigger("orientationchange"))}var d=a(b),f,e;a.event.special.orientationchange={setup:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;e=f();d.bind("throttledresize",c)},teardown:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;d.unbind("throttledresize",c)},add:function(a){var b=a.handler;a.handler=function(a){a.orientation=f();return b.apply(this,arguments)}}};a.event.special.orientationchange.orientation=
+f=function(){var c=true,c=document.documentElement;return(c=a.support.orientation?b.orientation%180==0:c&&c.clientWidth/c.clientHeight<1.1)?"portrait":"landscape"}})(jQuery,e);(function(){a.event.special.throttledresize={setup:function(){a(this).bind("resize",b)},teardown:function(){a(this).unbind("resize",b)}};var b=function(){f=(new Date).getTime();e=f-c;e>=250?(c=f,a(this).trigger("throttledresize")):(d&&clearTimeout(d),d=setTimeout(b,250-e))},c=0,d,f,e})();a.each({scrollstop:"scrollstart",taphold:"tap",
+swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})})(jQuery,this);
+(function(a,e,b){function d(a){a=a||location.href;return"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var f="hashchange",c=document,h,g=a.event.special,i=c.documentMode,k="on"+f in e&&(i===b||i>7);a.fn[f]=function(a){return a?this.bind(f,a):this.trigger(f)};a.fn[f].delay=50;g[f]=a.extend(g[f],{setup:function(){if(k)return false;a(h.start)},teardown:function(){if(k)return false;a(h.stop)}});h=function(){function h(){var b=d(),c=n(p);if(b!==p)q(p=b,c),a(e).trigger(f);else if(c!==p)location.href=location.href.replace(/#.*/,
+"")+c;i=setTimeout(h,a.fn[f].delay)}var g={},i,p=d(),j=function(a){return a},q=j,n=j;g.start=function(){i||h()};g.stop=function(){i&&clearTimeout(i);i=b};a.browser.msie&&!k&&function(){var b,e;g.start=function(){if(!b)e=(e=a.fn[f].src)&&e+d(),b=a('').hide().one("load",function(){e||q(d());h()}).attr("src",e||"javascript:0").insertAfter("body")[0].contentWindow,c.onpropertychange=function(){try{if(event.propertyName==="title")b.document.title=c.title}catch(a){}}};
+g.stop=j;n=function(){return d(b.location.href)};q=function(d,e){var h=b.document,g=a.fn[f].domain;if(d!==e)h.title=c.title,h.open(),g&&h.write('
+
+{{if request.args[1]=="views":}}
+
+{{else:}}
+
+{{pass}}
+
+
+
diff --git a/applications/admin/views/default.mobile/change_password.html b/applications/admin/views/default.mobile/change_password.html
new file mode 100644
index 00000000..cb3d7541
--- /dev/null
+++ b/applications/admin/views/default.mobile/change_password.html
@@ -0,0 +1,9 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}change_password{{end}}
+
+Change Admin Password
+
+
+ {{=form}}
+
diff --git a/applications/admin/views/default.mobile/delete.html b/applications/admin/views/default.mobile/delete.html
new file mode 100644
index 00000000..38311196
--- /dev/null
+++ b/applications/admin/views/default.mobile/delete.html
@@ -0,0 +1,8 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}delete{{end}}
+
+
+
{{=T('Are you sure you want to delete file "%s"?', filename)}}
+
{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Delete')),INPUT(_type='hidden',_name='sender',_value=sender), _class="inline")}}
+
diff --git a/applications/admin/views/default.mobile/delete_plugin.html b/applications/admin/views/default.mobile/delete_plugin.html
new file mode 100644
index 00000000..74fcba8e
--- /dev/null
+++ b/applications/admin/views/default.mobile/delete_plugin.html
@@ -0,0 +1,9 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}delete_plugin{{end}}
+
+
+
{{=T('Are you sure you want to delete plugin "%s"?', plugin)}}
+
{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('NO')))}}
+
{{=FORM(INPUT(_type='submit',_name='delete',_value=T('YES')))}}
+
diff --git a/applications/admin/views/default.mobile/design.html b/applications/admin/views/default.mobile/design.html
new file mode 100644
index 00000000..7530f945
--- /dev/null
+++ b/applications/admin/views/default.mobile/design.html
@@ -0,0 +1,260 @@
+{{extend 'default.mobile/layout.html'}}
+
+{{block sectionclass}}design {{=app}}{{end}}
+
+
+
+
+ {{=T("Models")}}
+ {{=helpicon()}} {{=T("The data representation, define database tables and sets")}}
+
+
+ {{if not models:}}
{{=T("There are no models")}}
{{else:}}
+
+ {{=button(URL(a=app,c='appadmin',f='index'), T('database administration'))}}
+ {{if os.access(os.path.join(request.folder,'..',app,'databases','sql.log'),os.R_OK):}}
+ {{=button(URL('peek/%s/databases/sql.log'%app), 'sql.log')}}
+ {{pass}}
+
+ {{pass}}
+
+
+ {{for m in models:}}
+
+
+ {{=editfile('models',m)}}
+ {{=deletefile([app, 'models', m])}}
+
+
+ {{=peekfile('models',m)}}
+
+
+
+ {{pass}}
+
+
{{=file_create_form('%s/models/' % app)}}
+
+
+
+{{
+controller_functions=[]
+for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functions[c]]
+}}
+
+
+
+
+ {{=T("Controllers")}}
+ {{=helpicon()}} {{=T("The application logic, each URL path is mapped in one exposed function in the controller")}}
+
+
+ {{if not controllers:}}
{{=T("There are no controllers")}}
{{else:}}
+
+ {{=button(URL(r=request,c='shell',f='index',args=app), T("shell"))}}
+ {{=button(URL('test',args=app), T("test"))}}
+ {{=button(URL('edit',args=[app,'cron','crontab']), T("crontab"))}}
+
+ {{pass}}
+
+ {{for c in controllers:}}
+
+
+ {{=editfile('controllers',c)}}
+ {{=deletefile([app, 'controllers', c])}}
+ {{=testfile('controllers',c)}}
+
+
+ {{=peekfile('controllers',c)}}
+
+
+
+ {{pass}}
+
+
{{=file_create_form('%s/controllers/' % app)}}
+
+
+
+
+
+ {{=T("Views")}}
+ {{=helpicon()}} {{=T("The presentations layer, views are also known as templates")}}
+
+
+
+ {{=button(LAYOUTS_APP, T("download layouts"))}}
+
+ {{if not views:}}
{{=T("There are no views")}}
{{pass}}
+
+ {{for c in views:}}
+
+
+ {{=editfile('views',c)}}
+ {{=deletefile([app, 'views', c])}}
+
+
+ {{=peekfile('views',c)}}
+
+
+
+ {{pass}}
+
+
{{=file_create_form('%s/views/' % app)}}
+
+
+
+
+
+ {{=T("Languages")}}
+ {{=helpicon()}} {{=T("Translation strings for the application")}}
+
+
+
+ {{=button(URL('update_languages/'+app), T('update all languages'))}}
+
+ {{if not languages:}}
{{=T("There are no translators, only default language is supported")}}
{{pass}}
+
+ {{for file in languages:}}
+
+
+ {{=editlanguagefile('languages',file)}}
+ {{=deletefile([app, 'languages', file])}}
+
+
+ {{=peekfile('languages',file)}}
+
+
+ {{pass}}
+
+
{{=file_create_form('%s/languages/' % app)}}{{=T('(something like "it-it")')}}
+
+
+
+
+
+ {{=T("Static files")}}
+ {{=helpicon()}} {{=T("These files are served without processing, your images go here")}}
+
+
+
+
+ {{if not statics:}}
{{=T("There are no static files")}}
{{pass}}
+
+ {{
+ path=[]
+ for file in statics+['']:
+ items=file.split('/')
+ file_path=items[:-1]
+ filename=items[-1]
+ while path!=file_path:
+ if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
+ path.append(file_path[len(path)])
+ thispath='static__'+'__'.join(path)
+ }}
+
+ {{=path[-1]}}/
+ {{
+ else:
+ path = path[:-1]
+ }}
+
+ {{
+ pass
+ pass
+ if filename:
+ }}
+
+ {{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
+
+
+ {{=filename}}
+
+ {{
+ pass
+ pass
+ }}
+ {{pass}}
+
+
{{=file_create_form('%s/static/' % app)}}
+ {{=file_upload_form('%s/static/' % app)}}
+
+
+
+
+
+ {{=T("Modules")}}
+ {{=helpicon()}} {{=T("Additional code for your application")}}
+
+
+
+
+ {{if not modules:}}
{{=T("There are no modules")}}
{{pass}}
+
+ {{for m in modules:}}
+
+
+ {{=editfile('modules',m)}}
+ {{if m!='__init__.py':}}{{=deletefile([app, 'modules', m])}}{{pass}}
+
+
+ {{=peekfile('modules',m)}}
+
+
+ {{pass}}
+
+
{{=file_create_form('%s/modules/' % app)}}
+ {{=file_upload_form('%s/modules/' % app)}}
+
+
+
+
+
+ {{=T("Plugins")}}
+ {{=helpicon()}} {{=T("To create a plugin, name a file/folder plugin_[name]")}}
+
+
+
+ {{=button(PLUGINS_APP, T('download plugins'))}}
+
+
+
+ {{if plugins:}}
+
+ {{for plugin in plugins:}}
+
+ {{=A('plugin_%s' % plugin, _class='file', _href=URL('plugin', args=[app, plugin]))}}
+
+ {{pass}}
+
+ {{else:}}
+
{{=T('There are no plugins')}}
+ {{pass}}
+
{{=upload_plugin_form(app)}}
+
+
+
+
diff --git a/applications/admin/views/default.mobile/downgrade_web2py.html b/applications/admin/views/default.mobile/downgrade_web2py.html
new file mode 100644
index 00000000..e13277be
--- /dev/null
+++ b/applications/admin/views/default.mobile/downgrade_web2py.html
@@ -0,0 +1,13 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}upgrade{{end}}
+
+{{=T('web2py downgrade')}}
+
+{{=T('ATTENTION:')}} {{=T('This is an experimental feature and it needs more testing. If you decide to downgrade you do it at your own risk')}}
+{{=T('If start the downgrade, be patient, it may take a while to rollback')}}
+
+
+{{=FORM(INPUT(_type='submit',_name='nodowngrade',_value=T('Cancel')), _class='inline')}}
+{{=FORM(INPUT(_type='submit',_name='downgrade',_value=T('Downgrade')), _class='inline')}}
+
diff --git a/applications/admin/views/default.mobile/edit.html b/applications/admin/views/default.mobile/edit.html
new file mode 100644
index 00000000..3c734a13
--- /dev/null
+++ b/applications/admin/views/default.mobile/edit.html
@@ -0,0 +1,54 @@
+{{extend 'default.mobile/layout.html'}}
+
+{{
+ def shortcut(combo, description):
+ return XML('%s %s ' % (combo, description))
+}}
+
+{{if TEXT_EDITOR == 'amy':}}
+{{include 'default/amy_ajax.html'}}
+{{else:}}
+
+
+
+{{pass}}
+
+{{block sectionclass}}edit {{filename}}{{end}}
+
+{{if functions:}}
+
+
+ {{=B(T('exposes:'))}}{{=XML(', '.join([A(f,_href=URL(a=app,c=controller,f=f)).xml() for f in functions]))}}
+
+ {{if editviewlinks:}}
+ {{=B(T('edit views:'))}}
+ {{=XML(', '.join([v.xml() for v in editviewlinks]))}}
+ {{pass}}
+
+{{pass}}
+
+
+
diff --git a/applications/admin/views/default.mobile/edit_language.html b/applications/admin/views/default.mobile/edit_language.html
new file mode 100644
index 00000000..bb2e2a27
--- /dev/null
+++ b/applications/admin/views/default.mobile/edit_language.html
@@ -0,0 +1,18 @@
+{{extend 'layout.html'}}
+
+
+{{block sectionclass}}edit_language{{end}}
+
+{{=T('Editing Language file')}} "{{=filename}}"
+
+
+ {{=form}}
+
+
diff --git a/applications/admin/views/default.mobile/errors.html b/applications/admin/views/default.mobile/errors.html
new file mode 100644
index 00000000..4bb24f2c
--- /dev/null
+++ b/applications/admin/views/default.mobile/errors.html
@@ -0,0 +1,133 @@
+{{extend 'layout.html'}}
+{{import os, stat, time}}
+
+{{block sectionclass}}errors{{end}}
+
+
+
+
+
+{{=T('Error logs for "%(app)s"',dict(app=app))}}
+
+
diff --git a/applications/admin/views/default.mobile/index.html b/applications/admin/views/default.mobile/index.html
new file mode 100644
index 00000000..6016f6f5
--- /dev/null
+++ b/applications/admin/views/default.mobile/index.html
@@ -0,0 +1,13 @@
+{{extend 'default.mobile/layout.html'}}
+
+web2py™ {{=T('Web Framework')}}
+{{=T('Login to the Administrative Interface')}}
+
diff --git a/applications/admin/views/default.mobile/layout.html b/applications/admin/views/default.mobile/layout.html
new file mode 100644
index 00000000..3856f018
--- /dev/null
+++ b/applications/admin/views/default.mobile/layout.html
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+ web2py mobile admin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{include 'web2py_ajax.html'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
web2py mobile admin/{{block sectionclass}}{{end}}
+ {{block header}}
+ {{if 'auth' in globals():}}
+ {{if not auth.user:}}
+
Login
+ {{else:}}
+
Logout
+ {{pass}}
+ {{pass}}
+
{{=T("Home")}}
+ {{end}}
+
+
+ {{if response.flash:}}
{{=response.flash}}
{{pass}}
+ {{if response.menu:}}
+
+ {{=T("Main Menu")}}
+ {{for _ in response.menu:}}
+ {{=_[0]}}
+ {{pass}}
+
+ {{pass}}
+ {{include}}
+
+
+ {{block footer}}
+ powered by web2py - @2011
+ {{end}}
+
+
+
+
+
+
+
+
diff --git a/applications/admin/views/default.mobile/peek.html b/applications/admin/views/default.mobile/peek.html
new file mode 100644
index 00000000..bf43158f
--- /dev/null
+++ b/applications/admin/views/default.mobile/peek.html
@@ -0,0 +1,16 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}peek{{end}}
+
+{{=T("Peeking at file")}} "{{=filename}}"
+
+
+{{=button(URL('design',args=request.args[0]), T('back'))}}
+{{=button(URL('edit',args=request.args), T('Edit'))}}
+
+
+{{
+if filename[-3:]=='.py': language='python'
+else: language='html'
+}}
+{{=CODE(data,language=language,link='/examples/global/vars/')}}
diff --git a/applications/admin/views/default.mobile/plugin.html b/applications/admin/views/default.mobile/plugin.html
new file mode 100644
index 00000000..d0affa79
--- /dev/null
+++ b/applications/admin/views/default.mobile/plugin.html
@@ -0,0 +1,221 @@
+{{extend 'layout.html'}}
+{{
+import os
+def all(items):
+ return reduce(lambda a,b:a and b,items,True)
+def peekfile(path,file):
+ return A(file.replace('\\\\','/'),_href=URL('peek', args=(app, path, file)))
+def editfile(path,file):
+ return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit', args=(app, path, file)))
+def testfile(path,file):
+ return A(TAG[''](IMG(_src=URL('static', 'images/test_icon.png'), _alt=T('test')), SPAN(T("Run tests in this file"))), _class='icon test tooltip',_href=URL('test', args=(app, file)))
+def editlanguagefile(path,file):
+ return A(SPAN(T('Edit')),_class='button editbutton',_href=URL('edit_language', args=(app, path, file)))
+def file_upload_form(location):
+ form=FORM(T("upload file:")," ",
+ INPUT(_type="file",_name="file")," ",T("and rename it:")," ",
+ INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
+ INPUT(_type="hidden",_name="location",_value=location),
+ INPUT(_type="hidden",_name="sender",_value=URL('design/'+app)),
+ INPUT(_type="submit",_value=T("submit")),_action=URL('upload_file'))
+ return form
+def file_create_form(location):
+ form=FORM(T("create file with filename:")," ",
+ INPUT(_type="text",_name="filename",requires=IS_NOT_EMPTY),
+ INPUT(_type="hidden",_name="location",_value=location),
+ INPUT(_type="hidden",_name="sender",_value=URL('design/'+app)),
+ INPUT(_type="submit",_value=T("submit")),_action=URL('create_file'))
+ return form
+def upload_plugin_form(app):
+ form=FORM(T("upload plugin file:")," ",
+ INPUT(_type="file",_name="pluginfile"),
+ INPUT(_type="submit",_value=T("submit")))
+ return form
+def deletefile(arglist):
+ return A(TAG[''](IMG(_src=URL('static', 'images/delete_icon.png')), SPAN(T('Delete this file (you will be asked to confirm deletion)'))), _class='icon delete tooltip', _href=URL('delete',args=arglist,vars=dict(sender=request.function+'/'+app)))
+}}
+
+{{block sectionclass}}plugin{{end}}
+
+
+ {{=T('Plugin "%s" in application', request.args(1))}} "{{=app}}"
+
+
+
{{=T("collapse/expand all")}}
+
+ {{=button("#models", T("models"))}}
+ {{=button("#controllers", T("controllers"))}}
+ {{=button("#views", T("views"))}}
+ {{=button("#static", T("static"))}}
+ {{=button("#modules", T("modules"))}}
+
+
+ {{=sp_button(URL('plugin',args=app), T("back"))}}
+ {{=sp_button(URL('delete_plugin',args=request.args), T("delete plugin"))}}
+ {{=sp_button(URL('pack_plugin',args=request.args), T("pack plugin"))}}
+
+
+
+
+
+
+ {{=T("Models")}}
+
+
+ {{if not models:}}
+
{{=T("There are no models")}}
+ {{pass}}
+
+
+
+ {{for m in models:}}
+
+
+ {{=editfile('models',m)}}
+ {{=deletefile([app, 'models', m])}}
+
+
+ {{=peekfile('models',m)}}
+
+
+
+ {{pass}}
+
+
+
+
+{{
+controller_functions=[]
+for c in controllers: controller_functions+=[c[:-3]+'/%s.html'%x for x in functions[c]]
+}}
+
+
+
+
+ {{=T("Controllers")}}
+
+
+ {{if not controllers:}}
+
{{=T("There are no controllers")}}
+ {{pass}}
+
+
+
+ {{for c in controllers:}}
+
+
+ {{=editfile('controllers',c)}}
+ {{=deletefile([app,'controllers',c])}}
+ {{=testfile('controllers',c)}}
+
+
+ {{=peekfile('controllers',c)}}
+
+
+
+ {{pass}}
+
+
+
+
+
+
+ {{=T("Views")}}
+
+
+ {{if not views:}}
+
{{=T("There are no views")}}
+ {{pass}}
+
+
+
+ {{for c in views:}}
+
+
+ {{=editfile('views',c)}}
+ {{=deletefile([app,'views',c])}}
+
+
+ {{=peekfile('views',c)}}
+
+
+
+ {{pass}}
+
+
+
+
+
+
+ {{=T("Static files")}}
+
+
+ {{if not statics:}}
{{=T("There are no static files")}}
{{pass}}
+
+ {{
+ path=[]
+ for file in statics+['']:
+ items=file.split('/')
+ file_path=items[:-1]
+ filename=items[-1]
+ while path!=file_path:
+ if len(file_path)>=len(path) and all([v==file_path[k] for k,v in enumerate(path)]):
+ path.append(file_path[len(path)])
+ thispath='static__'+'__'.join(path)
+ }}
+
+ {{=path[-1]}}/
+ {{
+ else:
+ path = path[:-1]
+ }}
+
+ {{
+ pass
+ pass
+ if filename:
+ }}
+
+ {{=editfile('static',file)}} {{=deletefile([app,'static',file])}}
+
+
+ {{=filename}}
+
+ {{
+ pass
+ pass
+ }}
+ {{pass}}
+
+
+
+
+
+
+ {{=T("Modules")}}
+
+
+ {{if not modules:}}
+
{{=T("There are no modules")}}
+ {{pass}}
+
+
+
+ {{for m in modules:}}
+
+ {{=editfile('modules',m)}}
+ {{if m!='__init__.py':}}{{=T("delete")}} {{pass}}
+ {{=peekfile('modules',m)}}
+
+ {{pass}}
+
+
+
+
diff --git a/applications/admin/views/default.mobile/resolve.html b/applications/admin/views/default.mobile/resolve.html
new file mode 100644
index 00000000..031a26e7
--- /dev/null
+++ b/applications/admin/views/default.mobile/resolve.html
@@ -0,0 +1,24 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}resolve{{end}}
+
+{{=T('Resolve Conflict file')}} "{{=filename}}"
+
+
+
+
+new
+old
+all
+
+
+
+
+ {{=diff}}
+
+
+
diff --git a/applications/admin/views/default.mobile/site.html b/applications/admin/views/default.mobile/site.html
new file mode 100644
index 00000000..398f5c8a
--- /dev/null
+++ b/applications/admin/views/default.mobile/site.html
@@ -0,0 +1,43 @@
+{{extend 'default.mobile/layout.html'}}
+{{import os, glob}}
+{{block sectionclass}}site{{end}}
+
+{{=T("Installed applications")}}
+
+
diff --git a/applications/admin/views/default.mobile/test.html b/applications/admin/views/default.mobile/test.html
new file mode 100644
index 00000000..ef44b164
--- /dev/null
+++ b/applications/admin/views/default.mobile/test.html
@@ -0,0 +1,20 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}test{{end}}
+
+{{=T('Testing application')}} "{{=app}}"
+
+{{for controller in sorted(controllers):}}
+
+
Testing controller "{{=controller}}"... please wait!
+
+
+
+{{pass}}
+
+{{=T("""If the report above contains a ticket number it indicates a failure in executing the controller, before any attempt to execute the doctests. This is usually due to an indentation error or an error outside function code.
+A green title indicates that all tests (if defined) passed. In this case test results are not shown.""")}}
+{{=T('Functions with no doctests will result in [passed] tests.')}}
+{{=T('ATTENTION: TESTING IS NOT THREAD SAFE SO DO NOT PERFORM MULTIPLE TESTS CONCURRENTLY.')}}
diff --git a/applications/admin/views/default.mobile/ticket.html b/applications/admin/views/default.mobile/ticket.html
new file mode 100644
index 00000000..f8fb11c3
--- /dev/null
+++ b/applications/admin/views/default.mobile/ticket.html
@@ -0,0 +1,132 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}ticket{{end}}
+
+{{=T('Error ticket')}} for "{{=app}}"
+{{=T('Ticket ID')}}
+{{=ticket}}
+{{if output:}}{{=output}} {{pass}}
+{{=T('Version')}}
+
+
+
+ web2py™
+ {{=myversion}}
+
+
+ Python
+ {{=snapshot.get('pyver','')}}
+
+
+
+{{=T('Traceback')}}
+
+{{=traceback}}
+
+
+{{if snapshot:}}
+{{try:}}
+
+
+
+
+ {{=T('Error snapshot')}}
+ {{=helpicon()}} {{=T('Detailed traceback description')}}
+
+
+
+
+
+
+
+ {{=snapshot['etype']}}({{=snapshot['evalue']}})
+
+
+ {{=T('inspect attributes')}}
+
+
+
+
{{=T("Exception instance attributes")}}
+
+
+ {{for k,v in snapshot['exception'].items():}}
+
+ {{=k}}
+ {{=v}}
+
+ {{pass}}
+
+
+
+
+
+
+
+
+
{{=T('Frames')}}
+
+ {{for i, frame in enumerate(snapshot['frames']):}}
+
+ {{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}
+
+
+ File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}}
+ {{=T("code")}}
+ {{=T("arguments")}}
+ {{=T("variables")}}
+
+
+
Function argument list
+
{{=frame['call']}}
+
+
+
Code listing
+ {{if frame['lines']:}}
+
{{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
+ language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}
+ {{pass}}
+
+
+
Variables
+
+
+ {{for k,v in frame['dump'].items():}}
+
+ {{=k}}
+ {{=v}}
+
+ {{pass}}
+
+
+
+
+
+ {{pass}}
+
+
+
+
+
+{{except Exception, e:}}
+
+ {{import traceback;tb=traceback.format_exc().replace("\n","\\n") }}
+
+{{pass}}
+{{pass}}
+
+
+
In file: {{=layer}}
+ {{=CODE(code.replace('\r',''),language='python',link='/examples/global/vars/')}}
+
diff --git a/applications/admin/views/default.mobile/ticket.load b/applications/admin/views/default.mobile/ticket.load
new file mode 100644
index 00000000..381eee1d
--- /dev/null
+++ b/applications/admin/views/default.mobile/ticket.load
@@ -0,0 +1,130 @@
+{{block sectionclass}}ticket{{end}}
+
+{{=T('Error ticket')}} for "{{=app}}"
+{{=T('Ticket ID')}}
+{{=ticket}}
+{{if output:}}{{=output}} {{pass}}
+{{=T('Version')}}
+
+
+
+ web2py™
+ {{=myversion}}
+
+
+ Python
+ {{=snapshot.get('pyver','')}}
+
+
+
+{{=T('Traceback')}}
+
+{{=traceback}}
+
+
+{{if snapshot:}}
+{{try:}}
+
+
+
+
+ {{=T('Error snapshot')}}
+ {{=helpicon()}} {{=T('Detailed traceback description')}}
+
+
+
+
+
+
+
+ {{=snapshot['etype']}}({{=snapshot['evalue']}})
+
+
+ {{=T('inspect attributes')}}
+
+
+
+
{{=T("Exception instance attributes")}}
+
+
+ {{for k,v in snapshot['exception'].items():}}
+
+ {{=k}}
+ {{=v}}
+
+ {{pass}}
+
+
+
+
+
+
+
+
+
{{=T('Frames')}}
+
+ {{for i, frame in enumerate(snapshot['frames']):}}
+
+ {{is_hidden = (i != len(snapshot['frames'])-1 and 'hide' or 'inspect')}}
+
+
+ File {{="%s in %s at line %s" % (frame['file'], frame['func'], frame['lnum'])}}
+ {{=T("code")}}
+ {{=T("arguments")}}
+ {{=T("variables")}}
+
+
+
Function argument list
+
{{=frame['call']}}
+
+
+
Code listing
+ {{if frame['lines']:}}
+
{{=CODE('\n'.join([x[1] for x in sorted(frame['lines'].items(),key=lambda x: x[0])]),
+ language='python', link=None, counter=min(frame['lines'].keys()), highlight_line=frame['lnum'])}}
+ {{pass}}
+
+
+
Variables
+
+
+ {{for k,v in frame['dump'].items():}}
+
+ {{=k}}
+ {{=v}}
+
+ {{pass}}
+
+
+
+
+
+ {{pass}}
+
+
+
+
+
+{{except Exception, e:}}
+
+ {{import traceback;tb=traceback.format_exc().replace("\n","\\n") }}
+
+{{pass}}
+{{pass}}
+
+
+
In file: {{=layer}}
+ {{=CODE(code.replace('\r',''),language='python',link='/examples/global/vars/')}}
+
diff --git a/applications/admin/views/default.mobile/uninstall.html b/applications/admin/views/default.mobile/uninstall.html
new file mode 100644
index 00000000..b982c328
--- /dev/null
+++ b/applications/admin/views/default.mobile/uninstall.html
@@ -0,0 +1,9 @@
+{{extend 'layout.html'}}
+
+
+{{=T('Are you sure you want to uninstall application "%s"?', app)}}
+
+{{=FORM(INPUT(_type='submit',_name='nodelete',_value=T('Abort')))}}
+{{=FORM(INPUT(_type='submit',_name='delete',_value=T('Uninstall')))}}
+
+
diff --git a/applications/admin/views/default.mobile/upgrade_web2py.html b/applications/admin/views/default.mobile/upgrade_web2py.html
new file mode 100644
index 00000000..b7996213
--- /dev/null
+++ b/applications/admin/views/default.mobile/upgrade_web2py.html
@@ -0,0 +1,13 @@
+{{extend 'layout.html'}}
+
+{{block sectionclass}}upgrade{{end}}
+
+{{=T('web2py upgrade')}}
+
+{{=T('ATTENTION:')}} {{=T('This is an experimental feature and it needs more testing. If you decide to upgrade you do it at your own risk')}}
+{{=T('If start the upgrade, be patient, it may take a while to download')}}
+
+
+{{=FORM(INPUT(_type='submit',_name='noupgrade',_value=T('Cancel')), _class='inline')}}
+{{=FORM(INPUT(_type='submit',_name='upgrade',_value=T('Upgrade')), _class='inline')}}
+
diff --git a/applications/admin/views/default.mobile/user.html b/applications/admin/views/default.mobile/user.html
new file mode 100644
index 00000000..bd9e1baa
--- /dev/null
+++ b/applications/admin/views/default.mobile/user.html
@@ -0,0 +1,19 @@
+{{extend 'layout.html'}}
+{{=T( request.args(0).replace('_',' ').capitalize() )}}
+
+
+
diff --git a/applications/admin/views/plugin_jqmobile/about.html b/applications/admin/views/plugin_jqmobile/about.html
new file mode 100644
index 00000000..4c830d72
--- /dev/null
+++ b/applications/admin/views/plugin_jqmobile/about.html
@@ -0,0 +1,62 @@
+
+
+ jQuery Mobile Plugin for web2py
+
+
+
+
+
+
+
+
Try click on a button on the left, it is a demo!
+
License
+ MIT (same as jQuery Mobile)
+
Instructions
+
+ Download
+and install the plugin in a web2py app.
+ Replace extend "layout.html" with extend "plugin_jqmobile/layout.html" in all your views.
+ Only link pages that extend this layout.
+ Link external pages with <a rel="external" ...> .
+ Optional: make a different response.menu for each action.
+
+
Created by
+
+ Jason Blum
+ Timothy Stockman
+ Harkirat Singh
+ Massimo Di Pierro
+
+
+
+
diff --git a/applications/admin/views/plugin_jqmobile/index.html b/applications/admin/views/plugin_jqmobile/index.html
new file mode 100644
index 00000000..f349f6bd
--- /dev/null
+++ b/applications/admin/views/plugin_jqmobile/index.html
@@ -0,0 +1,33 @@
+{{extend 'plugin_jqmobile/layout.html'}}
+
+{{block header}}
+{{if 'auth' in globals():}}
+{{if not auth.user:}}
+Login
+{{else:}}
+Logout
+{{pass}}
+{{pass}}
+{{=T("Home")}}
+{{end}}
+
+
+Search results for tag: {{='tag'}}
+
+
+ {{if True:}}
+ Pages
+ {{for child in ('dog','cat','mouse'):}}
+ {{title = child}}
+ {{=child}}
+ {{pass}}
+ {{pass}}
+
+
+
+ {{for tag in ('dog','cat','mouse'):}}
+
{{=tag}}
+ {{pass}}
+
+
+
diff --git a/applications/admin/views/plugin_jqmobile/layout.html b/applications/admin/views/plugin_jqmobile/layout.html
new file mode 100644
index 00000000..81637ea7
--- /dev/null
+++ b/applications/admin/views/plugin_jqmobile/layout.html
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+ {{=response.title or request.application}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{include 'web2py_ajax.html'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{=response.title}}
+ {{block header}}
+ {{if 'auth' in globals():}}
+ {{if not auth.user:}}
+
Login
+ {{else:}}
+
Logout
+ {{pass}}
+ {{pass}}
+
{{=T("Home")}}
+ {{end}}
+
+
+ {{if response.flash:}}
{{=response.flash}}
{{pass}}
+ {{if response.menu:}}
+
+ {{=T("Main Menu")}}
+ {{for _ in response.menu:}}
+ {{=_[0]}}
+ {{pass}}
+
+ {{pass}}
+ {{include}}
+
+
+ {{block footer}}
+ powered by web2py - @2011
+ {{end}}
+
+
+
+
+
+
+
+
diff --git a/applications/welcome/ABOUT b/applications/welcome/ABOUT
index b160b8e9..184b19cb 100644
--- a/applications/welcome/ABOUT
+++ b/applications/welcome/ABOUT
@@ -1,2 +1,2 @@
Write something about this app.
-Developed with web2py.
\ No newline at end of file
+Developed with web2py.