From 6d0c0c3cdc1e670dbe840598aeaab248d36f6b8f Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Sun, 5 Jun 2011 17:51:57 -0400 Subject: [PATCH] Adding in new mobile site. Doesn't sohwing anything but a stubbed in list view. --- apps/mobile/__init__.py | 0 apps/mobile/models.py | 3 + apps/mobile/tests.py | 23 + apps/mobile/urls.py | 6 + apps/mobile/views.py | 15 + media/css/mobile/images | 1 + media/css/mobile/jquery.mobile-1.0a4.css | 1659 ++++++ media/css/mobile/mobile.css | 0 media/img/mobile/ajax-loader.png | Bin 0 -> 503 bytes media/img/mobile/icon-search-black.png | Bin 0 -> 1245 bytes media/img/mobile/icons-18-black.png | Bin 0 -> 2138 bytes media/img/mobile/icons-18-white.png | Bin 0 -> 2207 bytes media/img/mobile/icons-36-black.png | Bin 0 -> 4011 bytes media/img/mobile/icons-36-white.png | Bin 0 -> 4343 bytes media/js/{jquery-1.6.js => jquery-1.6.1.js} | 113 +- media/js/mobile/jquery.mobile-1.0a4.js | 5116 ++++++++++++++++++ media/js/mobile/newsblur/mobile_workspace.js | 11 + settings.py | 24 +- templates/mobile/mobile_workspace.xhtml | 71 + urls.py | 2 + 20 files changed, 7001 insertions(+), 43 deletions(-) create mode 100644 apps/mobile/__init__.py create mode 100644 apps/mobile/models.py create mode 100644 apps/mobile/tests.py create mode 100644 apps/mobile/urls.py create mode 100644 apps/mobile/views.py create mode 120000 media/css/mobile/images create mode 100644 media/css/mobile/jquery.mobile-1.0a4.css create mode 100644 media/css/mobile/mobile.css create mode 100644 media/img/mobile/ajax-loader.png create mode 100644 media/img/mobile/icon-search-black.png create mode 100644 media/img/mobile/icons-18-black.png create mode 100644 media/img/mobile/icons-18-white.png create mode 100644 media/img/mobile/icons-36-black.png create mode 100644 media/img/mobile/icons-36-white.png rename media/js/{jquery-1.6.js => jquery-1.6.1.js} (99%) create mode 100644 media/js/mobile/jquery.mobile-1.0a4.js create mode 100644 media/js/mobile/newsblur/mobile_workspace.js create mode 100644 templates/mobile/mobile_workspace.xhtml diff --git a/apps/mobile/__init__.py b/apps/mobile/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/mobile/models.py b/apps/mobile/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/apps/mobile/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/mobile/tests.py b/apps/mobile/tests.py new file mode 100644 index 000000000..2247054b3 --- /dev/null +++ b/apps/mobile/tests.py @@ -0,0 +1,23 @@ +""" +This file demonstrates two different styles of tests (one doctest and one +unittest). These will both pass when you run "manage.py test". + +Replace these with more appropriate tests for your application. +""" + +from django.test import TestCase + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.failUnlessEqual(1 + 1, 2) + +__test__ = {"doctest": """ +Another way to test that 1 + 1 is equal to 2. + +>>> 1 + 1 == 2 +True +"""} + diff --git a/apps/mobile/urls.py b/apps/mobile/urls.py new file mode 100644 index 000000000..9264adde7 --- /dev/null +++ b/apps/mobile/urls.py @@ -0,0 +1,6 @@ +from django.conf.urls.defaults import * +from apps.mobile import views + +urlpatterns = patterns('apps.mobile.views', + url(r'^$', views.index, name='mobile-index'), +) diff --git a/apps/mobile/views.py b/apps/mobile/views.py new file mode 100644 index 000000000..bf15b165b --- /dev/null +++ b/apps/mobile/views.py @@ -0,0 +1,15 @@ +import os +import base64 +import yaml +from django.conf import settings +from django.http import HttpResponse +from django.shortcuts import render_to_response +from django.template import RequestContext +from apps.profile.models import Profile +from apps.reader.models import UserSubscription, UserSubscriptionFolders +from utils import json_functions as json +from utils import log as logging + +def index(request): + return render_to_response('mobile/mobile_workspace.xhtml', {}, + context_instance=RequestContext(request)) diff --git a/media/css/mobile/images b/media/css/mobile/images new file mode 120000 index 000000000..ceaa7b5ad --- /dev/null +++ b/media/css/mobile/images @@ -0,0 +1 @@ +../../img/mobile \ No newline at end of file diff --git a/media/css/mobile/jquery.mobile-1.0a4.css b/media/css/mobile/jquery.mobile-1.0a4.css new file mode 100644 index 000000000..0ee015815 --- /dev/null +++ b/media/css/mobile/jquery.mobile-1.0a4.css @@ -0,0 +1,1659 @@ +/*! + * jQuery Mobile v1.0a4.1 + * http://jquerymobile.com/ + * + * Copyright 2010, jQuery Project + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* Note: Code is in draft form and is subject to change +*/ + + +/* A +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-a { + border: 1px solid #2A2A2A; + background: #111111; + color: #ffffff; + font-weight: bold; + text-shadow: 0 -1px 1px #000000; + background-image: -moz-linear-gradient(top, + #3c3c3c, + #111111); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #3c3c3c), + color-stop(1, #111111)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#3c3c3c', EndColorStr='#111111')"; +} +.ui-bar-a, +.ui-bar-a input, +.ui-bar-a select, +.ui-bar-a textarea, +.ui-bar-a button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-bar-a .ui-link-inherit { + color: #fff; +} +.ui-bar-a .ui-link { + color: #7cc4e7; + font-weight: bold; +} +.ui-body-a { + border: 1px solid #2A2A2A; + background: #222222; + color: #fff; + text-shadow: 0 1px 0 #000; + font-weight: normal; + background-image: -moz-linear-gradient(top, + #666666, + #222222); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #666666), + color-stop(1, #222222)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#666666', EndColorStr='#222222)')"; +} +.ui-body-a, +.ui-body-a input, +.ui-body-a select, +.ui-body-a textarea, +.ui-body-a button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-body-a .ui-link-inherit { + color: #fff; +} +.ui-body-a .ui-link { + color: #2489CE; + font-weight: bold; +} +.ui-br { + border-bottom: rgb(130,130,130); + border-bottom: rgba(130,130,130,.3); + border-bottom-width: 1px; + border-bottom-style: solid; +} +.ui-btn-up-a { + border: 1px solid #222; + background: #333333; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 1px #000; + background-image: -moz-linear-gradient(top, + #555555, + #333333); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #555555), + color-stop(1, #333333)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#555555', EndColorStr='#333333')"; +} +.ui-btn-up-a a.ui-link-inherit { + color: #fff; +} +.ui-btn-hover-a { + border: 1px solid #000; + background: #444444; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 1px #000; + background-image: -moz-linear-gradient(top, + #666666, + #444444); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #666666), + color-stop(1, #444444)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#666666', EndColorStr='#444444')"; +} +.ui-btn-hover-a a.ui-link-inherit { + color: #fff; +} +.ui-btn-down-a { + border: 1px solid #000; + background: #3d3d3d; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 1px #000; + background-image: -moz-linear-gradient(top, + #333333, + #5a5a5a); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #333333), + color-stop(1, #5a5a5a)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#333333', EndColorStr='#5a5a5a')"; +} +.ui-btn-down-a a.ui-link-inherit { + color: #fff; +} +.ui-btn-up-a, +.ui-btn-hover-a, +.ui-btn-down-a { + font-family: Helvetica, Arial, sans-serif; + text-decoration: none; +} + + +/* B +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-b { + border: 1px solid #456f9a; + background: #5e87b0; + color: #fff; + font-weight: bold; + text-shadow: 0 -1px 1px #254f7a; + background-image: -moz-linear-gradient(top, + #81a8ce, + #5e87b0); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #81a8ce), + color-stop(1, #5e87b0)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#81a8ce', EndColorStr='#5e87b0')"; +} +.ui-bar-b, +.ui-bar-b input, +.ui-bar-b select, +.ui-bar-b textarea, +.ui-bar-b button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-bar-b .ui-link-inherit { + color: #fff; +} +.ui-bar-b .ui-link { + color: #7cc4e7; + font-weight: bold; +} + +.ui-body-b { + border: 1px solid #C6C6C6; + background: #cccccc; + color: #333333; + text-shadow: 0 1px 0 #fff; + font-weight: normal; + background-image: -moz-linear-gradient(top, + #e6e6e6, + #cccccc); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #e6e6e6), + color-stop(1, #cccccc)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#e6e6e6', EndColorStr='#cccccc')"; +} +.ui-body-b, +.ui-body-b input, +.ui-body-b select, +.ui-body-b textarea, +.ui-body-b button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-body-b .ui-link-inherit { + color: #333333; +} +.ui-body-b .ui-link { + color: #2489CE; + font-weight: bold; +} +.ui-btn-up-b { + border: 1px solid #145072; + background: #2567ab; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 1px #145072; + background-image: -moz-linear-gradient(top, + #4e89c5, + #2567ab); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #5f9cc5), + color-stop(1, #396b9e)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#4e89c5', EndColorStr='#2567ab')"; +} +.ui-btn-up-b a.ui-link-inherit { + color: #fff; +} +.ui-btn-hover-b { + border: 1px solid #00516e; + background: #4b88b6; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 1px #014D68; + background-image: -moz-linear-gradient(top, + #72b0d4, + #4b88b6); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #72b0d4), + color-stop(1, #4b88b6)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#72b0d4', EndColorStr='#4b88b6')"; +} +.ui-btn-hover-b a.ui-link-inherit { + color: #fff; +} +.ui-btn-down-b { + border: 1px solid #225377; + background: #4e89c5; + font-weight: bold; + color: #fff; + text-shadow: 0 -1px 1px #225377; + background-image: -moz-linear-gradient(top, + #396b9e, + #4e89c5); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #396b9e), + color-stop(1, #4e89c5)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#396b9e', EndColorStr='#4e89c5')"; +} +.ui-btn-down-b a.ui-link-inherit { + color: #fff; +} +.ui-btn-up-b, +.ui-btn-hover-b, +.ui-btn-down-b { + font-family: Helvetica, Arial, sans-serif; + text-decoration: none; +} + + +/* C +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-c { + border: 1px solid #B3B3B3; + background: #e9eaeb; + color: #3E3E3E; + font-weight: bold; + text-shadow: 0 1px 1px #fff; + background-image: -moz-linear-gradient(top, + #f0f0f0, + #e9eaeb); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #f0f0f0), + color-stop(1, #e9eaeb)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#f0f0f0', EndColorStr='#e9eaeb')"; +} +.ui-bar-c, +.ui-bar-c input, +.ui-bar-c select, +.ui-bar-c textarea, +.ui-bar-c button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-body-c { + border: 1px solid #B3B3B3; + color: #333333; + text-shadow: 0 1px 0 #fff; + background: #f0f0f0; + background-image: -moz-linear-gradient(top, + #eeeeee, + #dddddd); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #eeeeee), + color-stop(1, #dddddd)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#dddddd')"; +} +.ui-body-c, +.ui-body-c input, +.ui-body-c select, +.ui-body-c textarea, +.ui-body-c button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-body-c .ui-link-inherit { + color: #333333; +} +.ui-body-c .ui-link { + color: #2489CE; + font-weight: bold; +} + +.ui-btn-up-c { + border: 1px solid #ccc; + background: #eee; + font-weight: bold; + color: #444; + text-shadow: 0 1px 1px #f6f6f6; + background-image: -moz-linear-gradient(top, + #fefefe, + #eeeeee); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fdfdfd), + color-stop(1, #eeeeee)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fdfdfd', EndColorStr='#eeeeee')"; +} +.ui-btn-up-c a.ui-link-inherit { + color: #2F3E46; +} + +.ui-btn-hover-c { + border: 1px solid #bbb; + background: #dadada; + font-weight: bold; + color: #101010; + text-shadow: 0 1px 1px #fff; + background-image: -moz-linear-gradient(top, + #ededed, + #dadada); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #ededed), + color-stop(1, #dadada)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ededed', EndColorStr='#dadada')"; +} +.ui-btn-hover-c a.ui-link-inherit { + color: #2F3E46; +} +.ui-btn-down-c { + border: 1px solid #808080; + background: #fdfdfd; + font-weight: bold; + color: #111111; + text-shadow: 0 1px 1px #ffffff; + background-image: -moz-linear-gradient(top, + #eeeeee, + #fdfdfd); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #eeeeee), + color-stop(1, #fdfdfd)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#fdfdfd')"; +} +.ui-btn-down-c a.ui-link-inherit { + color: #2F3E46; +} +.ui-btn-up-c, +.ui-btn-hover-c, +.ui-btn-down-c { + font-family: Helvetica, Arial, sans-serif; + text-decoration: none; +} + + +/* D +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-d { + border: 1px solid #ccc; + background: #bbb; + color: #333; + text-shadow: 0 1px 0 #eee; + background-image: -moz-linear-gradient(top, + #ddd, + #bbb); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #ddd), + color-stop(1, #bbb)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#dddddd', EndColorStr='#bbbbbb')"; +} +.ui-bar-d, +.ui-bar-d input, +.ui-bar-d select, +.ui-bar-d textarea, +.ui-bar-d button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-bar-d .ui-link-inherit { + color: #333; +} +.ui-bar-d .ui-link { + color: #2489CE; + font-weight: bold; +} +.ui-body-d { + border: 1px solid #ccc; + color: #333333; + text-shadow: 0 1px 0 #fff; + background: #ffffff; +} +.ui-body-d, +.ui-body-d input, +.ui-body-d select, +.ui-body-d textarea, +.ui-body-d button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-body-d .ui-link-inherit { + color: #333333; +} +.ui-body-d .ui-link { + color: #2489CE; + font-weight: bold; +} +.ui-btn-up-d { + border: 1px solid #ccc; + background: #fff; + font-weight: bold; + color: #444; + text-shadow: 0 1px 1px #fff; +} +.ui-btn-up-d a.ui-link-inherit { + color: #333; +} +.ui-btn-hover-d { + border: 1px solid #aaa; + background: #eeeeee; + font-weight: bold; + color: #222; + cursor: pointer; + text-shadow: 0 1px 1px #fff; + background-image: -moz-linear-gradient(top, + #fdfdfd, + #eeeeee); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fdfdfd), + color-stop(1, #eeeeee)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fdfdfd', EndColorStr='#eeeeee')"; +} +.ui-btn-hover-d a.ui-link-inherit { + color: #222; +} +.ui-btn-down-d { + border: 1px solid #aaaaaa; + background: #ffffff; + font-weight: bold; + color: #111; + text-shadow: 0 1px 1px #ffffff; + background-image: -moz-linear-gradient(top, + #eeeeee, + #ffffff); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #eeeeee), + color-stop(1, #ffffff)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#ffffff')"; +} +.ui-btn-down-d a.ui-link-inherit { + border: 1px solid #808080; + background: #ced0d2; + font-weight: bold; + color: #111; + text-shadow: none; + background-image: -moz-linear-gradient(top, + #cccccc, + #eeeeee); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #cccccc), + color-stop(1, #eeeeee)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#cccccc', EndColorStr='#eeeeee')"; +} +.ui-btn-up-d, +.ui-btn-hover-d, +.ui-btn-down-d { + font-family: Helvetica, Arial, sans-serif; + text-decoration: none; +} + + +/* E +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-e { + border: 1px solid #F7C942; + background: #fadb4e; + color: #333; + text-shadow: 0 1px 0 #fff; + background-image: -moz-linear-gradient(top, + #fceda7, + #fadb4e); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fceda7), + color-stop(1, #fadb4e)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fceda7', EndColorStr='#fadb4e')"; +} +.ui-bar-e, +.ui-bar-e input, +.ui-bar-e select, +.ui-bar-e textarea, +.ui-bar-d button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-bar-e .ui-link-inherit { + color: #333; +} +.ui-bar-e .ui-link { + color: #2489CE; + font-weight: bold; +} +.ui-body-e { + border: 1px solid #F7C942; + color: #333333; + text-shadow: 0 1px 0 #fff; + background: #faeb9e; + background-image: -moz-linear-gradient(top, + #fff, + #faeb9e); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fff), + color-stop(1, #faeb9e)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#faeb9e')"; +} +.ui-body-e, +.ui-body-e input, +.ui-body-e select, +.ui-body-e textarea, +.ui-body-e button { + font-family: Helvetica, Arial, sans-serif; +} +.ui-body-e .ui-link-inherit { + color: #333333; +} +.ui-body-e .ui-link { + color: #2489CE; + font-weight: bold; +} +.ui-btn-up-e { + border: 1px solid #F7C942; + background: #fadb4e; + font-weight: bold; + color: #333; + text-shadow: 0 1px 0 #fff; + background-image: -moz-linear-gradient(top, + #fceda7, + #fadb4e); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fceda7), + color-stop(1, #fadb4e)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fceda7', EndColorStr='#fadb4e')"; +} +.ui-btn-up-e a.ui-link-inherit { + color: #333; +} +.ui-btn-hover-e { + border: 1px solid #e79952; + background: #fbe26f; + font-weight: bold; + color: #111; + text-shadow: 0 1px 1px #fff; + background-image: -moz-linear-gradient(top, + #fcf0b5, + #fbe26f); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fcf0b5), + color-stop(1, #fbe26f)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fcf0b5', EndColorStr='#fbe26f')"; +} + +.ui-btn-hover-e a.ui-link-inherit { + color: #333; +} +.ui-btn-down-e { + border: 1px solid #F7C942; + background: #fceda7; + font-weight: bold; + color: #111; + text-shadow: 0 1px 1px #ffffff; + background-image: -moz-linear-gradient(top, + #fadb4e, + #fceda7); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #fadb4e), + color-stop(1, #fceda7)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fadb4e', EndColorStr='#fceda7')"; +} +.ui-btn-down-e a.ui-link-inherit { + color: #333; +} +.ui-btn-up-e, +.ui-btn-hover-e, +.ui-btn-down-e { + font-family: Helvetica, Arial, sans-serif; + text-decoration: none; +} + + +/* links within "buttons" +-----------------------------------------------------------------------------------------------------------*/ + +a.ui-link-inherit { + text-decoration: none !important; +} + + +/* Active class used as the "on" state across all themes +-----------------------------------------------------------------------------------------------------------*/ + +.ui-btn-active { + border: 1px solid #155678; + background: #4596ce; + font-weight: bold; + color: #fff; + cursor: pointer; + text-shadow: 0 -1px 1px #145072; + text-decoration: none; + background-image: -moz-linear-gradient(top, + #85bae4, + #5393c5); + background-image: -webkit-gradient(linear,left top,left bottom, + color-stop(0, #85bae4), + color-stop(1, #5393c5)); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#85bae4', EndColorStr='#5393c5')"; + outline: none; +} +.ui-btn-active a.ui-link-inherit { + color: #fff; +} + + +/* button inner top highlight +-----------------------------------------------------------------------------------------------------------*/ + +.ui-btn-inner { + border-top: 1px solid #fff; + border-color: rgba(255,255,255,.3); +} + + +/* corner rounding classes +-----------------------------------------------------------------------------------------------------------*/ + +.ui-corner-tl { + -moz-border-radius-topleft: .6em; + -webkit-border-top-left-radius: .6em; + border-top-left-radius: .6em; +} +.ui-corner-tr { + -moz-border-radius-topright: .6em; + -webkit-border-top-right-radius: .6em; + border-top-right-radius: .6em; +} +.ui-corner-bl { + -moz-border-radius-bottomleft: .6em; + -webkit-border-bottom-left-radius: .6em; + border-bottom-left-radius: .6em; +} +.ui-corner-br { + -moz-border-radius-bottomright: .6em; + -webkit-border-bottom-right-radius: .6em; + border-bottom-right-radius: .6em; +} +.ui-corner-top { + -moz-border-radius-topleft: .6em; + -webkit-border-top-left-radius: .6em; + border-top-left-radius: .6em; + -moz-border-radius-topright: .6em; + -webkit-border-top-right-radius: .6em; + border-top-right-radius: .6em; +} +.ui-corner-bottom { + -moz-border-radius-bottomleft: .6em; + -webkit-border-bottom-left-radius: .6em; + border-bottom-left-radius: .6em; + -moz-border-radius-bottomright: .6em; + -webkit-border-bottom-right-radius: .6em; + border-bottom-right-radius: .6em; + } +.ui-corner-right { + -moz-border-radius-topright: .6em; + -webkit-border-top-right-radius: .6em; + border-top-right-radius: .6em; + -moz-border-radius-bottomright: .6em; + -webkit-border-bottom-right-radius: .6em; + border-bottom-right-radius: .6em; +} +.ui-corner-left { + -moz-border-radius-topleft: .6em; + -webkit-border-top-left-radius: .6em; + border-top-left-radius: .6em; + -moz-border-radius-bottomleft: .6em; + -webkit-border-bottom-left-radius: .6em; + border-bottom-left-radius: .6em; +} +.ui-corner-all { + -moz-border-radius: .6em; + -webkit-border-radius: .6em; + border-radius: .6em; +} + + + +/* Interaction cues +-----------------------------------------------------------------------------------------------------------*/ +.ui-disabled { + opacity: .3; +} +.ui-disabled, +.ui-disabled a { + cursor: default !important; +} + +/* Icons +-----------------------------------------------------------------------------------------------------------*/ + +.ui-icon { + background: #666; + background: rgba(0,0,0,.4); + background-image: url(images/icons-18-white.png); + background-repeat: no-repeat; + -moz-border-radius: 9px; + -webkit-border-radius: 9px; + border-radius: 9px; +} + + +/* Alt icon color +-----------------------------------------------------------------------------------------------------------*/ + +.ui-icon-alt { + background: #fff; + background: rgba(255,255,255,.3); + background-image: url(images/icons-18-black.png); + background-repeat: no-repeat; +} + +/* HD/"retina" sprite +-----------------------------------------------------------------------------------------------------------*/ + +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (min--moz-device-pixel-ratio: 1.5), + only screen and (min-resolution: 240dpi) { + + .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r, + .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check, + .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back, + .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, + .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on { + background-image: url(images/icons-36-white.png); + -moz-background-size: 776px 18px; + -o-background-size: 776px 18px; + -webkit-background-size: 776px 18px; + background-size: 776px 18px; + } + .ui-icon-alt { + background-image: url(images/icons-36-black.png); + } +} + +/* plus minus */ +.ui-icon-plus { + background-position: -0 50%; +} +.ui-icon-minus { + background-position: -36px 50%; +} + +/* delete/close */ +.ui-icon-delete { + background-position: -72px 50%; +} + +/* arrows */ +.ui-icon-arrow-r { + background-position: -108px 50%; +} +.ui-icon-arrow-l { + background-position: -144px 50%; +} +.ui-icon-arrow-u { + background-position: -180px 50%; +} +.ui-icon-arrow-d { + background-position: -216px 50%; +} + +/* misc */ +.ui-icon-check { + background-position: -252px 50%; +} +.ui-icon-gear { + background-position: -288px 50%; +} +.ui-icon-refresh { + background-position: -324px 50%; +} +.ui-icon-forward { + background-position: -360px 50%; +} +.ui-icon-back { + background-position: -396px 50%; +} +.ui-icon-grid { + background-position: -432px 50%; +} +.ui-icon-star { + background-position: -468px 50%; +} +.ui-icon-alert { + background-position: -504px 50%; +} +.ui-icon-info { + background-position: -540px 50%; +} +.ui-icon-home { + background-position: -576px 50%; +} +.ui-icon-search { + background-position: -612px 50%; +} +.ui-icon-checkbox-off { + background-position: -684px 50%; +} +.ui-icon-checkbox-on { + background-position: -648px 50%; +} +.ui-icon-radio-off { + background-position: -756px 50%; +} +.ui-icon-radio-on { + background-position: -720px 50%; +} + + +/* checks,radios */ +.ui-icon-checkbox-off, +.ui-icon-checkbox-on, +.ui-icon-radio-off, +.ui-icon-radio-on { + background-color: transparent; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +.ui-icon-searchfield { + background-image: url(images/icon-search-black.png); + background-size: 16px 16px; +} + +/* loading icon */ +.ui-icon-loading { + background-image: url(images/ajax-loader.png); + width: 40px; + height: 40px; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + border-radius: 20px; + background-size: 35px 35px; +} + + +/* Button corner classes +-----------------------------------------------------------------------------------------------------------*/ + +.ui-btn-corner-tl { + -moz-border-radius-topleft: 1em; + -webkit-border-top-left-radius: 1em; + border-top-left-radius: 1em; +} +.ui-btn-corner-tr { + -moz-border-radius-topright: 1em; + -webkit-border-top-right-radius: 1em; + border-top-right-radius: 1em; +} +.ui-btn-corner-bl { + -moz-border-radius-bottomleft: 1em; + -webkit-border-bottom-left-radius: 1em; + border-bottom-left-radius: 1em; +} +.ui-btn-corner-br { + -moz-border-radius-bottomright: 1em; + -webkit-border-bottom-right-radius: 1em; + border-bottom-right-radius: 1em; +} +.ui-btn-corner-top { + -moz-border-radius-topleft: 1em; + -webkit-border-top-left-radius: 1em; + border-top-left-radius: 1em; + -moz-border-radius-topright: 1em; + -webkit-border-top-right-radius: 1em; + border-top-right-radius: 1em; +} +.ui-btn-corner-bottom { + -moz-border-radius-bottomleft: 1em; + -webkit-border-bottom-left-radius: 1em; + border-bottom-left-radius: 1em; + -moz-border-radius-bottomright: 1em; + -webkit-border-bottom-right-radius: 1em; + border-bottom-right-radius: 1em; +} +.ui-btn-corner-right { + -moz-border-radius-topright: 1em; + -webkit-border-top-right-radius: 1em; + border-top-right-radius: 1em; + -moz-border-radius-bottomright: 1em; + -webkit-border-bottom-right-radius: 1em; + border-bottom-right-radius: 1em; +} +.ui-btn-corner-left { + -moz-border-radius-topleft: 1em; + -webkit-border-top-left-radius: 1em; + border-top-left-radius: 1em; + -moz-border-radius-bottomleft: 1em; + -webkit-border-bottom-left-radius: 1em; + border-bottom-left-radius: 1em; +} +.ui-btn-corner-all { + -moz-border-radius: 1em; + -webkit-border-radius: 1em; + border-radius: 1em; +} + +/* radius clip workaround for cleaning up corner trapping */ +.ui-corner-tl, +.ui-corner-tr, +.ui-corner-bl, +.ui-corner-br, +.ui-corner-top, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-left, +.ui-corner-all, +.ui-btn-corner-tl, +.ui-btn-corner-tr, +.ui-btn-corner-bl, +.ui-btn-corner-br, +.ui-btn-corner-top, +.ui-btn-corner-bottom, +.ui-btn-corner-right, +.ui-btn-corner-left, +.ui-btn-corner-all { + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +/* Overlay / modal +-----------------------------------------------------------------------------------------------------------*/ + +.ui-overlay { + background: #666; + opacity: .5; + filter: Alpha(Opacity=50); + position: absolute; + width: 100%; + height: 100%; +} +.ui-overlay-shadow { + -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6); + -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6); + box-shadow: 0px 0px 12px rgba(0,0,0,.6); +} +.ui-shadow { + -moz-box-shadow: 0px 1px 4px rgba(0,0,0,.3); + -webkit-box-shadow: 0px 1px 4px rgba(0,0,0,.3); + box-shadow: 0px 1px 4px rgba(0,0,0,.3); +} +.ui-bar-a .ui-shadow, +.ui-bar-b .ui-shadow , +.ui-bar-c .ui-shadow { + -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3); + -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3); + box-shadow: 0px 1px 0 rgba(255,255,255,.3); +} +.ui-shadow-inset { + -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); + -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); + box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); +} +.ui-icon-shadow { + -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4); + -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4); + box-shadow: 0px 1px 0 rgba(255,255,255,.4); +} + + +/* Focus state - set here for specificity +-----------------------------------------------------------------------------------------------------------*/ + +.ui-focus { + -moz-box-shadow: 0px 0px 12px #387bbe; + -webkit-box-shadow: 0px 0px 12px #387bbe; + box-shadow: 0px 0px 12px #387bbe; +} + +/* unset box shadow in browsers that don't do it right +-----------------------------------------------------------------------------------------------------------*/ + +.ui-mobile-nosupport-boxshadow * { + -moz-box-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +/* ...and bring back focus */ +.ui-mobile-nosupport-boxshadow .ui-focus { + outline-width: 2px; +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* Note: Code is in draft form and is subject to change +*/ + +/* some unsets - more probably needed */ +.ui-mobile, .ui-mobile body { height: 100%; } +.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; } +.ui-mobile a img, .ui-mobile fieldset { border: 0; } + +/* responsive page widths */ +.ui-mobile-viewport { margin: 0; overflow-x: hidden; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +/* "page" containers - full-screen views, one should always be in view post-pageload */ +.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; } +.ui-mobile .ui-page-active { display: block; overflow: visible; } + +/*orientations from js are available */ +.portrait, +.portrait .ui-page { min-height: 100%; } +.landscape, +.landscape .ui-page { min-height: 100%; } + +/* loading screen */ +.ui-loading .ui-mobile-viewport { overflow: hidden !important; } +.ui-loading .ui-loader { display: block; } +.ui-loading .ui-page { overflow: hidden; } +.ui-loader { display: none; position: absolute; opacity: .85; z-index: 100; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; } +.ui-loader h1 { font-size: 15px; text-align: center; } +.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; } + +/*fouc*/ +.ui-mobile-rendering > * { visibility: hidden; } + +/*headers, content panels*/ +.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; } +.ui-bar { font-size: 16px; margin: 0; } +.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; } + +.ui-header, .ui-footer { display: block; } +.ui-page .ui-header, .ui-page .ui-footer { position: relative; } +.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; } +.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; } +.ui-header .ui-title, .ui-footer .ui-title { text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; } + +/*content area*/ +.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; } +.ui-page-fullscreen .ui-content { padding:0; } + +/* icons sizing */ +.ui-icon { width: 18px; height: 18px; } + +/* fullscreen class on ui-content div */ +.ui-fullscreen { } +.ui-fullscreen img { max-width: 100%; } + +/* non-js content hiding */ +.ui-nojs { position: absolute; left: -9999px; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.spin { + -webkit-transform: rotate(360deg); + -webkit-animation-name: spin; + -webkit-animation-duration: 1s; + -webkit-animation-iteration-count: infinite; +} +@-webkit-keyframes spin { + from {-webkit-transform: rotate(0deg);} + to {-webkit-transform: rotate(360deg);} +} + +/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/ +Built by David Kaneda and maintained by Jonathan Stark. +*/ +.in, .out { + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-duration: 350ms; +} + +.slide.in { + -webkit-transform: translateX(0); + -webkit-animation-name: slideinfromright; +} + +.slide.out { + -webkit-transform: translateX(-100%); + -webkit-animation-name: slideouttoleft; +} + +.slide.in.reverse { + -webkit-transform: translateX(0); + -webkit-animation-name: slideinfromleft; +} + +.slide.out.reverse { + -webkit-transform: translateX(100%); + -webkit-animation-name: slideouttoright; +} + +.slideup.in { + -webkit-transform: translateY(0); + -webkit-animation-name: slideinfrombottom; + z-index: 10; +} + +.slideup.out { + -webkit-animation-name: dontmove; + z-index: 0; +} + +.slideup.out.reverse { + -webkit-transform: translateY(100%); + z-index: 10; + -webkit-animation-name: slideouttobottom; +} + +.slideup.in.reverse { + z-index: 0; + -webkit-animation-name: dontmove; +} +.slidedown.in { + -webkit-transform: translateY(0); + -webkit-animation-name: slideinfromtop; + z-index: 10; +} + +.slidedown.out { + -webkit-animation-name: dontmove; + z-index: 0; +} + +.slidedown.out.reverse { + -webkit-transform: translateY(-100%); + z-index: 10; + -webkit-animation-name: slideouttotop; +} + +.slidedown.in.reverse { + z-index: 0; + -webkit-animation-name: dontmove; +} + +@-webkit-keyframes slideinfromright { + from { -webkit-transform: translateX(100%); } + to { -webkit-transform: translateX(0); } +} + +@-webkit-keyframes slideinfromleft { + from { -webkit-transform: translateX(-100%); } + to { -webkit-transform: translateX(0); } +} + +@-webkit-keyframes slideouttoleft { + from { -webkit-transform: translateX(0); } + to { -webkit-transform: translateX(-100%); } +} + +@-webkit-keyframes slideouttoright { + from { -webkit-transform: translateX(0); } + to { -webkit-transform: translateX(100%); } +} + + +@-webkit-keyframes slideinfromtop { + from { -webkit-transform: translateY(-100%); } + to { -webkit-transform: translateY(0); } +} + +@-webkit-keyframes slideinfrombottom { + from { -webkit-transform: translateY(100%); } + to { -webkit-transform: translateY(0); } +} + +@-webkit-keyframes slideouttobottom { + from { -webkit-transform: translateY(0); } + to { -webkit-transform: translateY(100%); } +} + +@-webkit-keyframes slideouttotop { + from { -webkit-transform: translateY(0); } + to { -webkit-transform: translateY(-100%); } +} +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +@-webkit-keyframes fadeout { + from { opacity: 1; } + to { opacity: 0; } +} + +.fade.in { + opacity: 1; + z-index: 10; + -webkit-animation-name: fadein; +} +.fade.out { + z-index: 0; + -webkit-animation-name: fadeout; +} + +/* The properties in this body rule are only necessary for the 'flip' transition. + * We need specify the perspective to create a projection matrix. This will add + * some depth as the element flips. The depth number represents the distance of + * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate + * value. + */ +.ui-mobile-viewport-perspective { + -webkit-perspective: 1000; + position: absolute; +} + +.ui-mobile-viewport-transitioning, +.ui-mobile-viewport-transitioning .ui-page { + width: 100%; + height: 100%; + overflow: hidden; +} + +.flip { + -webkit-animation-duration: .65s; + -webkit-backface-visibility:hidden; + -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */ +} + +.flip.in { + -webkit-transform: rotateY(0) scale(1); + -webkit-animation-name: flipinfromleft; +} + +.flip.out { + -webkit-transform: rotateY(-180deg) scale(.8); + -webkit-animation-name: flipouttoleft; +} + +/* Shake it all about */ + +.flip.in.reverse { + -webkit-transform: rotateY(0) scale(1); + -webkit-animation-name: flipinfromright; +} + +.flip.out.reverse { + -webkit-transform: rotateY(180deg) scale(.8); + -webkit-animation-name: flipouttoright; +} + +@-webkit-keyframes flipinfromright { + from { -webkit-transform: rotateY(-180deg) scale(.8); } + to { -webkit-transform: rotateY(0) scale(1); } +} + +@-webkit-keyframes flipinfromleft { + from { -webkit-transform: rotateY(180deg) scale(.8); } + to { -webkit-transform: rotateY(0) scale(1); } +} + +@-webkit-keyframes flipouttoleft { + from { -webkit-transform: rotateY(0) scale(1); } + to { -webkit-transform: rotateY(-180deg) scale(.8); } +} + +@-webkit-keyframes flipouttoright { + from { -webkit-transform: rotateY(0) scale(1); } + to { -webkit-transform: rotateY(180deg) scale(.8); } +} + + +/* Hackish, but reliable. */ + +@-webkit-keyframes dontmove { + from { opacity: 1; } + to { opacity: 1; } +} + +.pop { + -webkit-transform-origin: 50% 50%; +} + +.pop.in { + -webkit-transform: scale(1); + opacity: 1; + -webkit-animation-name: popin; + z-index: 10; +} + +.pop.out.reverse { + -webkit-transform: scale(.2); + opacity: 0; + -webkit-animation-name: popout; + z-index: 10; +} + +.pop.in.reverse { + z-index: 0; + -webkit-animation-name: dontmove; +} + +@-webkit-keyframes popin { + from { + -webkit-transform: scale(.2); + opacity: 0; + } + to { + -webkit-transform: scale(1); + opacity: 1; + } +} + +@-webkit-keyframes popout { + from { + -webkit-transform: scale(1); + opacity: 1; + } + to { + -webkit-transform: scale(.2); + opacity: 0; + } +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ + +/* content configurations. */ +.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; } +.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;} + +/* grid solo: 100 - single item fallback */ +.ui-grid-solo .ui-block-a { width: 100%; float: none; } + +/* grid a: 50/50 */ +.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; } +.ui-grid-a .ui-block-a { clear: left; } + +/* grid b: 33/33/33 */ +.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; } +.ui-grid-b .ui-block-a { clear: left; } + +/* grid c: 25/25/25/25 */ +.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; } +.ui-grid-c .ui-block-a { clear: left; } + +/* grid d: 20/20/20/20/20 */ +.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; } +.ui-grid-d .ui-block-a { clear: left; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +/* fixed page header & footer configuration */ +.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; } +.ui-header-fixed, .ui-footer-fixed { + z-index: 1000; + -webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */ +} +.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; } +.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-navbar { overflow: hidden; } +.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;} +.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; } +.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; } +.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; } +.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; } +.ui-navbar li .ui-btn { margin-right: -1px; } +.ui-navbar li .ui-btn:last-child { margin-right: 0; } +.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn, +.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; } +.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; } +.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; } +/*expanded page styles*/ +.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; } +.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; } +.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; } +.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; } +.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; } +.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; } +.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; } +.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; } +.ui-btn:focus, .ui-btn:active { outline: none; } +.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; } +.ui-btn-inline { display: inline-block; } +.ui-btn-inner { padding: .6em 25px; display: block; height: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; } +.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; } +.ui-btn-icon-notext { display: inline-block; width: 20px; height: 20px; padding: 2px 1px 2px 3px; text-indent: -9999px; } +.ui-btn-icon-notext .ui-btn-inner { padding: 0; } +.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -999px; } +.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; } +.ui-header .ui-btn-icon-left .ui-btn-inner, +.ui-footer .ui-btn-icon-left .ui-btn-inner, +.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; } +.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; } +.ui-header .ui-btn-icon-right .ui-btn-inner, +.ui-footer .ui-btn-icon-right .ui-btn-inner, +.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; } +.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; } +.ui-header .ui-btn-icon-top .ui-btn-inner, +.ui-footer .ui-btn-icon-top .ui-btn-inner, +.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; } +.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; } +.ui-header .ui-btn-icon-bottom .ui-btn-inner, +.ui-footer .ui-btn-icon-bottom .ui-btn-inner, +.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; } + +/*btn icon positioning*/ +.ui-btn-icon-notext .ui-icon { display: block; } +.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; } +.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; } +.ui-btn-icon-left .ui-icon { left: 10px; } +.ui-btn-icon-right .ui-icon {right: 10px; } +.ui-header .ui-btn-icon-left .ui-icon, +.ui-footer .ui-btn-icon-left .ui-icon, +.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; } +.ui-header .ui-btn-icon-right .ui-icon, +.ui-footer .ui-btn-icon-right .ui-icon, +.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; } +.ui-header .ui-btn-icon-top .ui-icon, +.ui-footer .ui-btn-icon-top .ui-icon, +.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; } +.ui-header .ui-btn-icon-bottom .ui-icon, +.ui-footer .ui-btn-icon-bottom .ui-icon, +.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; } +.ui-btn-icon-top .ui-icon { top: 5px; } +.ui-btn-icon-bottom .ui-icon { bottom: 5px; } +/*hiding native button,inputs */ +.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: 0; cursor: pointer; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-collapsible-contain { margin: .5em 0; } +.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; } +.ui-collapsible-heading a { text-align: left; margin: 0; } +.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; } +.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; } +.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 0; } +.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; } +.ui-collapsible-heading-status { position:absolute; left:-9999px; } +.ui-collapsible-content { display: block; padding: 10px 0 10px 8px; } +.ui-collapsible-content-collapsed { display: none; } + +.ui-collapsible-set { margin: .5em 0; } +.ui-collapsible-set .ui-collapsible-contain { margin: -1px 0 0; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; } +.ui-bar .ui-controlgroup { margin: 0 .3em; } +.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; } +.ui-controlgroup-controls { display: block; width: 95%;} +.ui-controlgroup li { list-style: none; } +.ui-controlgroup-vertical .ui-btn, +.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; } +.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; } +.ui-controlgroup-horizontal { padding: 0; } +.ui-controlgroup-horizontal .ui-btn, +.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { display: inline-block; margin: 0 -5px 0 0; } +.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { display: inline; } +.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn, +.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; } +.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; } +.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; } +/* conflicts with listview.. +.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; } +.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; } +*/ + +.min-width-480px .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } +.min-width-480px .ui-controlgroup-controls { width: 60%; display: inline-block; } /* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-dialog { min-height: 480px; } +.ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer { margin: 15px; position: relative; } +.ui-dialog .ui-header, .ui-dialog .ui-footer { z-index: 10; width: auto; } +.ui-dialog .ui-content, .ui-dialog .ui-footer { margin-top: -15px; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; } +.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; } +.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; } +.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } +.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; } +.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; } +/* input, label positioning */ +.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-field-contain { background: none; padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; } +.ui-field-contain:first-child { border-top-width: 0; } +.min-width-480px .ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-select { display: block; position: relative; } +.ui-select select { position: absolute; left: -9999px; top: -9999px; } +.ui-select .ui-btn { overflow: hidden; } +.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%; height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); } +.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; } + +.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } +.ui-select .ui-btn-icon-right .ui-icon { right: 15px; } + +/* labels */ +label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } + +/*listbox*/ +.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: inline-block; min-height: 1em; } +.ui-select .ui-btn-text { text-overflow: ellipsis; overflow: hidden; display: block;} + +.ui-selectmenu { position: absolute; padding: 0; z-index: 100 !important; width: 80%; max-width: 350px; padding: 6px; } +.ui-selectmenu .ui-listview { margin: 0; } +.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; } +.ui-selectmenu-hidden { top: -9999px; left: -9999px; } +.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; } +.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; } +.ui-selectmenu-list .ui-li .ui-icon { display: block; } +.ui-li.ui-selectmenu-placeholder { display: none; } +.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; } + +.min-width-480px label.ui-select { display: inline-block; width: 20%; margin: 0 2% 0 0; } +.min-width-480px .ui-select { width: 60%; display: inline-block; } + +/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */ +.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; } +input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 95%; } +input.ui-input-text { -webkit-appearance: none; } +textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; } +.ui-input-search { padding: 0 30px; width: 77%; background-position: 8px 50%; background-repeat: no-repeat; position: relative; } +.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; } +.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -14px; } +.ui-input-search .ui-input-clear-hidden { display: none; } + +/* orientation adjustments - incomplete!*/ +.min-width-480px label.ui-input-text { vertical-align: top; } +.min-width-480px label.ui-input-text { display: inline-block; width: 20%; margin: 0 2% 0 0; } +.min-width-480px input.ui-input-text, +.min-width-480px textarea.ui-input-text, +.min-width-480px .ui-input-search { width: 60%; display: inline-block; } +.min-width-480px .ui-input-search { width: 50%; } +.min-width-480px .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-listview { margin: 0; counter-reset: listnumbering; } +.ui-content .ui-listview { margin: -15px; } +.ui-content .ui-listview-inset { margin: 1em 0; } +.ui-listview, .ui-li { list-style:none; padding:0; } +.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; } +.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } +.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; } +.ui-li-divider { counter-reset: listnumbering; } +ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; } +ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */ +.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; } +.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; } +.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; } +.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 75px .7em 15px; display: block; } +.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; } +.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; } +.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } +.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } +.ui-li-thumb, .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; } +.ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; } +.ui-li-thumb, .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; } + +.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; } +.min-width-480px .ui-li-aside { width: 45%; } +.ui-li-divider { cursor: default; } +.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; } +.ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; } +.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; } +.ui-li-has-alt .ui-li-count { right: 55px; } +.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; } +.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; } +.ui-li-link-alt .ui-btn-inner { padding: 0; position: static; } +.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; } + +.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px } +.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; } + +.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; } + +/* Odd iPad positioning issue. */ +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { + .ui-li .ui-btn-text { overflow: visible; } +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +label.ui-slider { display: block; } +input.ui-slider-input, .min-width-480px input.ui-slider-input { display: inline-block; width: 50px; } +select.ui-slider-switch { display: none; } +div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 66%; } +a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; } +a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; } +.min-width-480px label.ui-slider { display: inline-block; width: 20%; margin: 0 2% 0 0; } +.min-width-480px div.ui-slider { width: 45%; } + +div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; } +div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; } +div.ui-slider-handle-snapping { -webkit-transition: left 100ms linear; } +div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; } +div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; } +div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; } +.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; } +.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; } + +div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; } +span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; } +span.ui-slider-label-a { left: -100%; margin-right: -1px } +span.ui-slider-label-b { right: -100%; margin-left: -1px } \ No newline at end of file diff --git a/media/css/mobile/mobile.css b/media/css/mobile/mobile.css new file mode 100644 index 000000000..e69de29bb diff --git a/media/img/mobile/ajax-loader.png b/media/img/mobile/ajax-loader.png new file mode 100644 index 0000000000000000000000000000000000000000..811a2cdd1b492c47faf85c1206ad6606521eb6e4 GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^${@_b3?$!tUzY`>n2Vh}LpV4%Za?&Y0OT43_=LFr z|Ns9ZDd7Dck0hX8fs!DgJ6C3d)qYMwA5Sr=f?F`h}-_x&BOOZ@XQnE}c<_xEZu zoIX1zlA-v_?sD-1ZfECkmVe(>o?xwNmGDbK;?2MR41rRzXA2bX{on66#ob*wrsMPf z`i=nRm=4)s4z4?=xi7SyIo*As^~h=O3#~U!U4D?`wnG2XC7uMQrY5F@nOn9v%usT4 zc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=$frY8Dg{g^?frWvgp^KZNxsipFqp^##k(sHh zxvLpWuSMv>2~2MaLa!-Ky`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<#X&zK> z3U0R;~ffC;SG&XwqMVf^ch~>^Yvx!tm1jqY457ni}SVjYVq%taI-#D(4G9|(WxaX8>%?0 zEnMtZ3AiXPE9g4;pNVTjo8X=Vv9Bv!*uMofb@+W(Ul1LCXEFch9S5!T3|b`D#=Epi z8!X$`Q#^T}SV3DB&kn}5KMpmXj4}KwX0EWLVYv=t|Er^U4l+M8P6%CCB3I7rXTtng z(ro%`J;}32*E3kFzD&w~E`3 zu1)(le}&!cgTHxZ+{t1VE?exk>B-DH*~0fXyl=eG&%n&E;IvbH^`pPBpaRF!)z4*} HQ$iB}ksr6J literal 0 HcmV?d00001 diff --git a/media/img/mobile/icons-18-black.png b/media/img/mobile/icons-18-black.png new file mode 100644 index 0000000000000000000000000000000000000000..71268bdf70f4a925e511d68be966e536449455a1 GIT binary patch literal 2138 zcma)7X;@Ni8YVSG+|qD~TtKr;&0KKQF%1_!6+}L%$D&`?WD3x~r= zNJtghJKS)a2#m0l$TXh2Gv?X<~74 zF_lUU3OGsh_y7MLa&vQmigY?XhDHNQAoTR5B>;1v8Q>Oh1LC%}Ho#vhmdb!;03K*e z8UQA?NE;v>AOSZrnGAFS#6F%r04db~T>-fO3Ctx`0x41xDgU2IrMJ?vh_j{%hyoct zI08uhzhU@40qji*R{%%;4WO%702ct10I066=5o2cy%Q4?z#bO<9kM%NI;rgmXIjAtMcGQw*nwMK95Y7ab>eIfowEs@r zqi}Y+lDYQXt5=1J%Efo zQSoKC$S^m@@Hqs*82);ZjKm z$4ij@TIU4l=)I+w+)B$k>SDXvort4n5`@%Hkt&Bc}txX>-AG%B8M4p@6mzHEaVaAElVwaSt*tI3-qCz(ZGvZv2jh=zTd!4*4+MbWA`A zWUjsXKt`Gr?mt8n?B32*YA<_7z?#v5B8Sr_$i@C?Un+^Bb0sV&!QZF5sB#(07g z*kfa1dZpCfn2|N{&xfHQD`Ll!|L9};vyoQQ(4wKm>;A`yW94-ZnPT-j|DGvr5@3aPw&Q=T+W))RIw>s z_S{Oy(oCD+#4N2UXc4UvH zJb(4QuN{OT3x&QRS*Q2wTiR4y$~fb}z-&$bC9f6alVR`-@@b zfY0CnQ-5k?mnL$ju&I^x&Su<5`+=QNL$<2k?l?u1u^p7x>>ER_EMl|SCx3RU{s@mP zI!*tz_ORlps8+b~rzfw4^TY90H4WsmrJdVkVku3Zw+q*4E$Wdw!#~Vi%hoB2?`pas zYoc{CcpB2PN&WLuW64&7?>;X?4c(rVx{p1}dzp&H*!Ie)hgr|@GTuG*804Uk`>djR zpu44N`6Rbv-YVGPaEiH@F32vA+MI2_4uxddjnmfb2`nJPfOJ8IipRZ`z0m zhg4`|GT>13t|X3rwPl?MjW0nq`9TV_-g|CBGPT@i%hPtfyyc))uiN+6I<)UFV(evufvsVYW=a;8V y>$()$`)dyAo?yDz(m!?&*Bm?0fp_ZpuB5QO+Xk{qI0O7oKpt*5*L%)^Y5xRlaH=!_ literal 0 HcmV?d00001 diff --git a/media/img/mobile/icons-18-white.png b/media/img/mobile/icons-18-white.png new file mode 100644 index 0000000000000000000000000000000000000000..dadc6af58703dc34132c8756ab74b125278ca1ea GIT binary patch literal 2207 zcma)7do+~m8XqCU6ob^B*}^dPrWr|-+lVra%TVJovu*cVt_{h|NcK46(oC5!nUF}e zgxn%yqhz*gxuqh)xU`8a6d_5Qj{TOi&f4po^T+wE^?l#-KHu|ue!u5^*ZMx5BiUxB z98wMff$SvN5}hFsNhpYwppxL;!IrfG4@m}rM1?}3BNGne5QqfU@i^6L^BV>S2Sp-L zd3iaD#iCFsBoc{0AmH(M91f?etBXRR5C{Yu4hLM&1~3*D7P`B;Yinx(rKqSVGcz+e zIXN^m)WgH$|DpePThJ3I{#^)UfPpPh5Ch8JW8muFOAdzvjDZ>uFc=IFtgfzRXJ>D@ z0!c6wm-MqXTRL7z$9fn#|11fP$?Ua4#dpd%*kwOlL9$ zqWB-s{9gdBzk>J;KLG%xpy;niN=gF4rT;?xH-Ihe9{UQQwE$ENbE7AKp6nT0HwFX( zQ~G*IyclC|fTRl3%9VMH9_YsmjX14A4Gj;3;Pej~>KhoqxH;hTA*x>sC=o%-Xg_)& z#4;elKTyLulpYuzL8mb^j!_IFYbK2#knK(+q9rvXVcuPqF+$umuzEYXv{vdDw<@nG zj3%F}Rg8RSRU#J-&w@lIRZVPe%Dk$0hsLk|rX8uD&X=v_Gf@*QeMAvhl>p8>%p&+=L_pvRO_ z{4~5U2d|}MOX0Qn6b8+x4=ohHjqDH^&OJJLw;%4i2#Y+6s>CXcWA-n`cF@ULSKDoS+TgQXySu!%L`d>Q>ehCS~OxlF9;*xNHDl4$uSM72)4_!G*Oyfj3@ zU8K81voaOqd-Floo!#x22ATJ1r%HvsPL?j|I+`u#N~ykO5(e55t5+jdAd}t^Z^X9< zs%-qiSP1=>sOm?vAAc~bzbB7sD;v8(!W1e7f8O-F`Q{*Z0@qib{@6Z5-Rer$FsY!j zU}AwZea`aZM`|WHAbILgWv4fPZhz%VBUFOPMRs$b!5h!(hg7NC{EwCk^ahplX)Yuc zrN^VI<|ZN!H9A{ix$vA&C8p=+*x_elB5ifIUiw>IUPpg$o|fnP)i$%|N5nD9%2N2D z*{FNQrepY=42&1NSj-^(L(DbihUjeonm+tGFl^#d$lnv|+XsUZ2`t!7t&5F!jv|e}!4V|t~ZjeH;bHwW? z-0CpeE*t&a`k>yVeQL?=THfJAM1VE<6Ws)WAIsvhK$Br6QQiwuMw6wu+_YT{Jn%r58)5m;cNVjl0O4!k(YEvR_&}q_CWb7Y<3+Jb&R;66e~&;n-h|XPD*a z!PbhWc9c6oJ7r(N{R-NHk1>zL&Iz$%O6==ik%@g`mb>#l(cH2dCiN_DVxcmB&(KjeXXz!q|F!qcV#Rs zDwCbtmNDZRKqt*>ujQ{hh1dvGtcREl$Vb~q_MV9|*|Hx!qNOkb%I&q@Rc;c?Gt-gsXqkuWr(-L#fE@sV-Rc!XDYl0QM(wBV( zeChX&kIJaz(k4Ydd8046{`cRv%!F6>51PhF-p$;WR&POQ2R|VQ$%;&@AowQ!1@2Y+ A!vFvP literal 0 HcmV?d00001 diff --git a/media/img/mobile/icons-36-black.png b/media/img/mobile/icons-36-black.png new file mode 100644 index 0000000000000000000000000000000000000000..8c35ae3fb03fcd68f24f106a50eb1d0c512dc798 GIT binary patch literal 4011 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 literal 0 HcmV?d00001 diff --git a/media/js/jquery-1.6.js b/media/js/jquery-1.6.1.js similarity index 99% rename from media/js/jquery-1.6.js rename to media/js/jquery-1.6.1.js index 07f1273c9..a2bf53029 100644 --- a/media/js/jquery-1.6.js +++ b/media/js/jquery-1.6.1.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v1.6.1pre Live From Git (8bb6e95b66413c484006288691a82c44ba50554e) + * jQuery JavaScript Library v1.6.1 * http://jquery.com/ * * Copyright 2011, John Resig @@ -11,7 +11,7 @@ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: Sun May 8 01:20:01 UTC 2011 + * Date: Thu May 12 15:04:36 2011 -0400 */ (function( window, undefined ) { @@ -204,7 +204,7 @@ jQuery.fn = jQuery.prototype = { selector: "", // The current version of jQuery being used - jquery: "1.6.1pre Live From Git (8bb6e95b66413c484006288691a82c44ba50554e)", + jquery: "1.6.1", // The default length of a jQuery object is 0 length: 0, @@ -1055,7 +1055,7 @@ jQuery.extend({ if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); - if ( jQuery.isFunction( returned.promise ) ) { + if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject ); } else { newDefer[ action ]( returned ); @@ -1137,6 +1137,7 @@ jQuery.extend({ jQuery.support = (function() { var div = document.createElement( "div" ), + documentElement = document.documentElement, all, a, select, @@ -1284,7 +1285,7 @@ jQuery.support = (function() { body.style[ i ] = bodyStyle[ i ]; } body.appendChild( div ); - document.documentElement.appendChild( body ); + documentElement.insertBefore( body, documentElement.firstChild ); // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) @@ -1339,12 +1340,12 @@ jQuery.support = (function() { marginDiv.style.marginRight = "0"; div.appendChild( marginDiv ); support.reliableMarginRight = - ( parseInt( document.defaultView.getComputedStyle( marginDiv, null ).marginRight, 10 ) || 0 ) === 0; + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } // Remove the body element we added body.innerHTML = ""; - document.documentElement.removeChild( body ); + documentElement.removeChild( body ); // Technique from Juriy Zaytsev // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ @@ -1475,7 +1476,7 @@ jQuery.extend({ } if ( data !== undefined ) { - thisCache[ name ] = data; + thisCache[ jQuery.camelCase( name ) ] = data; } // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should @@ -1485,7 +1486,7 @@ jQuery.extend({ return thisCache[ internalKey ] && thisCache[ internalKey ].events; } - return getByName ? thisCache[ name ] : thisCache; + return getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { @@ -2175,10 +2176,15 @@ jQuery.extend({ if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } - + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + var ret, hooks, notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - + // Normalize the name if needed name = notxml && jQuery.attrFix[ name ] || name; @@ -2255,7 +2261,7 @@ jQuery.extend({ // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation - var val = elem.getAttribute("value"); + var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; @@ -2278,7 +2284,7 @@ jQuery.extend({ } } }, - + propFix: { tabindex: "tabIndex", readonly: "readOnly", @@ -2296,32 +2302,32 @@ jQuery.extend({ prop: function( elem, name, value ) { var nType = elem.nodeType; - + // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return undefined; } - + var ret, hooks, notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - + // Try to normalize/fix the name name = notxml && jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; - + if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; - + } else { return (elem[ name ] = value); } - + } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { return ret; - + } else { return elem[ name ]; } @@ -2359,6 +2365,24 @@ boolHook = { } }; +// Use the value property for back compat +// Use the formHook for button elements in IE6/7 (#1954) +jQuery.attrHooks.value = { + get: function( elem, name ) { + if ( formHook && jQuery.nodeName( elem, "button" ) ) { + return formHook.get( elem, name ); + } + return elem.value; + }, + set: function( elem, value, name ) { + if ( formHook && jQuery.nodeName( elem, "button" ) ) { + return formHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } +}; + // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !jQuery.support.getSetAttribute ) { @@ -2366,12 +2390,9 @@ if ( !jQuery.support.getSetAttribute ) { jQuery.attrFix = jQuery.propFix; // Use this for any attribute on a form in IE6/7 - formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = { + formHook = jQuery.attrHooks.name = jQuery.valHooks.button = { get: function( elem, name ) { var ret; - if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) { - return elem.getAttribute( name ); - } ret = elem.getAttributeNode( name ); // Return undefined if nodeValue is empty string return ret && ret.nodeValue !== "" ? @@ -3126,6 +3147,9 @@ var withinElement = function( event ) { // Check if mouse(over|out) are still within the same parent element var parent = event.relatedTarget; + // set the correct event type + event.type = event.data; + // Firefox sometimes assigns relatedTarget a XUL element // which we cannot access the parentNode property of try { @@ -3135,15 +3159,13 @@ var withinElement = function( event ) { if ( parent && parent !== document && !parent.parentNode ) { return; } + // Traverse up the tree while ( parent && parent !== this ) { parent = parent.parentNode; } if ( parent !== this ) { - // set the correct event type - event.type = event.data; - // handle event if we actually just moused on to a non sub-element jQuery.event.handle.apply( this, arguments ); } @@ -4331,7 +4353,8 @@ var Expr = Sizzle.selectors = { }, reset: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "reset" === elem.type; + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { @@ -4597,6 +4620,16 @@ if ( document.documentElement.compareDocumentPosition ) { } else { sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + var al, bl, ap = [], bp = [], @@ -4604,13 +4637,8 @@ if ( document.documentElement.compareDocumentPosition ) { bup = b.parentNode, cur = aup; - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - // If the nodes are siblings (or identical) we can do a quick check - } else if ( aup === bup ) { + if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected @@ -5434,6 +5462,7 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*", "" ], legend: [ 1, "
", "
" ], @@ -5924,7 +5953,7 @@ jQuery.each({ function getAll( elem ) { if ( "getElementsByTagName" in elem ) { return elem.getElementsByTagName( "*" ); - + } else if ( "querySelectorAll" in elem ) { return elem.querySelectorAll( "*" ); @@ -6162,7 +6191,7 @@ function evalScript( i, elem ) { dataType: "script" }); } else { - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); } if ( elem.parentNode ) { @@ -8039,6 +8068,9 @@ jQuery.fn.extend({ return this.each( optall.complete, [ false ] ); } + // Do not change referenced properties as per-property easing will be lost + prop = jQuery.extend( {}, prop ); + return this[ optall.queue === false ? "each" : "queue" ](function() { // XXX 'this' does not always have a nodeName when running the // test suite @@ -8071,7 +8103,7 @@ jQuery.fn.extend({ // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) if ( jQuery.isArray( val ) ) { opt.animatedProperties[ name ] = val[ 1 ]; - val = val[ 0 ]; + val = prop[ name ] = val[ 0 ]; } else { opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; } @@ -8168,7 +8200,6 @@ jQuery.fn.extend({ if ( !gotoEnd ) { jQuery._unmark( true, this ); } - // go in reverse order so anything added to the queue during the loop is ignored while ( i-- ) { if ( timers[i].elem === this ) { if (gotoEnd) { @@ -8432,11 +8463,9 @@ jQuery.fx.prototype = { jQuery.extend( jQuery.fx, { tick: function() { - var timers = jQuery.timers, - i = timers.length; - while ( i-- ) { + for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) { if ( !timers[i]() ) { - timers.splice(i, 1); + timers.splice(i--, 1); } } diff --git a/media/js/mobile/jquery.mobile-1.0a4.js b/media/js/mobile/jquery.mobile-1.0a4.js new file mode 100644 index 000000000..b58a28495 --- /dev/null +++ b/media/js/mobile/jquery.mobile-1.0a4.js @@ -0,0 +1,5116 @@ +/*! + * jQuery Mobile v1.0a4.1 + * http://jquerymobile.com/ + * + * Copyright 2010, jQuery Project + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +/*! + * jQuery UI Widget @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function( $, undefined ) { + +// jQuery 1.4+ +if ( $.cleanData ) { + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $( elem ).triggerHandler( "remove" ); + } + _cleanData( elems ); + }; +} else { + var _remove = $.fn.remove; + $.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( [ this ] ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); + }; +} + +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( true, {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); + + $.widget.bridge( name, $[ namespace ][ name ] ); +}; + +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.charAt( 0 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ); + if ( !instance ) { + throw "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'"; + } + if ( !$.isFunction( instance[options] ) ) { + throw "no such method '" + options + "' for " + name + " widget instance"; + } + var methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + $.data( element, this.widgetName, this ); + this.element = $( element ); + this.options = $.extend( true, {}, + this.options, + this._getCreateOptions(), + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._trigger( "create" ); + this._init(); + }, + _getCreateOptions: function() { + var options = {}; + if ( $.metadata ) { + options = $.metadata.get( element )[ this.widgetName ]; + } + return options; + }, + _create: function() {}, + _init: function() {}, + + destroy: function() { + this.element + .unbind( "." + this.widgetName ) + .removeData( this.widgetName ); + this.widget() + .unbind( "." + this.widgetName ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetBaseClass + "-disabled " + + "ui-state-disabled" ); + }, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, this.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var self = this; + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var callback = this.options[ type ]; + + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + data = data || {}; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( event.originalEvent ) { + for ( var i = $.event.props.length, prop; i; ) { + prop = $.event.props[ --i ]; + event[ prop ] = event.originalEvent[ prop ]; + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; + +})( jQuery ); +/* +* jQuery Mobile Framework : widget factory extentions for mobile +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ +(function($, undefined ) { + +$.widget( "mobile.widget", { + _getCreateOptions: function() { + var elem = this.element, + options = {}; + $.each( this.options, function( option ) { + var value = elem.jqmData( option.replace( /[A-Z]/g, function( c ) { + return "-" + c.toLowerCase(); + } ) ); + if ( value !== undefined ) { + options[ option ] = value; + } + }); + return options; + } +}); + +})( jQuery ); +/* +* jQuery Mobile Framework : resolution and CSS media query related helpers and behavior +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ +(function($, undefined ) { + +var $window = $(window), + $html = $( "html" ), + + //media-query-like width breakpoints, which are translated to classes on the html element + resolutionBreakpoints = [320,480,768,1024]; + + +/* $.mobile.media method: pass a CSS media type or query and get a bool return + note: this feature relies on actual media query support for media queries, though types will work most anywhere + examples: + $.mobile.media('screen') //>> tests for screen media type + $.mobile.media('screen and (min-width: 480px)') //>> tests for screen media type with window width > 480px + $.mobile.media('@media screen and (-webkit-min-device-pixel-ratio: 2)') //>> tests for webkit 2x pixel ratio (iPhone 4) +*/ +$.mobile.media = (function() { + // TODO: use window.matchMedia once at least one UA implements it + var cache = {}, + testDiv = $( "
" ), + fakeBody = $( "" ).append( testDiv ); + + return function( query ) { + if ( !( query in cache ) ) { + var styleBlock = document.createElement('style'), + cssrule = "@media " + query + " { #jquery-mediatest { position:absolute; } }"; + //must set type for IE! + styleBlock.type = "text/css"; + if (styleBlock.styleSheet){ + styleBlock.styleSheet.cssText = cssrule; + } + else { + styleBlock.appendChild(document.createTextNode(cssrule)); + } + + $html.prepend( fakeBody ).prepend( styleBlock ); + cache[ query ] = testDiv.css( "position" ) === "absolute"; + fakeBody.add( styleBlock ).remove(); + } + return cache[ query ]; + }; +})(); + +/* + private function for adding/removing breakpoint classes to HTML element for faux media-query support + It does not require media query support, instead using JS to detect screen width > cross-browser support + This function is called on orientationchange, resize, and mobileinit, and is bound via the 'htmlclass' event namespace +*/ +function detectResolutionBreakpoints(){ + var currWidth = $window.width(), + minPrefix = "min-width-", + maxPrefix = "max-width-", + minBreakpoints = [], + maxBreakpoints = [], + unit = "px", + breakpointClasses; + + $html.removeClass( minPrefix + resolutionBreakpoints.join(unit + " " + minPrefix) + unit + " " + + maxPrefix + resolutionBreakpoints.join( unit + " " + maxPrefix) + unit ); + + $.each(resolutionBreakpoints,function( i, breakPoint ){ + if( currWidth >= breakPoint ){ + minBreakpoints.push( minPrefix + breakPoint + unit ); + } + if( currWidth <= breakPoint ){ + maxBreakpoints.push( maxPrefix + breakPoint + unit ); + } + }); + + if( minBreakpoints.length ){ breakpointClasses = minBreakpoints.join(" "); } + if( maxBreakpoints.length ){ breakpointClasses += " " + maxBreakpoints.join(" "); } + + $html.addClass( breakpointClasses ); +}; + +/* $.mobile.addResolutionBreakpoints method: + pass either a number or an array of numbers and they'll be added to the min/max breakpoint classes + Examples: + $.mobile.addResolutionBreakpoints( 500 ); + $.mobile.addResolutionBreakpoints( [500, 1200] ); +*/ +$.mobile.addResolutionBreakpoints = function( newbps ){ + if( $.type( newbps ) === "array" ){ + resolutionBreakpoints = resolutionBreakpoints.concat( newbps ); + } + else { + resolutionBreakpoints.push( newbps ); + } + resolutionBreakpoints.sort(function(a,b){ return a-b; }); + detectResolutionBreakpoints(); +}; + +/* on mobileinit, add classes to HTML element + and set handlers to update those on orientationchange and resize*/ +$(document).bind("mobileinit.htmlclass", function(){ + /* bind to orientationchange and resize + to add classes to HTML element for min/max breakpoints and orientation */ + $window.bind("orientationchange.htmlclass resize.htmlclass", function(event){ + //add orientation class to HTML element on flip/resize. + if(event.orientation){ + $html.removeClass( "portrait landscape" ).addClass( event.orientation ); + } + //add classes to HTML element for min/max breakpoints + detectResolutionBreakpoints(); + }); +}); + +/* Manually trigger an orientationchange event when the dom ready event fires. + This will ensure that any viewport meta tag that may have been injected + has taken effect already, allowing us to properly calculate the width of the + document. +*/ +$(function(){ + //trigger event manually + $window.trigger( "orientationchange.htmlclass" ); +}); + +})(jQuery);/* +* jQuery Mobile Framework : support tests +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* Note: Code is in draft form and is subject to change +*/ +(function($, undefined ) { + + + +var fakeBody = $( "" ).prependTo( "html" ), + fbCSS = fakeBody[0].style, + vendors = ['webkit','moz','o'], + webos = window.palmGetResource || window.PalmServiceBridge, //only used to rule out scrollTop + bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB + +//thx Modernizr +function propExists( prop ){ + var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1), + props = (prop + ' ' + vendors.join(uc_prop + ' ') + uc_prop).split(' '); + for(var v in props){ + if( fbCSS[ v ] !== undefined ){ + return true; + } + } +}; + +//test for dynamic-updating base tag support (allows us to avoid href,src attr rewriting) +function baseTagTest(){ + var fauxBase = location.protocol + '//' + location.host + location.pathname + "ui-dir/", + base = $("head base"), + fauxEle = null, + href = ''; + if (!base.length) { + base = fauxEle = $("", {"href": fauxBase}).appendTo("head"); + } + else { + href = base.attr("href"); + } + var link = $( "" ).prependTo( fakeBody ), + rebase = link[0].href; + base[0].href = href ? href : location.pathname; + if (fauxEle) { + fauxEle.remove(); + } + return rebase.indexOf(fauxBase) === 0; +}; + + +//non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683 +//allows for inclusion of IE 6+, including Windows Mobile 7 +$.mobile.browser = {}; +$.mobile.browser.ie = (function() { + var v = 3, div = document.createElement('div'), a = div.all || []; + while (div.innerHTML = '', a[0]); + return v > 4 ? v : !v; +}()); + +$.extend( $.support, { + orientation: "orientation" in window, + touch: "ontouchend" in document, + cssTransitions: "WebKitTransitionEvent" in window, + pushState: !!history.pushState, + mediaquery: $.mobile.media('only all'), + cssPseudoElement: !!propExists('content'), + boxShadow: !!propExists('boxShadow') && !bb, + scrollTop: ("pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[0]) && !webos, + dynamicBaseTag: baseTagTest(), + eventCapture: ("addEventListener" in document) // This is a weak test. We may want to beef this up later. +}); + +fakeBody.remove(); + +//for ruling out shadows via css +if( !$.support.boxShadow ){ $('html').addClass('ui-mobile-nosupport-boxshadow'); } + +})( jQuery );/* +* jQuery Mobile Framework : "mouse" plugin +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ + +// This plugin is an experiment for abstracting away the touch and mouse +// events so that developers don't have to worry about which method of input +// the device their document is loaded on supports. +// +// The idea here is to allow the developer to register listeners for the +// basic mouse events, such as mousedown, mousemove, mouseup, and click, +// and the plugin will take care of registering the correct listeners +// behind the scenes to invoke the listener at the fastest possible time +// for that device, while still retaining the order of event firing in +// the traditional mouse environment, should multiple handlers be registered +// on the same element for different events. +// +// The current version exposes the following virtual events to jQuery bind methods: +// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel" + +(function($, window, document, undefined) { + +var dataPropertyName = "virtualMouseBindings", + touchTargetPropertyName = "virtualTouchID", + virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "), + touchEventProps = "clientX clientY pageX pageY screenX screenY".split(" "), + activeDocHandlers = {}, + resetTimerID = 0, + startX = 0, + startY = 0, + startScrollX = 0, + startScrollY = 0, + didScroll = false, + clickBlockList = [], + blockMouseTriggers = false, + scrollTopSupported = $.support.scrollTop, + eventCaptureSupported = $.support.eventCapture, + $document = $(document), + nextTouchID = 1, + lastTouchID = 0; + +$.vmouse = { + moveDistanceThreshold: 10, + clickDistanceThreshold: 10, + resetTimerDuration: 1500 +}; + +function getNativeEvent(event) +{ + while (event && typeof event.originalEvent !== "undefined") { + event = event.originalEvent; + } + return event; +} + +function createVirtualEvent(event, eventType) +{ + var t = event.type; + event = $.Event(event); + event.type = eventType; + + var oe = event.originalEvent; + var props = $.event.props; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if (oe) { + for ( var i = props.length, prop; i; ) { + prop = props[ --i ]; + event[prop] = oe[prop]; + } + } + + if (t.search(/^touch/) !== -1){ + var ne = getNativeEvent(oe), + t = ne.touches, + ct = ne.changedTouches, + touch = (t && t.length) ? t[0] : ((ct && ct.length) ? ct[0] : undefined); + if (touch){ + for (var i = 0, len = touchEventProps.length; i < len; i++){ + var prop = touchEventProps[i]; + event[prop] = touch[prop]; + } + } + } + + return event; +} + +function getVirtualBindingFlags(element) +{ + var flags = {}; + var $ele = $(element); + while ($ele && $ele.length){ + var b = $ele.data(dataPropertyName); + for (var k in b) { + if (b[k]){ + flags[k] = flags.hasVirtualBinding = true; + } + } + $ele = $ele.parent(); + } + return flags; +} + +function getClosestElementWithVirtualBinding(element, eventType) +{ + var $ele = $(element); + while ($ele && $ele.length){ + var b = $ele.data(dataPropertyName); + if (b && (!eventType || b[eventType])) { + return $ele; + } + $ele = $ele.parent(); + } + return null; +} + +function enableTouchBindings() +{ + if (!activeDocHandlers["touchbindings"]){ + $document.bind("touchend", handleTouchEnd) + + // On touch platforms, touching the screen and then dragging your finger + // causes the window content to scroll after some distance threshold is + // exceeded. On these platforms, a scroll prevents a click event from being + // dispatched, and on some platforms, even the touchend is suppressed. To + // mimic the suppression of the click event, we need to watch for a scroll + // event. Unfortunately, some platforms like iOS don't dispatch scroll + // events until *AFTER* the user lifts their finger (touchend). This means + // we need to watch both scroll and touchmove events to figure out whether + // or not a scroll happenens before the touchend event is fired. + + .bind("touchmove", handleTouchMove) + .bind("scroll", handleScroll); + + activeDocHandlers["touchbindings"] = 1; + } +} + +function disableTouchBindings() +{ + if (activeDocHandlers["touchbindings"]){ + $document.unbind("touchmove", handleTouchMove) + .unbind("touchend", handleTouchEnd) + .unbind("scroll", handleScroll); + activeDocHandlers["touchbindings"] = 0; + } +} + +function enableMouseBindings() +{ + lastTouchID = 0; + clickBlockList.length = 0; + blockMouseTriggers = false; + + // When mouse bindings are enabled, our + // touch bindings are disabled. + disableTouchBindings(); +} + +function disableMouseBindings() +{ + // When mouse bindings are disabled, our + // touch bindings are enabled. + enableTouchBindings(); +} + +function startResetTimer() +{ + clearResetTimer(); + resetTimerID = setTimeout(function(){ + resetTimerID = 0; + enableMouseBindings(); + }, $.vmouse.resetTimerDuration); +} + +function clearResetTimer() +{ + if (resetTimerID){ + clearTimeout(resetTimerID); + resetTimerID = 0; + } +} + +function triggerVirtualEvent(eventType, event, flags) +{ + var defaultPrevented = false; + + if ((flags && flags[eventType]) || (!flags && getClosestElementWithVirtualBinding(event.target, eventType))) { + var ve = createVirtualEvent(event, eventType); + $(event.target).trigger(ve); + defaultPrevented = ve.isDefaultPrevented(); + } + + return defaultPrevented; +} + +function mouseEventCallback(event) +{ + var touchID = $(event.target).data(touchTargetPropertyName); + if (!blockMouseTriggers && (!lastTouchID || lastTouchID !== touchID)){ + triggerVirtualEvent("v" + event.type, event); + } +} + +function handleTouchStart(event) +{ + var touches = getNativeEvent(event).touches; + if (touches && touches.length === 1){ + var target = event.target, + flags = getVirtualBindingFlags(target); + + if (flags.hasVirtualBinding){ + lastTouchID = nextTouchID++; + $(target).data(touchTargetPropertyName, lastTouchID); + + clearResetTimer(); + + disableMouseBindings(); + didScroll = false; + + var t = getNativeEvent(event).touches[0]; + startX = t.pageX; + startY = t.pageY; + + if (scrollTopSupported){ + startScrollX = window.pageXOffset; + startScrollY = window.pageYOffset; + } + + triggerVirtualEvent("vmouseover", event, flags); + triggerVirtualEvent("vmousedown", event, flags); + } + } +} + +function handleScroll(event) +{ + if (!didScroll){ + triggerVirtualEvent("vmousecancel", event, getVirtualBindingFlags(event.target)); + } + + didScroll = true; + startResetTimer(); +} + +function handleTouchMove(event) +{ + var t = getNativeEvent(event).touches[0]; + + var didCancel = didScroll, + moveThreshold = $.vmouse.moveDistanceThreshold; + didScroll = didScroll + || (scrollTopSupported && (startScrollX !== window.pageXOffset || startScrollY !== window.pageYOffset)) + || (Math.abs(t.pageX - startX) > moveThreshold || Math.abs(t.pageY - startY) > moveThreshold); + + var flags = getVirtualBindingFlags(event.target); + if (didScroll && !didCancel){ + triggerVirtualEvent("vmousecancel", event, flags); + } + triggerVirtualEvent("vmousemove", event, flags); + startResetTimer(); +} + +function handleTouchEnd(event) +{ + disableTouchBindings(); + + var flags = getVirtualBindingFlags(event.target); + triggerVirtualEvent("vmouseup", event, flags); + if (!didScroll){ + if (triggerVirtualEvent("vclick", event, flags)){ + // The target of the mouse events that follow the touchend + // event don't necessarily match the target used during the + // touch. This means we need to rely on coordinates for blocking + // any click that is generated. + var t = getNativeEvent(event).changedTouches[0]; + clickBlockList.push({ touchID: lastTouchID, x: t.clientX, y: t.clientY }); + + // Prevent any mouse events that follow from triggering + // virtual event notifications. + blockMouseTriggers = true; + } + } + triggerVirtualEvent("vmouseout", event, flags); + didScroll = false; + + startResetTimer(); +} + +function hasVirtualBindings($ele) +{ + var bindings = $ele.data(dataPropertyName), k; + if (bindings){ + for (k in bindings){ + if (bindings[k]){ + return true; + } + } + } + return false; +} + +function dummyMouseHandler(){} + +function getSpecialEventObject(eventType) +{ + var realType = eventType.substr(1); + return { + setup: function(data, namespace) { + // If this is the first virtual mouse binding for this element, + // add a bindings object to its data. + + var $this = $(this); + + if (!hasVirtualBindings($this)){ + $this.data(dataPropertyName, {}); + } + + // If setup is called, we know it is the first binding for this + // eventType, so initialize the count for the eventType to zero. + + var bindings = $this.data(dataPropertyName); + bindings[eventType] = true; + + // If this is the first virtual mouse event for this type, + // register a global handler on the document. + + activeDocHandlers[eventType] = (activeDocHandlers[eventType] || 0) + 1; + if (activeDocHandlers[eventType] === 1){ + $document.bind(realType, mouseEventCallback); + } + + // Some browsers, like Opera Mini, won't dispatch mouse/click events + // for elements unless they actually have handlers registered on them. + // To get around this, we register dummy handlers on the elements. + + $this.bind(realType, dummyMouseHandler); + + // For now, if event capture is not supported, we rely on mouse handlers. + if (eventCaptureSupported){ + // If this is the first virtual mouse binding for the document, + // register our touchstart handler on the document. + + activeDocHandlers["touchstart"] = (activeDocHandlers["touchstart"] || 0) + 1; + if (activeDocHandlers["touchstart"] === 1) { + $document.bind("touchstart", handleTouchStart); + } + } + }, + + teardown: function(data, namespace) { + // If this is the last virtual binding for this eventType, + // remove its global handler from the document. + + --activeDocHandlers[eventType]; + if (!activeDocHandlers[eventType]){ + $document.unbind(realType, mouseEventCallback); + } + + if (eventCaptureSupported){ + // If this is the last virtual mouse binding in existence, + // remove our document touchstart listener. + + --activeDocHandlers["touchstart"]; + if (!activeDocHandlers["touchstart"]) { + $document.unbind("touchstart", handleTouchStart); + } + } + + var $this = $(this), + bindings = $this.data(dataPropertyName); + bindings[eventType] = false; + + // Unregister the dummy event handler. + + $this.unbind(realType, dummyMouseHandler); + + // If this is the last virtual mouse binding on the + // element, remove the binding data from the element. + + if (!hasVirtualBindings($this)){ + $this.removeData(dataPropertyName); + } + } + }; +} + +// Expose our custom events to the jQuery bind/unbind mechanism. + +for (var i = 0; i < virtualEventNames.length; i++){ + $.event.special[virtualEventNames[i]] = getSpecialEventObject(virtualEventNames[i]); +} + +// Add a capture click handler to block clicks. +// Note that we require event capture support for this so if the device +// doesn't support it, we punt for now and rely solely on mouse events. +if (eventCaptureSupported){ + document.addEventListener("click", function(e){ + var cnt = clickBlockList.length; + var target = e.target; + if (cnt) { + var x = e.clientX, + y = e.clientY, + threshold = $.vmouse.clickDistanceThreshold; + + // The idea here is to run through the clickBlockList to see if + // the current click event is in the proximity of one of our + // vclick events that had preventDefault() called on it. If we find + // one, then we block the click. + // + // Why do we have to rely on proximity? + // + // Because the target of the touch event that triggered the vclick + // can be different from the target of the click event synthesized + // by the browser. The target of a mouse/click event that is syntehsized + // from a touch event seems to be implementation specific. For example, + // some browsers will fire mouse/click events for a link that is near + // a touch event, even though the target of the touchstart/touchend event + // says the user touched outside the link. Also, it seems that with most + // browsers, the target of the mouse/click event is not calculated until the + // time it is dispatched, so if you replace an element that you touched + // with another element, the target of the mouse/click will be the new + // element underneath that point. + // + // Aside from proximity, we also check to see if the target and any + // of its ancestors were the ones that blocked a click. This is necessary + // because of the strange mouse/click target calculation done in the + // Android 2.1 browser, where if you click on an element, and there is a + // mouse/click handler on one of its ancestors, the target will be the + // innermost child of the touched element, even if that child is no where + // near the point of touch. + + var ele = target; + while (ele) { + for (var i = 0; i < cnt; i++) { + var o = clickBlockList[i], + touchID = 0; + if ((ele === target && Math.abs(o.x - x) < threshold && Math.abs(o.y - y) < threshold) || $(ele).data(touchTargetPropertyName) === o.touchID){ + // XXX: We may want to consider removing matches from the block list + // instead of waiting for the reset timer to fire. + e.preventDefault(); + e.stopPropagation(); + return; + } + } + ele = ele.parentNode; + } + } + }, true); +} +})(jQuery, window, document);/* +* jQuery Mobile Framework : events +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ +(function($, undefined ) { + +// add new event shortcuts +$.each( "touchstart touchmove touchend orientationchange tap taphold swipe swipeleft swiperight scrollstart scrollstop".split( " " ), function( i, name ) { + $.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + $.attrFn[ name ] = true; +}); + +var supportTouch = $.support.touch, + scrollEvent = "touchmove scroll", + touchStartEvent = supportTouch ? "touchstart" : "mousedown", + touchStopEvent = supportTouch ? "touchend" : "mouseup", + touchMoveEvent = supportTouch ? "touchmove" : "mousemove"; + +function triggerCustomEvent(obj, eventType, event) +{ + var originalType = event.type; + event.type = eventType; + $.event.handle.call( obj, event ); + event.type = originalType; +} + +// also handles scrollstop +$.event.special.scrollstart = { + enabled: true, + + setup: function() { + var thisObject = this, + $this = $( thisObject ), + scrolling, + timer; + + function trigger( event, state ) { + scrolling = state; + triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event ); + } + + // iPhone triggers scroll after a small delay; use touchmove instead + $this.bind( scrollEvent, function( event ) { + if ( !$.event.special.scrollstart.enabled ) { + return; + } + + if ( !scrolling ) { + trigger( event, true ); + } + + clearTimeout( timer ); + timer = setTimeout(function() { + trigger( event, false ); + }, 50 ); + }); + } +}; + +// also handles taphold +$.event.special.tap = { + setup: function() { + var thisObject = this, + $this = $( thisObject ); + + $this + .bind("vmousedown", function( event ) { + if ( event.which && event.which !== 1 ) { + return false; + } + + var touching = true, + origTarget = event.target, + origEvent = event.originalEvent, + timer; + + function clearTapHandlers() { + touching = false; + clearTimeout(timer); + $this.unbind("vclick", clickHandler).unbind("vmousecancel", clearTapHandlers); + } + + function clickHandler(event) { + clearTapHandlers(); + + /* ONLY trigger a 'tap' event if the start target is + * the same as the stop target. + */ + if ( origTarget == event.target ) { + triggerCustomEvent( thisObject, "tap", event ); + } + } + + $this.bind("vmousecancel", clearTapHandlers).bind("vclick", clickHandler); + + timer = setTimeout(function() { + if ( touching ) { + triggerCustomEvent( thisObject, "taphold", event ); + } + }, 750 ); + }); + } +}; + +// also handles swipeleft, swiperight +$.event.special.swipe = { + setup: function() { + var thisObject = this, + $this = $( thisObject ); + + $this + .bind( touchStartEvent, function( event ) { + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : + event, + start = { + time: (new Date).getTime(), + coords: [ data.pageX, data.pageY ], + origin: $( event.target ) + }, + stop; + + function moveHandler( event ) { + if ( !start ) { + return; + } + + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : + event; + stop = { + time: (new Date).getTime(), + coords: [ data.pageX, data.pageY ] + }; + + // prevent scrolling + if ( Math.abs( start.coords[0] - stop.coords[0] ) > 10 ) { + event.preventDefault(); + } + } + + $this + .bind( touchMoveEvent, moveHandler ) + .one( touchStopEvent, function( event ) { + $this.unbind( touchMoveEvent, moveHandler ); + if ( start && stop ) { + if ( stop.time - start.time < 1000 && + Math.abs( start.coords[0] - stop.coords[0]) > 30 && + Math.abs( start.coords[1] - stop.coords[1]) < 75 ) { + start.origin + .trigger( "swipe" ) + + .trigger( start.coords[0] > stop.coords[0] ? "swipeleft" : "swiperight" ); + } + } + start = stop = undefined; + }); + }); + } +}; + +(function($){ + // "Cowboy" Ben Alman + + var win = $(window), + special_event, + get_orientation, + last_orientation; + + $.event.special.orientationchange = special_event = { + setup: function(){ + // If the event is supported natively, return false so that jQuery + // will bind to the event using DOM methods. + if ( $.support.orientation ) { return false; } + + // Get the current orientation to avoid initial double-triggering. + last_orientation = get_orientation(); + + // Because the orientationchange event doesn't exist, simulate the + // event by testing window dimensions on resize. + win.bind( "resize", handler ); + }, + teardown: function(){ + // If the event is not supported natively, return false so that + // jQuery will unbind the event using DOM methods. + if ( $.support.orientation ) { return false; } + + // Because the orientationchange event doesn't exist, unbind the + // resize event handler. + win.unbind( "resize", handler ); + }, + add: function( handleObj ) { + // Save a reference to the bound event handler. + var old_handler = handleObj.handler; + + handleObj.handler = function( event ) { + // Modify event object, adding the .orientation property. + event.orientation = get_orientation(); + + // Call the originally-bound event handler and return its result. + return old_handler.apply( this, arguments ); + }; + } + }; + + // If the event is not supported natively, this handler will be bound to + // the window resize event to simulate the orientationchange event. + function handler() { + // Get the current orientation. + var orientation = get_orientation(); + + if ( orientation !== last_orientation ) { + // The orientation has changed, so trigger the orientationchange event. + last_orientation = orientation; + win.trigger( "orientationchange" ); + } + }; + + // Get the current page orientation. This method is exposed publicly, should it + // be needed, as jQuery.event.special.orientationchange.orientation() + special_event.orientation = get_orientation = function() { + var elem = document.documentElement; + return elem && elem.clientWidth / elem.clientHeight < 1.1 ? "portrait" : "landscape"; + }; + +})(jQuery); + +$.each({ + scrollstop: "scrollstart", + taphold: "tap", + swipeleft: "swipe", + swiperight: "swipe" +}, function( event, sourceEvent ) { + $.event.special[ event ] = { + setup: function() { + $( this ).bind( sourceEvent, $.noop ); + } + }; +}); + +})( jQuery ); +/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +// Script: jQuery hashchange event +// +// *Version: 1.3, Last updated: 7/21/2010* +// +// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/ +// GitHub - http://github.com/cowboy/jquery-hashchange/ +// Source - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js +// (Minified) - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped) +// +// About: License +// +// Copyright (c) 2010 "Cowboy" Ben Alman, +// Dual licensed under the MIT and GPL licenses. +// http://benalman.com/about/license/ +// +// About: Examples +// +// These working examples, complete with fully commented code, illustrate a few +// ways in which this plugin can be used. +// +// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/ +// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/ +// +// About: Support and Testing +// +// Information about what version or versions of jQuery this plugin has been +// tested with, what browsers it has been tested in, and where the unit tests +// reside (so you can test it yourself). +// +// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2 +// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5, +// Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5. +// Unit Tests - http://benalman.com/code/projects/jquery-hashchange/unit/ +// +// About: Known issues +// +// While this jQuery hashchange event implementation is quite stable and +// robust, there are a few unfortunate browser bugs surrounding expected +// hashchange event-based behaviors, independent of any JavaScript +// window.onhashchange abstraction. See the following examples for more +// information: +// +// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/ +// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/ +// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/ +// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/ +// +// Also note that should a browser natively support the window.onhashchange +// event, but not report that it does, the fallback polling loop will be used. +// +// About: Release History +// +// 1.3 - (7/21/2010) Reorganized IE6/7 Iframe code to make it more +// "removable" for mobile-only development. Added IE6/7 document.title +// support. Attempted to make Iframe as hidden as possible by using +// techniques from http://www.paciellogroup.com/blog/?p=604. Added +// support for the "shortcut" format $(window).hashchange( fn ) and +// $(window).hashchange() like jQuery provides for built-in events. +// Renamed jQuery.hashchangeDelay to and +// lowered its default value to 50. Added +// and properties plus document-domain.html +// file to address access denied issues when setting document.domain in +// IE6/7. +// 1.2 - (2/11/2010) Fixed a bug where coming back to a page using this plugin +// from a page on another domain would cause an error in Safari 4. Also, +// IE6/7 Iframe is now inserted after the body (this actually works), +// which prevents the page from scrolling when the event is first bound. +// Event can also now be bound before DOM ready, but it won't be usable +// before then in IE6/7. +// 1.1 - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug +// where browser version is incorrectly reported as 8.0, despite +// inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag. +// 1.0 - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special +// window.onhashchange functionality into a separate plugin for users +// who want just the basic event & back button support, without all the +// extra awesomeness that BBQ provides. This plugin will be included as +// part of jQuery BBQ, but also be available separately. + +(function($,window,undefined){ + '$:nomunge'; // Used by YUI compressor. + + // Reused string. + var str_hashchange = 'hashchange', + + // Method / object references. + doc = document, + fake_onhashchange, + special = $.event.special, + + // Does the browser support window.onhashchange? Note that IE8 running in + // IE7 compatibility mode reports true for 'onhashchange' in window, even + // though the event isn't supported, so also test document.documentMode. + doc_mode = doc.documentMode, + supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 ); + + // Get location.hash (or what you'd expect location.hash to be) sans any + // leading #. Thanks for making this necessary, Firefox! + function get_fragment( url ) { + url = url || location.href; + return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' ); + }; + + // Method: jQuery.fn.hashchange + // + // Bind a handler to the window.onhashchange event or trigger all bound + // window.onhashchange event handlers. This behavior is consistent with + // jQuery's built-in event handlers. + // + // Usage: + // + // > jQuery(window).hashchange( [ handler ] ); + // + // Arguments: + // + // handler - (Function) Optional handler to be bound to the hashchange + // event. This is a "shortcut" for the more verbose form: + // jQuery(window).bind( 'hashchange', handler ). If handler is omitted, + // all bound window.onhashchange event handlers will be triggered. This + // is a shortcut for the more verbose + // jQuery(window).trigger( 'hashchange' ). These forms are described in + // the section. + // + // Returns: + // + // (jQuery) The initial jQuery collection of elements. + + // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and + // $(elem).hashchange() for triggering, like jQuery does for built-in events. + $.fn[ str_hashchange ] = function( fn ) { + return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange ); + }; + + // Property: jQuery.fn.hashchange.delay + // + // The numeric interval (in milliseconds) at which the + // polling loop executes. Defaults to 50. + + // Property: jQuery.fn.hashchange.domain + // + // If you're setting document.domain in your JavaScript, and you want hash + // history to work in IE6/7, not only must this property be set, but you must + // also set document.domain BEFORE jQuery is loaded into the page. This + // property is only applicable if you are supporting IE6/7 (or IE8 operating + // in "IE7 compatibility" mode). + // + // In addition, the property must be set to the + // path of the included "document-domain.html" file, which can be renamed or + // modified if necessary (note that the document.domain specified must be the + // same in both your main JavaScript as well as in this file). + // + // Usage: + // + // jQuery.fn.hashchange.domain = document.domain; + + // Property: jQuery.fn.hashchange.src + // + // If, for some reason, you need to specify an Iframe src file (for example, + // when setting document.domain as in ), you can + // do so using this property. Note that when using this property, history + // won't be recorded in IE6/7 until the Iframe src file loads. This property + // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7 + // compatibility" mode). + // + // Usage: + // + // jQuery.fn.hashchange.src = 'path/to/file.html'; + + $.fn[ str_hashchange ].delay = 50; + /* + $.fn[ str_hashchange ].domain = null; + $.fn[ str_hashchange ].src = null; + */ + + // Event: hashchange event + // + // Fired when location.hash changes. In browsers that support it, the native + // HTML5 window.onhashchange event is used, otherwise a polling loop is + // initialized, running every milliseconds to + // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7 + // compatibility" mode), a hidden Iframe is created to allow the back button + // and hash-based history to work. + // + // Usage as described in : + // + // > // Bind an event handler. + // > jQuery(window).hashchange( function(e) { + // > var hash = location.hash; + // > ... + // > }); + // > + // > // Manually trigger the event handler. + // > jQuery(window).hashchange(); + // + // A more verbose usage that allows for event namespacing: + // + // > // Bind an event handler. + // > jQuery(window).bind( 'hashchange', function(e) { + // > var hash = location.hash; + // > ... + // > }); + // > + // > // Manually trigger the event handler. + // > jQuery(window).trigger( 'hashchange' ); + // + // Additional Notes: + // + // * The polling loop and Iframe are not created until at least one handler + // is actually bound to the 'hashchange' event. + // * If you need the bound handler(s) to execute immediately, in cases where + // a location.hash exists on page load, via bookmark or page refresh for + // example, use jQuery(window).hashchange() or the more verbose + // jQuery(window).trigger( 'hashchange' ). + // * The event can be bound before DOM ready, but since it won't be usable + // before then in IE6/7 (due to the necessary Iframe), recommended usage is + // to bind it inside a DOM ready handler. + + // Override existing $.event.special.hashchange methods (allowing this plugin + // to be defined after jQuery BBQ in BBQ's source code). + special[ str_hashchange ] = $.extend( special[ str_hashchange ], { + + // Called only when the first 'hashchange' event is bound to window. + setup: function() { + // If window.onhashchange is supported natively, there's nothing to do.. + if ( supports_onhashchange ) { return false; } + + // Otherwise, we need to create our own. And we don't want to call this + // until the user binds to the event, just in case they never do, since it + // will create a polling loop and possibly even a hidden Iframe. + $( fake_onhashchange.start ); + }, + + // Called only when the last 'hashchange' event is unbound from window. + teardown: function() { + // If window.onhashchange is supported natively, there's nothing to do.. + if ( supports_onhashchange ) { return false; } + + // Otherwise, we need to stop ours (if possible). + $( fake_onhashchange.stop ); + } + + }); + + // fake_onhashchange does all the work of triggering the window.onhashchange + // event for browsers that don't natively support it, including creating a + // polling loop to watch for hash changes and in IE 6/7 creating a hidden + // Iframe to enable back and forward. + fake_onhashchange = (function(){ + var self = {}, + timeout_id, + + // Remember the initial hash so it doesn't get triggered immediately. + last_hash = get_fragment(), + + fn_retval = function(val){ return val; }, + history_set = fn_retval, + history_get = fn_retval; + + // Start the polling loop. + self.start = function() { + timeout_id || poll(); + }; + + // Stop the polling loop. + self.stop = function() { + timeout_id && clearTimeout( timeout_id ); + timeout_id = undefined; + }; + + // This polling loop checks every $.fn.hashchange.delay milliseconds to see + // if location.hash has changed, and triggers the 'hashchange' event on + // window when necessary. + function poll() { + var hash = get_fragment(), + history_hash = history_get( last_hash ); + + if ( hash !== last_hash ) { + history_set( last_hash = hash, history_hash ); + + $(window).trigger( str_hashchange ); + + } else if ( history_hash !== last_hash ) { + location.href = location.href.replace( /#.*/, '' ) + history_hash; + } + + timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay ); + }; + + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + $.browser.msie && !supports_onhashchange && (function(){ + // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8 + // when running in "IE7 compatibility" mode. + + var iframe, + iframe_src; + + // When the event is bound and polling starts in IE 6/7, create a hidden + // Iframe for history handling. + self.start = function(){ + if ( !iframe ) { + iframe_src = $.fn[ str_hashchange ].src; + iframe_src = iframe_src && iframe_src + get_fragment(); + + // Create hidden Iframe. Attempt to make Iframe as hidden as possible + // by using techniques from http://www.paciellogroup.com/blog/?p=604. + iframe = $('