/*! | |
* jQuery Mobile v1.0rc1 | |
* 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. | |
*/ | |
/* Swatches */ | |
/* A | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-bar-a { | |
border: 1px solid #2A2A2A /*{a-bar-border}*/; | |
background: #111111 /*{a-bar-background-color}*/; | |
color: #ffffff /*{a-bar-color}*/; | |
font-weight: bold; | |
text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 1px /*{a-bar-shadow-radius}*/ #000000 /*{a-bar-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c /*{a-bar-background-start}*/), to(#111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); | |
} | |
.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 /*{a-bar-font}*/; | |
} | |
.ui-bar-a .ui-link-inherit { | |
color: #fff /*{a-bar-color}*/; | |
} | |
.ui-bar-a .ui-link { | |
color: #7cc4e7 /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-body-a { | |
border: 1px solid #2A2A2A /*{a-body-border}*/; | |
background: #222222 /*{a-body-background-color}*/; | |
color: #fff /*{a-body-color}*/; | |
text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #000 /*{a-body-shadow-color}*/; | |
font-weight: normal; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#666 /*{a-body-background-start}*/), to(#222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); | |
} | |
.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 /*{a-body-font}*/; | |
} | |
.ui-body-a .ui-link-inherit { | |
color: #fff /*{a-body-color}*/; | |
} | |
.ui-body-a .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
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 /*{a-bup-border}*/; | |
background: #333333 /*{a-bup-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{a-bup-color}*/; | |
text-shadow: 0 /*{a-bup-shadow-x}*/ -1px /*{a-bup-shadow-y}*/ 1px /*{a-bup-shadow-radius}*/ #000 /*{a-bup-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#555 /*{a-bup-background-start}*/), to(#333 /*{a-bup-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); | |
} | |
.ui-btn-up-a a.ui-link-inherit { | |
color: #fff /*{a-bup-color}*/; | |
} | |
.ui-btn-hover-a { | |
border: 1px solid #000 /*{a-bhover-border}*/; | |
background: #444444 /*{a-bhover-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{a-bhover-color}*/; | |
text-shadow: 0 /*{a-bhover-shadow-x}*/ -1px /*{a-bhover-shadow-y}*/ 1px /*{a-bhover-shadow-radius}*/ #000 /*{a-bhover-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#666 /*{a-bhover-background-start}*/), to(#444 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); | |
} | |
.ui-btn-hover-a a.ui-link-inherit { | |
color: #fff /*{a-bhover-color}*/; | |
} | |
.ui-btn-down-a { | |
border: 1px solid #000 /*{a-bdown-border}*/; | |
background: #3d3d3d /*{a-bdown-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{a-bdown-color}*/; | |
text-shadow: 0 /*{a-bdown-shadow-x}*/ -1px /*{a-bdown-shadow-y}*/ 1px /*{a-bdown-shadow-radius}*/ #000 /*{a-bdown-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#333 /*{a-bdown-background-start}*/), to(#5a5a5a /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); | |
} | |
.ui-btn-down-a a.ui-link-inherit { | |
color: #fff /*{a-bdown-color}*/; | |
} | |
.ui-btn-up-a, | |
.ui-btn-hover-a, | |
.ui-btn-down-a { | |
font-family: Helvetica, Arial, sans-serif /*{a-button-font}*/; | |
text-decoration: none; | |
} | |
/* B | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-bar-b { | |
border: 1px solid #456f9a /*{b-bar-border}*/; | |
background: #5e87b0 /*{b-bar-background-color}*/; | |
color: #fff /*{b-bar-color}*/; | |
font-weight: bold; | |
text-shadow: 0 /*{b-bar-shadow-x}*/ -1px /*{b-bar-shadow-y}*/ 1px /*{b-bar-shadow-radius}*/ #254f7a /*{b-bar-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#81a8ce /*{b-bar-background-start}*/), to(#5e87b0 /*{b-bar-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); | |
} | |
.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 /*{b-bar-font}*/; | |
} | |
.ui-bar-b .ui-link-inherit { | |
color: #fff /*{b-bar-color}*/; | |
} | |
.ui-bar-b .ui-link { | |
color: #7cc4e7 /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-body-b { | |
border: 1px solid #C6C6C6 /*{b-body-border}*/; | |
background: #cccccc /*{b-body-background-color}*/; | |
color: #333333 /*{b-body-color}*/; | |
text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/; | |
font-weight: normal; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#e6e6e6 /*{b-body-background-start}*/), to(#ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); | |
} | |
.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 /*{b-body-font}*/; | |
} | |
.ui-body-b .ui-link-inherit { | |
color: #333333 /*{b-body-color}*/; | |
} | |
.ui-body-b .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-btn-up-b { | |
border: 1px solid #145072 /*{b-bup-border}*/; | |
background: #2567ab /*{b-bup-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{b-bup-color}*/; | |
text-shadow: 0 /*{b-bup-shadow-x}*/ -1px /*{b-bup-shadow-y}*/ 1px /*{b-bup-shadow-radius}*/ #145072 /*{b-bup-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#5f9cc5 /*{b-bup-background-start}*/), to(#396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); | |
} | |
.ui-btn-up-b a.ui-link-inherit { | |
color: #fff /*{b-bup-color}*/; | |
} | |
.ui-btn-hover-b { | |
border: 1px solid #00516e /*{b-bhover-border}*/; | |
background: #4b88b6 /*{b-bhover-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{b-bhover-color}*/; | |
text-shadow: 0 /*{b-bhover-shadow-x}*/ -1px /*{b-bhover-shadow-y}*/ 1px /*{b-bhover-shadow-radius}*/ #014D68 /*{b-bhover-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#72b0d4 /*{b-bhover-background-start}*/), to(#4b88b6 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); | |
} | |
.ui-btn-hover-b a.ui-link-inherit { | |
color: #fff /*{b-bhover-color}*/; | |
} | |
.ui-btn-down-b { | |
border: 1px solid #225377 /*{b-bdown-border}*/; | |
background: #4e89c5 /*{b-bdown-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{b-bdown-color}*/; | |
text-shadow: 0 /*{b-bdown-shadow-x}*/ -1px /*{b-bdown-shadow-y}*/ 1px /*{b-bdown-shadow-radius}*/ #225377 /*{b-bdown-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#396b9e /*{b-bdown-background-start}*/), to(#4e89c5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); | |
} | |
.ui-btn-down-b a.ui-link-inherit { | |
color: #fff /*{b-bdown-color}*/; | |
} | |
.ui-btn-up-b, | |
.ui-btn-hover-b, | |
.ui-btn-down-b { | |
font-family: Helvetica, Arial, sans-serif /*{b-button-font}*/; | |
text-decoration: none; | |
} | |
/* C | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-bar-c { | |
border: 1px solid #B3B3B3 /*{c-bar-border}*/; | |
background: #e9eaeb /*{c-bar-background-color}*/; | |
color: #3E3E3E /*{c-bar-color}*/; | |
font-weight: bold; | |
text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 1px /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0 /*{c-bar-background-start}*/), to(#e9eaeb /*{c-bar-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); | |
} | |
.ui-bar-c .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.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 /*{c-bar-font}*/; | |
} | |
.ui-body-c { | |
border: 1px solid #B3B3B3 /*{c-body-border}*/; | |
color: #333333 /*{c-body-color}*/; | |
text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/; | |
background: #f0f0f0 /*{c-body-background-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee /*{c-body-background-start}*/), to(#ddd /*{c-body-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); | |
} | |
.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 /*{c-body-font}*/; | |
} | |
.ui-body-c .ui-link-inherit { | |
color: #333333 /*{c-body-color}*/; | |
} | |
.ui-body-c .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-btn-up-c { | |
border: 1px solid #ccc /*{c-bup-border}*/; | |
background: #eee /*{c-bup-background-color}*/; | |
font-weight: bold; | |
color: #444 /*{c-bup-color}*/; | |
text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 1px /*{c-bup-shadow-radius}*/ #f6f6f6 /*{c-bup-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd /*{c-bup-background-start}*/), to(#eee /*{c-bup-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); | |
} | |
.ui-btn-up-c a.ui-link-inherit { | |
color: #2F3E46 /*{c-bup-color}*/; | |
} | |
.ui-btn-hover-c { | |
border: 1px solid #bbb /*{c-bhover-border}*/; | |
background: #dadada /*{c-bhover-background-color}*/; | |
font-weight: bold; | |
color: #101010 /*{c-bhover-color}*/; | |
text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 1px /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#ededed /*{c-bhover-background-start}*/), to(#dadada /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); | |
} | |
.ui-btn-hover-c a.ui-link-inherit { | |
color: #2F3E46 /*{c-bhover-color}*/; | |
} | |
.ui-btn-down-c { | |
border: 1px solid #808080 /*{c-bdown-border}*/; | |
background: #fdfdfd /*{c-bdown-background-color}*/; | |
font-weight: bold; | |
color: #111111 /*{c-bdown-color}*/; | |
text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 1px /*{c-bdown-shadow-radius}*/ #ffffff /*{c-bdown-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee /*{c-bdown-background-start}*/), to(#fdfdfd /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); | |
} | |
.ui-btn-down-c a.ui-link-inherit { | |
color: #2F3E46 /*{c-bdown-color}*/; | |
} | |
.ui-btn-up-c, | |
.ui-btn-hover-c, | |
.ui-btn-down-c { | |
font-family: Helvetica, Arial, sans-serif /*{c-button-font}*/; | |
text-decoration: none; | |
} | |
/* D | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-bar-d { | |
border: 1px solid #ccc /*{d-bar-border}*/; | |
background: #bbb /*{d-bar-background-color}*/; | |
color: #333 /*{d-bar-color}*/; | |
text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd /*{d-bar-background-start}*/), to(#bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); | |
} | |
.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 /*{d-bar-font}*/; | |
} | |
.ui-bar-d .ui-link-inherit { | |
color: #333 /*{d-bar-color}*/; | |
} | |
.ui-bar-d .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-body-d { | |
border: 1px solid #ccc /*{d-body-border}*/; | |
color: #333333 /*{d-body-color}*/; | |
text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ #fff /*{d-body-shadow-color}*/; | |
background: #ffffff /*{d-body-background-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); | |
} | |
.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 /*{d-body-font}*/; | |
} | |
.ui-body-d .ui-link-inherit { | |
color: #333333 /*{d-body-color}*/; | |
} | |
.ui-body-d .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-btn-up-d { | |
border: 1px solid #ccc /*{d-bup-border}*/; | |
background: #fff /*{d-bup-background-color}*/; | |
font-weight: bold; | |
color: #444 /*{d-bup-color}*/; | |
text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 1px /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#fff /*{d-bup-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); | |
} | |
.ui-btn-up-d a.ui-link-inherit { | |
color: #333 /*{d-bup-color}*/; | |
} | |
.ui-btn-hover-d { | |
border: 1px solid #aaa /*{d-bhover-border}*/; | |
background: #eeeeee /*{d-bhover-background-color}*/; | |
font-weight: bold; | |
color: #222 /*{d-bhover-color}*/; | |
cursor: pointer; | |
text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 1px /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#eee /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); | |
} | |
.ui-btn-hover-d a.ui-link-inherit { | |
color: #222 /*{d-bhover-color}*/; | |
} | |
.ui-btn-down-d { | |
border: 1px solid #aaaaaa /*{d-bdown-border}*/; | |
background: #ffffff /*{d-bdown-background-color}*/; | |
font-weight: bold; | |
color: #111 /*{d-bdown-color}*/; | |
text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 1px /*{d-bdown-shadow-radius}*/ #ffffff /*{d-bdown-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee /*{d-bdown-background-start}*/), to(#fff /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); | |
} | |
.ui-btn-down-d a.ui-link-inherit { | |
color: #111 /*{d-bdown-color}*/; | |
} | |
.ui-btn-up-d, | |
.ui-btn-hover-d, | |
.ui-btn-down-d { | |
font-family: Helvetica, Arial, sans-serif /*{d-button-font}*/; | |
text-decoration: none; | |
} | |
/* E | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-bar-e { | |
border: 1px solid #F7C942 /*{e-bar-border}*/; | |
background: #fadb4e /*{e-bar-background-color}*/; | |
color: #333 /*{e-bar-color}*/; | |
text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fceda7 /*{e-bar-background-start}*/), to(#fadb4e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); | |
} | |
.ui-bar-e, | |
.ui-bar-e input, | |
.ui-bar-e select, | |
.ui-bar-e textarea, | |
.ui-bar-e button { | |
font-family: Helvetica, Arial, sans-serif /*{e-bar-font}*/; | |
} | |
.ui-bar-e .ui-link-inherit { | |
color: #333 /*{e-bar-color}*/; | |
} | |
.ui-bar-e .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-body-e { | |
border: 1px solid #F7C942 /*{e-body-border}*/; | |
color: #333333 /*{e-body-color}*/; | |
text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/; | |
background: #faeb9e /*{e-body-background-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff /*{e-body-background-start}*/), to(#faeb9e /*{e-body-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); | |
} | |
.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 /*{e-body-font}*/; | |
} | |
.ui-body-e .ui-link-inherit { | |
color: #333333 /*{e-body-color}*/; | |
} | |
.ui-body-e .ui-link { | |
color: #2489CE /*{global-link-color}*/; | |
font-weight: bold; | |
} | |
.ui-btn-up-e { | |
border: 1px solid #F7C942 /*{e-bup-border}*/; | |
background: #fadb4e /*{e-bup-background-color}*/; | |
font-weight: bold; | |
color: #333 /*{e-bup-color}*/; | |
text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fceda7 /*{e-bup-background-start}*/), to(#fadb4e /*{e-bup-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); | |
} | |
.ui-btn-up-e a.ui-link-inherit { | |
color: #333 /*{e-bup-color}*/; | |
} | |
.ui-btn-hover-e { | |
border: 1px solid #e79952 /*{e-bhover-border}*/; | |
background: #fbe26f /*{e-bhover-background-color}*/; | |
font-weight: bold; | |
color: #111 /*{e-bhover-color}*/; | |
text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 1px /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf0b5 /*{e-bhover-background-start}*/), to(#fbe26f /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); | |
} | |
.ui-btn-hover-e a.ui-link-inherit { | |
color: #333 /*{e-bhover-color}*/; | |
} | |
.ui-btn-down-e { | |
border: 1px solid #F7C942 /*{e-bdown-border}*/; | |
background: #fceda7 /*{e-bdown-background-color}*/; | |
font-weight: bold; | |
color: #111 /*{e-bdown-color}*/; | |
text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 1px /*{e-bdown-shadow-radius}*/ #ffffff /*{e-bdown-shadow-color}*/; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#fadb4e /*{e-bdown-background-start}*/), to(#fceda7 /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); | |
} | |
.ui-btn-down-e a.ui-link-inherit { | |
color: #333 /*{e-bdown-color}*/; | |
} | |
.ui-btn-up-e, | |
.ui-btn-hover-e, | |
.ui-btn-down-e { | |
font-family: Helvetica, Arial, sans-serif /*{e-button-font}*/; | |
text-decoration: none; | |
} | |
/* Structure */ | |
/* links within "buttons" | |
-----------------------------------------------------------------------------------------------------------*/ | |
a.ui-link-inherit { | |
text-decoration: none !important; | |
} | |
/* links and their different states | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-link{ | |
color: #2489CE /*{global-link-color}*/ | |
} | |
.ui-link:hover{ | |
color: #2489CE /*{global-link-hover}*/ | |
} | |
.ui-link:active{ | |
color: #2489CE /*{global-link-active}*/ | |
} | |
.ui-link:visited{ | |
color: #2489CE /*{global-link-visited}*/ | |
} | |
/* Active class used as the "on" state across all themes | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-btn-active { | |
border: 1px solid #155678 /*{global-active-border}*/; | |
background: #4596ce /*{global-active-background-color}*/; | |
font-weight: bold; | |
color: #fff /*{global-active-color}*/; | |
cursor: pointer; | |
text-shadow: 0 /*{global-active-shadow-x}*/ -1px /*{global-active-shadow-y}*/ 1px /*{global-active-shadow-radius}*/ #145072 /*{global-active-shadow-color}*/; | |
text-decoration: none; | |
background-image: -webkit-gradient(linear, left top, left bottom, from(#85bae4 /*{global-active-background-start}*/), to(#5393c5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */ | |
background-image: -webkit-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */ | |
background-image: -moz-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* FF3.6 */ | |
background-image: -ms-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* IE10 */ | |
background-image: -o-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Opera 11.10+ */ | |
background-image: linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); | |
outline: none; | |
font-family: Helvetica, Arial, sans-serif /*{global-active-font}*/; | |
} | |
.ui-btn-active a.ui-link-inherit { | |
color: #fff /*{global-active-color}*/; | |
} | |
/* 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 /*{global-radii-blocks}*/; | |
-webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; | |
border-top-left-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-tr { | |
-moz-border-radius-topright: .6em /*{global-radii-blocks}*/; | |
-webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; | |
border-top-right-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-bl { | |
-moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; | |
-webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; | |
border-bottom-left-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-br { | |
-moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; | |
-webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; | |
border-bottom-right-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-top { | |
-moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; | |
-webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; | |
border-top-left-radius: .6em /*{global-radii-blocks}*/; | |
-moz-border-radius-topright: .6em /*{global-radii-blocks}*/; | |
-webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; | |
border-top-right-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-bottom { | |
-moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; | |
-webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; | |
border-bottom-left-radius: .6em /*{global-radii-blocks}*/; | |
-moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; | |
-webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; | |
border-bottom-right-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-right { | |
-moz-border-radius-topright: .6em /*{global-radii-blocks}*/; | |
-webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; | |
border-top-right-radius: .6em /*{global-radii-blocks}*/; | |
-moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; | |
-webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; | |
border-bottom-right-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-left { | |
-moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; | |
-webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; | |
border-top-left-radius: .6em /*{global-radii-blocks}*/; | |
-moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; | |
-webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; | |
border-bottom-left-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-all { | |
-moz-border-radius: .6em /*{global-radii-blocks}*/; | |
-webkit-border-radius: .6em /*{global-radii-blocks}*/; | |
border-radius: .6em /*{global-radii-blocks}*/; | |
} | |
.ui-corner-none { | |
-moz-border-radius: 0; | |
-webkit-border-radius: 0; | |
border-radius: 0; | |
} | |
/* Interaction cues | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-disabled { | |
opacity: .3; | |
} | |
.ui-disabled, | |
.ui-disabled a { | |
cursor: default; | |
} | |
/* Icons | |
-----------------------------------------------------------------------------------------------------------*/ | |
.ui-icon, | |
.ui-icon-searchfield:after { | |
background: #666 /*{global-icon-color}*/; | |
background: rgba(0,0,0,.4) /*{global-icon-disc}*/; | |
background-image: url(images/icons-18-white.png) /*{global-icon-set}*/; | |
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-searchfield:after, | |
.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, | |
.ui-icon-searchfield:after { | |
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-checkbox .ui-icon { | |
-moz-border-radius: 3px; | |
-webkit-border-radius: 3px; | |
border-radius: 3px; | |
} | |
.ui-icon-checkbox-off, | |
.ui-icon-radio-off { | |
background-color: transparent; | |
} | |
.ui-checkbox-on .ui-icon, | |
.ui-radio-on .ui-icon { | |
background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */ | |
} | |
/* 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 /*{global-radii-buttons}*/; | |
-webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; | |
border-top-left-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-tr { | |
-moz-border-radius-topright: 1em /*{global-radii-buttons}*/; | |
-webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; | |
border-top-right-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-bl { | |
-moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; | |
-webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; | |
border-bottom-left-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-br { | |
-moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; | |
-webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; | |
border-bottom-right-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-top { | |
-moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; | |
-webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; | |
border-top-left-radius: 1em /*{global-radii-buttons}*/; | |
-moz-border-radius-topright: 1em /*{global-radii-buttons}*/; | |
-webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; | |
border-top-right-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-bottom { | |
-moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; | |
-webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; | |
border-bottom-left-radius: 1em /*{global-radii-buttons}*/; | |
-moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; | |
-webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; | |
border-bottom-right-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-right { | |
-moz-border-radius-topright: 1em /*{global-radii-buttons}*/; | |
-webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; | |
border-top-right-radius: 1em /*{global-radii-buttons}*/; | |
-moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; | |
-webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; | |
border-bottom-right-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-left { | |
-moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; | |
-webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; | |
border-top-left-radius: 1em /*{global-radii-buttons}*/; | |
-moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; | |
-webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; | |
border-bottom-left-radius: 1em /*{global-radii-buttons}*/; | |
} | |
.ui-btn-corner-all { | |
-moz-border-radius: 1em /*{global-radii-buttons}*/; | |
-webkit-border-radius: 1em /*{global-radii-buttons}*/; | |
border-radius: 1em /*{global-radii-buttons}*/; | |
} | |
/* 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; | |
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 /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; | |
-webkit-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; | |
box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; | |
} | |
.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 /*{global-active-background-color}*/; | |
-webkit-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; | |
box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; | |
} | |
/* 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. | |
*/ | |
/* 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; } | |
/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */ | |
.ui-page { outline: none; } | |
/* native overflow scrolling */ | |
.ui-page.ui-mobile-touch-overflow, | |
.ui-mobile-touch-overflow.ui-native-fixed .ui-content { | |
overflow: auto; | |
height: 100%; | |
-webkit-overflow-scrolling: touch; | |
-moz-overflow-scrolling: touch; | |
-o-overflow-scrolling: touch; | |
-ms-overflow-scrolling: touch; | |
overflow-scrolling: touch; | |
} | |
.ui-page.ui-mobile-touch-overflow, | |
.ui-page.ui-mobile-touch-overflow * { | |
/* some level of transform keeps elements from blinking out of visibility on iOS */ | |
-webkit-transform: rotateY(0); | |
} | |
.ui-page.ui-mobile-pre-transition { | |
display: block; | |
} | |
/* 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 { min-height: 1.1em; 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; } | |
/* native fixed headers and footers */ | |
.ui-mobile-touch-overflow.ui-page.ui-native-fixed, | |
.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen { | |
overflow: visible; | |
} | |
.ui-mobile-touch-overflow.ui-native-fixed .ui-header, | |
.ui-mobile-touch-overflow.ui-native-fixed .ui-footer { | |
position: fixed; | |
left: 0; | |
right: 0; | |
top: 0; | |
z-index: 200; | |
} | |
.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer { | |
top: auto; | |
bottom: 0; | |
} | |
.ui-mobile-touch-overflow.ui-native-fixed .ui-content { | |
padding-top: 2.5em; | |
padding-bottom: 3em; | |
top: 0; | |
bottom: 0; | |
height: auto; | |
position: absolute; | |
} | |
.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content { | |
padding-top: 0; | |
padding-bottom: 0; | |
} | |
.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header, | |
.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer { | |
opacity: .9; | |
} | |
.ui-native-bars-hidden { | |
display: none; | |
} | |
/* 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-animation-timing-function: linear; | |
} | |
@-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.out { | |
-webkit-transform: translateX(-100%); | |
-webkit-animation-name: slideouttoleft; | |
} | |
.slide.in { | |
-webkit-transform: translateX(0); | |
-webkit-animation-name: slideinfromright; | |
} | |
.slide.out.reverse { | |
-webkit-transform: translateX(100%); | |
-webkit-animation-name: slideouttoright; | |
} | |
.slide.in.reverse { | |
-webkit-transform: translateX(0); | |
-webkit-animation-name: slideinfromleft; | |
} | |
.slideup.out { | |
-webkit-animation-name: dontmove; | |
z-index: 0; | |
} | |
.slideup.in { | |
-webkit-transform: translateY(0); | |
-webkit-animation-name: slideinfrombottom; | |
z-index: 10; | |
} | |
.slideup.in.reverse { | |
z-index: 0; | |
-webkit-animation-name: dontmove; | |
} | |
.slideup.out.reverse { | |
-webkit-transform: translateY(100%); | |
z-index: 10; | |
-webkit-animation-name: slideouttobottom; | |
} | |
.slidedown.out { | |
-webkit-animation-name: dontmove; | |
z-index: 0; | |
} | |
.slidedown.in { | |
-webkit-transform: translateY(0); | |
-webkit-animation-name: slideinfromtop; | |
z-index: 10; | |
} | |
.slidedown.in.reverse { | |
z-index: 0; | |
-webkit-animation-name: dontmove; | |
} | |
.slidedown.out.reverse { | |
-webkit-transform: translateY(-100%); | |
z-index: 10; | |
-webkit-animation-name: slideouttotop; | |
} | |
@-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.out { | |
z-index: 0; | |
-webkit-animation-name: fadeout; | |
} | |
.fade.in { | |
opacity: 1; | |
z-index: 10; | |
-webkit-animation-name: fadein; | |
} | |
/* The properties in this 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. | |
*/ | |
.viewport-flip { | |
-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.out { | |
-webkit-transform: rotateY(-180deg) scale(.8); | |
-webkit-animation-name: flipouttoleft; | |
} | |
.flip.in { | |
-webkit-transform: rotateY(0) scale(1); | |
-webkit-animation-name: flipinfromleft; | |
} | |
/* Shake it all about */ | |
.flip.out.reverse { | |
-webkit-transform: rotateY(180deg) scale(.8); | |
-webkit-animation-name: flipouttoright; | |
} | |
.flip.in.reverse { | |
-webkit-transform: rotateY(0) scale(1); | |
-webkit-animation-name: flipinfromright; | |
} | |
@-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.in.reverse { | |
z-index: 0; | |
-webkit-animation-name: dontmove; | |
} | |
.pop.out.reverse { | |
-webkit-transform: scale(.2); | |
opacity: 0; | |
-webkit-animation-name: popout; | |
z-index: 10; | |
} | |
@-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; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; zoom: 1; } | |
.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; } | |
.ui-btn-icon-notext { width: 24px; height: 24px; } | |
.ui-btn-icon-notext .ui-btn-inner { padding: 2px 1px 2px 3px; } | |
.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-btn-icon-top .ui-icon { top: 10px; } | |
.ui-btn-icon-bottom .ui-icon { bottom: 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; } | |
/*hiding native button,inputs */ | |
.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: .1; cursor: pointer; background: transparent; font-size: 1px; border: none; line-height: 999px; } | |
/* | |
* jQuery Mobile Framework | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. | |
*/ | |
.ui-collapsible { 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: 10px 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; | |
margin: 0 -8px; | |
padding: 10px 16px; | |
border-top: none; /* Overrides ui-btn-up-* */ | |
background-image: none; /* Overrides ui-btn-up-* */ | |
font-weight: normal; /* Overrides ui-btn-up-* */ | |
} | |
.ui-collapsible-content-collapsed { display: none; } | |
.ui-collapsible-set { margin: .5em 0; } | |
.ui-collapsible-set .ui-collapsible { 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 { display: inline-block; margin: 0 -5px 0 0; } | |
.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; margin: 0 -1px 0 0; } | |
.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; } | |
*/ | |
@media all and (min-width: 450px){ | |
.ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } | |
.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-inner, .ui-radio .ui-btn-inner { white-space: normal; } | |
.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-icon, .ui-radio .ui-icon { top: 1.1em; } | |
.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 { padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; } | |
.ui-field-contain:first-child { border-top-width: 0; } | |
@media all and (min-width: 450px){ | |
.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%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; } | |
@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }} | |
.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; } | |
.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: block; min-height: 1em; } | |
.ui-select .ui-btn-text { text-overflow: ellipsis; overflow: hidden;} | |
.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; } | |
@media all and (min-width: 450px){ | |
label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } | |
.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-image: none; position: relative; } | |
.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; } | |
.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!*/ | |
@media all and (min-width: 450px){ | |
label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 } | |
input.ui-input-text, | |
textarea.ui-input-text, | |
.ui-input-search { width: 60%; display: inline-block; } | |
.ui-input-search { width: 50%; } | |
.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 { position: relative; z-index: 1; } | |
.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 15px .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-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count { padding-right: 45px; } | |
.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 30px; } | |
.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; } | |
.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; } | |
@media all and (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-has-count .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; z-index: 2; } | |
.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; z-index: -1;} | |
.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;} | |
.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; } | |
.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; } | |
.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; } | |
.ui-li.ui-screen-hidden{display:none;} | |
/* 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 { 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; } | |
@media all and (min-width: 480px){ | |
label.ui-slider { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } | |
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%; } | |
a.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 } | |
/*! jQuery Mobile v1.0rc2 jquerymobile.com | jquery.org/license */ | |
.ui-bar-a{border:1px solid #2a2a2a;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#111));background-image:-webkit-linear-gradient(#3c3c3c,#111);background-image:-moz-linear-gradient(#3c3c3c,#111);background-image:-ms-linear-gradient(#3c3c3c,#111);background-image:-o-linear-gradient(#3c3c3c,#111);background-image:linear-gradient(#3c3c3c,#111)}.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-bar-a .ui-link:hover{color:#2489ce}.ui-bar-a .ui-link:active{color:#2489ce}.ui-bar-a .ui-link:visited{color:#2489ce}.ui-body-a,.ui-dialog.ui-overlay-a{border:1px solid #2a2a2a;background:#222;color:#fff;text-shadow:0 1px 0 #000;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#222));background-image:-webkit-linear-gradient(#666,#222);background-image:-moz-linear-gradient(#666,#222);background-image:-ms-linear-gradient(#666,#222);background-image:-o-linear-gradient(#666,#222);background-image:linear-gradient(#666,#222)}.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-body-a .ui-link:hover{color:#2489ce}.ui-body-a .ui-link:active{color:#2489ce}.ui-body-a .ui-link:visited{color:#2489ce}.ui-btn-up-a{border:1px solid #222;background:#333;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#555),to(#333));background-image:-webkit-linear-gradient(#555,#333);background-image:-moz-linear-gradient(#555,#333);background-image:-ms-linear-gradient(#555,#333);background-image:-o-linear-gradient(#555,#333);background-image:linear-gradient(#555,#333)}.ui-btn-up-a a.ui-link-inherit{color:#fff}.ui-btn-hover-a{border:1px solid #000;background:#444;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#444));background-image:-webkit-linear-gradient(#666,#444);background-image:-moz-linear-gradient(#666,#444);background-image:-ms-linear-gradient(#666,#444);background-image:-o-linear-gradient(#666,#444);background-image:linear-gradient(#666,#444)}.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:-webkit-gradient(linear,left top,left bottom,from(#333),to(#5a5a5a));background-image:-webkit-linear-gradient(#333,#5a5a5a);background-image:-moz-linear-gradient(#333,#5a5a5a);background-image:-ms-linear-gradient(#333,#5a5a5a);background-image:-o-linear-gradient(#333,#5a5a5a);background-image:linear-gradient(#333,#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}.ui-bar-b{border:1px solid #456f9a;background:#5e87b0;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #254f7a;background-image:-webkit-gradient(linear,left top,left bottom,from(#81a8ce),to(#5e87b0));background-image:-webkit-linear-gradient(#81a8ce,#5e87b0);background-image:-moz-linear-gradient(#81a8ce,#5e87b0);background-image:-ms-linear-gradient(#81a8ce,#5e87b0);background-image:-o-linear-gradient(#81a8ce,#5e87b0);background-image:linear-gradient(#81a8ce,#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:#ddf0f8;font-weight:bold}.ui-bar-b .ui-link:hover{color:#ddf0f8}.ui-bar-b .ui-link:active{color:#ddf0f8}.ui-bar-b .ui-link:visited{color:#ddf0f8}.ui-body-b,.ui-dialog.ui-overlay-b{border:1px solid #c6c6c6;background:#ccc;color:#333;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#e6e6e6),to(#ccc));background-image:-webkit-linear-gradient(#e6e6e6,#ccc);background-image:-moz-linear-gradient(#e6e6e6,#ccc);background-image:-ms-linear-gradient(#e6e6e6,#ccc);background-image:-o-linear-gradient(#e6e6e6,#ccc);background-image:linear-gradient(#e6e6e6,#ccc)}.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:#333}.ui-body-b .ui-link{color:#2489ce;font-weight:bold}.ui-body-b .ui-link:hover{color:#2489ce}.ui-body-b .ui-link:active{color:#2489ce}.ui-body-b .ui-link:visited{color:#2489ce}.ui-btn-up-b{border:1px solid #145072;background:#2567ab;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #145072;background-image:-webkit-gradient(linear,left top,left bottom,from(#5f9cc5),to(#396b9e));background-image:-webkit-linear-gradient(#5f9cc5,#396b9e);background-image:-moz-linear-gradient(#5f9cc5,#396b9e);background-image:-ms-linear-gradient(#5f9cc5,#396b9e);background-image:-o-linear-gradient(#5f9cc5,#396b9e);background-image:linear-gradient(#5f9cc5,#396b9e)}.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:-webkit-gradient(linear,left top,left bottom,from(#72b0d4),to(#4b88b6));background-image:-webkit-linear-gradient(#72b0d4,#4b88b6);background-image:-moz-linear-gradient(#72b0d4,#4b88b6);background-image:-ms-linear-gradient(#72b0d4,#4b88b6);background-image:-o-linear-gradient(#72b0d4,#4b88b6);background-image:linear-gradient(#72b0d4,#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:-webkit-gradient(linear,left top,left bottom,from(#396b9e),to(#4e89c5));background-image:-webkit-linear-gradient(#396b9e,#4e89c5);background-image:-moz-linear-gradient(#396b9e,#4e89c5);background-image:-ms-linear-gradient(#396b9e,#4e89c5);background-image:-o-linear-gradient(#396b9e,#4e89c5);background-image:linear-gradient(#396b9e,#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}.ui-bar-c{border:1px solid #b3b3b3;background:#e9eaeb;color:#3e3e3e;font-weight:bold;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#f0f0f0),to(#e9eaeb));background-image:-webkit-linear-gradient(#f0f0f0,#e9eaeb);background-image:-moz-linear-gradient(#f0f0f0,#e9eaeb);background-image:-ms-linear-gradient(#f0f0f0,#e9eaeb);background-image:-o-linear-gradient(#f0f0f0,#e9eaeb);background-image:linear-gradient(#f0f0f0,#e9eaeb)}.ui-bar-c .ui-link-inherit{color:#3e3e3e}.ui-bar-c .ui-link{color:#7cc4e7;font-weight:bold}.ui-bar-c .ui-link:hover{color:#2489ce}.ui-bar-c .ui-link:active{color:#2489ce}.ui-bar-c .ui-link:visited{color:#2489ce}.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,.ui-dialog.ui-overlay-c{border:1px solid #b3b3b3;color:#333;text-shadow:0 1px 0 #fff;background:#f0f0f0;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#ddd));background-image:-webkit-linear-gradient(#eee,#ddd);background-image:-moz-linear-gradient(#eee,#ddd);background-image:-ms-linear-gradient(#eee,#ddd);background-image:-o-linear-gradient(#eee,#ddd);background-image:linear-gradient(#eee,#ddd)}.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:#333}.ui-body-c .ui-link{color:#2489ce;font-weight:bold}.ui-body-c .ui-link:hover{color:#2489ce}.ui-body-c .ui-link:active{color:#2489ce}.ui-body-c .ui-link:visited{color:#2489ce}.ui-btn-up-c{border:1px solid #ccc;background:#eee;font-weight:bold;color:#444;text-shadow:0 1px 1px #f6f6f6;background-image:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#eee));background-image:-webkit-linear-gradient(#fdfdfd,#eee);background-image:-moz-linear-gradient(#fdfdfd,#eee);background-image:-ms-linear-gradient(#fdfdfd,#eee);background-image:-o-linear-gradient(#fdfdfd,#eee);background-image:linear-gradient(#fdfdfd,#eee)}.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:-webkit-gradient(linear,left top,left bottom,from(#ededed),to(#dadada));background-image:-webkit-linear-gradient(#ededed,#dadada);background-image:-moz-linear-gradient(#ededed,#dadada);background-image:-ms-linear-gradient(#ededed,#dadada);background-image:-o-linear-gradient(#ededed,#dadada);background-image:linear-gradient(#ededed,#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:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#fdfdfd));background-image:-webkit-linear-gradient(#eee,#fdfdfd);background-image:-moz-linear-gradient(#eee,#fdfdfd);background-image:-ms-linear-gradient(#eee,#fdfdfd);background-image:-o-linear-gradient(#eee,#fdfdfd);background-image:linear-gradient(#eee,#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}.ui-bar-d{border:1px solid #ccc;background:#bbb;color:#333;text-shadow:0 1px 0 #eee;background-image:-webkit-gradient(linear,left top,left bottom,from(#ddd),to(#bbb));background-image:-webkit-linear-gradient(#ddd,#bbb);background-image:-moz-linear-gradient(#ddd,#bbb);background-image:-ms-linear-gradient(#ddd,#bbb);background-image:-o-linear-gradient(#ddd,#bbb);background-image:linear-gradient(#ddd,#bbb)}.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-bar-d .ui-link:hover{color:#2489ce}.ui-bar-d .ui-link:active{color:#2489ce}.ui-bar-d .ui-link:visited{color:#2489ce}.ui-body-d,.ui-dialog.ui-overlay-d{border:1px solid #ccc;color:#333;text-shadow:0 1px 0 #fff;background:#fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#fff));background-image:-webkit-linear-gradient(#fff,#fff);background-image:-moz-linear-gradient(#fff,#fff);background-image:-ms-linear-gradient(#fff,#fff);background-image:-o-linear-gradient(#fff,#fff);background-image:linear-gradient(#fff,#fff)}.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:#333}.ui-body-d .ui-link{color:#2489ce;font-weight:bold}.ui-body-d .ui-link:hover{color:#2489ce}.ui-body-d .ui-link:active{color:#2489ce}.ui-body-d .ui-link:visited{color:#2489ce}.ui-btn-up-d{border:1px solid #ccc;background:#fff;font-weight:bold;color:#444;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#fff));background-image:-webkit-linear-gradient(#fff,#fff);background-image:-moz-linear-gradient(#fff,#fff);background-image:-ms-linear-gradient(#fff,#fff);background-image:-o-linear-gradient(#fff,#fff);background-image:linear-gradient(#fff,#fff)}.ui-btn-up-d a.ui-link-inherit{color:#333}.ui-btn-hover-d{border:1px solid #aaa;background:#eee;font-weight:bold;color:#222;cursor:pointer;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#eee));background-image:-webkit-linear-gradient(#fdfdfd,#eee);background-image:-moz-linear-gradient(#fdfdfd,#eee);background-image:-ms-linear-gradient(#fdfdfd,#eee);background-image:-o-linear-gradient(#fdfdfd,#eee);background-image:linear-gradient(#fdfdfd,#eee)}.ui-btn-hover-d a.ui-link-inherit{color:#222}.ui-btn-down-d{border:1px solid #aaa;background:#fff;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#fff));background-image:-webkit-linear-gradient(#eee,#fff);background-image:-moz-linear-gradient(#eee,#fff);background-image:-ms-linear-gradient(#eee,#fff);background-image:-o-linear-gradient(#eee,#fff);background-image:linear-gradient(#eee,#fff)}.ui-btn-down-d a.ui-link-inherit{color:#111}.ui-btn-up-d,.ui-btn-hover-d,.ui-btn-down-d{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-e{border:1px solid #f7c942;background:#fadb4e;color:#333;text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fceda7),to(#fadb4e));background-image:-webkit-linear-gradient(#fceda7,#fadb4e);background-image:-moz-linear-gradient(#fceda7,#fadb4e);background-image:-ms-linear-gradient(#fceda7,#fadb4e);background-image:-o-linear-gradient(#fceda7,#fadb4e);background-image:linear-gradient(#fceda7,#fadb4e)}.ui-bar-e,.ui-bar-e input,.ui-bar-e select,.ui-bar-e textarea,.ui-bar-e 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-bar-e .ui-link:hover{color:#2489ce}.ui-bar-e .ui-link:active{color:#2489ce}.ui-bar-e .ui-link:visited{color:#2489ce}.ui-body-e,.ui-dialog.ui-overlay-e{border:1px solid #f7c942;color:#333;text-shadow:0 1px 0 #fff;background:#faeb9e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#faeb9e));background-image:-webkit-linear-gradient(#fff,#faeb9e);background-image:-moz-linear-gradient(#fff,#faeb9e);background-image:-ms-linear-gradient(#fff,#faeb9e);background-image:-o-linear-gradient(#fff,#faeb9e);background-image:linear-gradient(#fff,#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:#333}.ui-body-e .ui-link{color:#2489ce;font-weight:bold}.ui-body-e .ui-link:hover{color:#2489ce}.ui-body-e .ui-link:active{color:#2489ce}.ui-body-e .ui-link:visited{color:#2489ce}.ui-btn-up-e{border:1px solid #f7c942;background:#fadb4e;font-weight:bold;color:#333;text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fceda7),to(#fadb4e));background-image:-webkit-linear-gradient(#fceda7,#fadb4e);background-image:-moz-linear-gradient(#fceda7,#fadb4e);background-image:-ms-linear-gradient(#fceda7,#fadb4e);background-image:-o-linear-gradient(#fceda7,#fadb4e);background-image:linear-gradient(#fceda7,#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:-webkit-gradient(linear,left top,left bottom,from(#fcf0b5),to(#fbe26f));background-image:-webkit-linear-gradient(#fcf0b5,#fbe26f);background-image:-moz-linear-gradient(#fcf0b5,#fbe26f);background-image:-ms-linear-gradient(#fcf0b5,#fbe26f);background-image:-o-linear-gradient(#fcf0b5,#fbe26f);background-image:linear-gradient(#fcf0b5,#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 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fadb4e),to(#fceda7));background-image:-webkit-linear-gradient(#fadb4e,#fceda7);background-image:-moz-linear-gradient(#fadb4e,#fceda7);background-image:-ms-linear-gradient(#fadb4e,#fceda7);background-image:-o-linear-gradient(#fadb4e,#fceda7);background-image:linear-gradient(#fadb4e,#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}a.ui-link-inherit{text-decoration:none!important}.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:-webkit-gradient(linear,left top,left bottom,from(#85bae4),to(#5393c5));background-image:-webkit-linear-gradient(#85bae4,#5393c5);background-image:-moz-linear-gradient(#85bae4,#5393c5);background-image:-ms-linear-gradient(#85bae4,#5393c5);background-image:-o-linear-gradient(#85bae4,#5393c5);background-image:linear-gradient(#85bae4,#5393c5);font-family:Helvetica,Arial,sans-serif}.ui-btn-active a.ui-link-inherit{color:#fff}.ui-btn-inner{border-top:1px solid #fff;border-color:rgba(255,255,255,.3)}.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}.ui-corner-none{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.ui-br{border-bottom:#828282;border-bottom:rgba(130,130,130,.3);border-bottom-width:1px;border-bottom-style:solid}.ui-disabled{opacity:.3}.ui-disabled,.ui-disabled a{pointer-events:none;cursor:default}.ui-icon,.ui-icon-searchfield:after{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}.ui-icon-alt{background:#fff;background:rgba(255,255,255,.3);background-image:url(images/icons-18-black.png);background-repeat:no-repeat}@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-searchfield:after,.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)}}.ui-icon-plus{background-position:-0 50%}.ui-icon-minus{background-position:-36px 50%}.ui-icon-delete{background-position:-72px 50%}.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%}.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,.ui-icon-searchfield:after{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%}.ui-checkbox .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-icon-checkbox-off,.ui-icon-radio-off{background-color:transparent}.ui-checkbox-on .ui-icon,.ui-radio-on .ui-icon{background-color:#4596ce}.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}.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}.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;background-clip:padding-box}.ui-overlay{background:#666;opacity:.5;filter:Alpha(Opacity=50);position:absolute;width:100%;height:100%}.ui-overlay-shadow{-moz-box-shadow:0 0 12px rgba(0,0,0,.6);-webkit-box-shadow:0 0 12px rgba(0,0,0,.6);box-shadow:0 0 12px rgba(0,0,0,.6)}.ui-shadow{-moz-box-shadow:0 1px 4px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 4px rgba(0,0,0,.3);box-shadow:0 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:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.ui-shadow-inset{-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);box-shadow:inset 0 1px 4px rgba(0,0,0,.2)}.ui-icon-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.4);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.4);box-shadow:0 1px 0 rgba(255,255,255,.4)}.ui-focus{-moz-box-shadow:0 0 12px #387bbe;-webkit-box-shadow:0 0 12px #387bbe;box-shadow:0 0 12px #387bbe}.ui-mobile-nosupport-boxshadow *{-moz-box-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui-mobile-nosupport-boxshadow .ui-focus{outline-width:2px}.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}.ui-mobile-viewport{margin:0;overflow-x:visible;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}body.ui-mobile-viewport,div.ui-mobile-viewport{overflow-x:hidden}.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}.ui-page{outline:0}@media screen and (orientation:portrait){.ui-mobile,.ui-mobile .ui-page{min-height:420px}}@media screen and (orientation:landscape){.ui-mobile,.ui-mobile .ui-page{min-height:300px}}.ui-page.ui-mobile-touch-overflow,.ui-mobile-touch-overflow.ui-native-fixed .ui-content{overflow:auto;height:100%;-webkit-overflow-scrolling:touch;-moz-overflow-scrolling:touch;-o-overflow-scrolling:touch;-ms-overflow-scrolling:touch;overflow-scrolling:touch}.ui-page.ui-mobile-touch-overflow,.ui-page.ui-mobile-touch-overflow *{-webkit-transform:rotateY(0)}.ui-page.ui-mobile-pre-transition{display:block}.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}.ui-mobile-rendering>*{visibility:hidden}.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{min-height:1.1em;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}.ui-footer .ui-title{margin:.6em 15px .8em}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-mobile-touch-overflow.ui-page.ui-native-fixed,.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen{overflow:visible}.ui-mobile-touch-overflow.ui-native-fixed .ui-header,.ui-mobile-touch-overflow.ui-native-fixed .ui-footer{position:fixed;left:0;right:0;top:0;z-index:200}.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer{top:auto;bottom:0}.ui-mobile-touch-overflow.ui-native-fixed .ui-content{padding-top:2.5em;padding-bottom:3em;top:0;bottom:0;height:auto;position:absolute}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content{padding-top:0;padding-bottom:0}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header,.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer{opacity:.9}.ui-native-bars-hidden{display:none}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.ui-hide-label label,.ui-hidden-accessible{position:absolute!important;left:-9999px;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}@-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.out{z-index:0;-webkit-animation-name:fadeout}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.viewport-flip{-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)}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}@-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)}}@-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.in.reverse{z-index:0;-webkit-animation-name:dontmove}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}@-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}}.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}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.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}.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}.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}.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)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.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}.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}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.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;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative;zoom:1}.ui-btn input,.ui-btn button{z-index:2}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{width:24px;height:24px}.ui-btn-icon-notext .ui-btn-inner{padding:2px 1px 2px 3px}.ui-btn-text{position:relative;z-index:1}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-9999px}.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}.ui-btn-icon-notext .ui-icon{display:block;z-index:0}.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-btn-icon-top .ui-icon{top:10px}.ui-btn-icon-bottom .ui-icon{bottom: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-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:.1;cursor:pointer;background:#fff;background:rgba(255,255,255,0);filter:Alpha(Opacity=.0001);font-size:1px;border:0;line-height:999px}.ui-collapsible{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 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;top:-9999px;left:0}.ui-collapsible-content{display:block;margin:0 -8px;padding:10px 16px;border-top:0;background-image:none;font-weight:normal}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible{margin:-1px 0 0}.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:100%}.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-controls label.ui-select{position:absolute;left:-9999px}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-select{display:inline-block;margin:0 -5px 0 0}.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{float:left;margin:0 -1px 0 0}.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}@media all and (min-width:450px){.ui-field-contain .ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-controlgroup-controls{width:60%;display:inline-block}.ui-field-contain .ui-controlgroup .ui-select{width:100%}.ui-field-contain .ui-controlgroup-horizontal .ui-select{width:auto}}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{max-width:500px;margin:10% auto 15px auto;width:85%;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{padding:0 15px;z-index:10}.ui-dialog .ui-content{padding:15px}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.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-inner,.ui-radio .ui-btn-inner{white-space:normal}.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-icon,.ui-radio .ui-icon{top:1.1em}.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}.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}.ui-field-contain{padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}@media all and (min-width:450px){.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.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{opacity:1}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;min-height:1.5em;min-height:100%;height:3em;max-height:100%;opacity:0;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0);z-index:2}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:.0001}}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em;overflow:hidden}.ui-select .ui-btn-text{text-overflow:ellipsis}.ui-selectmenu{position:absolute;padding:0;z-index:1100!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:.6em 46px .8em}@media all and (min-width:450px){.ui-field-contain label.ui-select{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain .ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}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:97%}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;background-image:none;position:relative}.ui-icon-searchfield:after{position:absolute;left:7px;top:50%;margin-top:-9px;content:"";width:18px;height:18px;opacity:.5}.ui-input-search input.ui-input-text{border:0;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:-13px}.ui-input-search .ui-input-clear-hidden{display:none}@media all and (min-width:450px){.ui-field-contain label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain input.ui-input-text,.ui-field-contain textarea.ui-input-text,.ui-field-contain .ui-input-search{width:60%;display:inline-block}.ui-field-contain .ui-input-search{width:50%}.ui-hide-label input.ui-input-text,.ui-hide-label textarea.ui-input-text,.ui-hide-label .ui-input-search{padding:.4em;width:97%}.ui-input-search input.ui-input-text{width:98%}}.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}.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 15px .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-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-count{padding-right:45px}.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow{padding-right:30px}.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-arrow.ui-li-has-count{padding-right:75px}.ui-li-has-count .ui-btn-text{padding-right:15px}.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-listview .ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-listview .ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-listview .ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (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-has-count .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;z-index:2}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px;z-index:-1}.ui-li-link-alt .ui-btn-inner{padding:0;height:100%;position:absolute;width:100%;top:0;left:0}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview * .ui-btn-inner>.ui-btn>.ui-btn-inner{border-top:0}.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}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}input.ui-slider-input,.ui-field-contain 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%}div.ui-slider-switch{width:99.8%}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}@media all and (min-width:480px){.ui-field-contain label.ui-slider{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-field-contain div.ui-slider{width:43%}}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%}a.ui-slider-handle-snapping{-webkit-transition:left 70ms 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:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px} |
<?php | <?php |
/* | /* |
* Copyright 2010,2011 Alexander Sadleir | * Copyright 2010,2011 Alexander Sadleir |
Licensed under the Apache License, Version 2.0 (the "License"); | Licensed under the Apache License, Version 2.0 (the "License"); |
you may not use this file except in compliance with the License. | you may not use this file except in compliance with the License. |
You may obtain a copy of the License at | You may obtain a copy of the License at |
http://www.apache.org/licenses/LICENSE-2.0 | http://www.apache.org/licenses/LICENSE-2.0 |
Unless required by applicable law or agreed to in writing, software | Unless required by applicable law or agreed to in writing, software |
distributed under the License is distributed on an "AS IS" BASIS, | distributed under the License is distributed on an "AS IS" BASIS, |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
See the License for the specific language governing permissions and | See the License for the specific language governing permissions and |
limitations under the License. | limitations under the License. |
*/ | */ |
// Copyright 2009 Google Inc. All Rights Reserved. | // Copyright 2009 Google Inc. All Rights Reserved. |
$GA_ACCOUNT = "MO-22173039-1"; | $GA_ACCOUNT = "MO-22173039-1"; |
$GA_PIXEL = "/lib/ga.php"; | $GA_PIXEL = "/lib/ga.php"; |
function googleAnalyticsGetImageUrl() { | function googleAnalyticsGetImageUrl() { |
global $GA_ACCOUNT, $GA_PIXEL; | global $GA_ACCOUNT, $GA_PIXEL; |
//if (stristr($_SERVER['HTTP_USER_AGENT'], 'Googlebot') return ""; | //if (stristr($_SERVER['HTTP_USER_AGENT'], 'Googlebot') return ""; |
$url = ""; | $url = ""; |
$url.= $GA_PIXEL . "?"; | $url.= $GA_PIXEL . "?"; |
$url.= "utmac=" . $GA_ACCOUNT; | $url.= "utmac=" . $GA_ACCOUNT; |
$url.= "&utmn=" . rand(0, 0x7fffffff); | $url.= "&utmn=" . rand(0, 0x7fffffff); |
$referer = (isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : ""); | $referer = (isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : ""); |
$query = $_SERVER["QUERY_STRING"]; | $query = $_SERVER["QUERY_STRING"]; |
$path = $_SERVER["REQUEST_URI"]; | $path = $_SERVER["REQUEST_URI"]; |
if (empty($referer)) { | if (empty($referer)) { |
$referer = "-"; | $referer = "-"; |
} | } |
$url.= "&utmr=" . urlencode($referer); | $url.= "&utmr=" . urlencode($referer); |
if (!empty($path)) { | if (!empty($path)) { |
$url.= "&utmp=" . urlencode($path); | $url.= "&utmp=" . urlencode($path); |
} | } |
$url.= "&guid=ON"; | $url.= "&guid=ON"; |
return str_replace("&", "&", $url); | return str_replace("&", "&", $url); |
} | } |
function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false, $datepicker = false) { | function include_header($pageTitle, $pageType, $opendiv = true, $geolocate = false, $datepicker = false) { |
global $basePath, $GTFSREnabled; | global $basePath, $GTFSREnabled; |
echo ' | echo ' |
<!DOCTYPE html> | <!DOCTYPE html> |
<html lang="en"> | <html lang="en"> |
<head> | <head> |
<meta charset="UTF-8"> | <meta charset="UTF-8"> |
<meta name="viewport" content="width=device-width, initial-scale=1"> | <meta name="viewport" content="width=device-width, initial-scale=1"> |
<title>' . $pageTitle . ' - Canberra Bus Timetable</title> | <title>' . $pageTitle . ' - Canberra Bus Timetable</title> |
<meta name="google-site-verification" content="-53T5Qn4TB_de1NyfR_ZZkEVdUNcNFSaYKSFkWKx-sY" /> | <meta name="google-site-verification" content="-53T5Qn4TB_de1NyfR_ZZkEVdUNcNFSaYKSFkWKx-sY" /> |
<link rel="dns-prefetch" href="//code.jquery.com"> | <link rel="dns-prefetch" href="//code.jquery.com"> |
<link rel="dns-prefetch" href="//ajax.googleapis.com"> | <link rel="dns-prefetch" href="//ajax.googleapis.com"> |
<link rel="stylesheet" href="' . $basePath . 'css/jquery-ui-1.8.12.custom.css" />'; | <link rel="stylesheet" href="' . $basePath . 'css/jquery-ui-1.8.12.custom.css" />'; |
$jqmVersion = "1.0rc1"; | $jqmVersion = "1.0rc1"; |
if (isDebugServer()) { | if (isDebugServer()) { |
$jqmcss = $basePath . "css/jquery.mobile-$jqmVersion.css"; | $jqmcss = $basePath . "css/jquery.mobile-$jqmVersion.css"; |
$jqjs = $basePath . "js/jquery-1.6.2.min.js"; | $jqjs = $basePath . "js/jquery-1.6.2.min.js"; |
$jqmjs = $basePath . "js/jquery.mobile-$jqmVersion.js"; | $jqmjs = $basePath . "js/jquery.mobile-$jqmVersion.js"; |
} else { | } else { |
$jqmcss = "//code.jquery.com/mobile/$jqmVersion/jquery.mobile-$jqmVersion.min.css"; | $jqmcss = "//code.jquery.com/mobile/$jqmVersion/jquery.mobile-$jqmVersion.min.css"; |
$jqjs = "//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"; | $jqjs = "//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"; |
$jqmjs = "//code.jquery.com/mobile/$jqmVersion/jquery.mobile-$jqmVersion.min.js"; | $jqmjs = "//code.jquery.com/mobile/$jqmVersion/jquery.mobile-$jqmVersion.min.js"; |
} | |
} | |
$jqmcss = $basePath . "css/jquery.mobile-b90eab4935.css"; | |
$jqmjs = $basePath . "js/jquery.mobile-b90eab4935.js"; | |
echo '<link rel="stylesheet" href="' . $jqmcss . '" /> | echo '<link rel="stylesheet" href="' . $jqmcss . '" /> |
<script src="' . $jqjs . '"></script> | <script src="' . $jqjs . '"></script> |
<script>$(document).bind("mobileinit", function(){ | <script>$(document).bind("mobileinit", function(){ |
$.mobile.ajaxEnabled = false; | $.mobile.ajaxEnabled = false; |
}); | }); |
</script> | </script> |
<script src="' . $jqmjs . '"></script> | <script src="' . $jqmjs . '"></script> |
<script src="' . $basePath . 'js/jquery.ui.core.min.js"></script> | <script src="' . $basePath . 'js/jquery.ui.core.min.js"></script> |
<script src="' . $basePath . 'js/jquery.ui.position.min.js"></script> | <script src="' . $basePath . 'js/jquery.ui.position.min.js"></script> |
<script src="' . $basePath . 'js/jquery.ui.widget.min.js"></script> | <script src="' . $basePath . 'js/jquery.ui.widget.min.js"></script> |
<script src="' . $basePath . 'js/jquery.ui.autocomplete.min.js"></script> | <script src="' . $basePath . 'js/jquery.ui.autocomplete.min.js"></script> |
<script> | <script> |
$(function() { | $(function() { |
$( "#geolocate" ).autocomplete({ | $( "#geolocate" ).autocomplete({ |
source: "lib/autocomplete.php", | source: "lib/autocomplete.php", |
minLength: 2 | minLength: 2 |
}); | }); |
$( "#from" ).autocomplete({ | $( "#from" ).autocomplete({ |
source: "lib/autocomplete.php", | source: "lib/autocomplete.php", |
minLength: 2 | minLength: 2 |
}); | }); |
$( "#to" ).autocomplete({ | $( "#to" ).autocomplete({ |
source: "lib/autocomplete.php", | source: "lib/autocomplete.php", |
minLength: 2 | minLength: 2 |
}); | }); |
}); | }); |
</script>'; | </script>'; |
echo '<style type="text/css">'; | echo '<style type="text/css">'; |
if (strstr($_SERVER['HTTP_USER_AGENT'], 'Android')) | if (strstr($_SERVER['HTTP_USER_AGENT'], 'Android')) |
echo '.ui-shadow,.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a,.ui-body-b,.ui-btn-up-b,.ui-btn-hover-b, | echo '.ui-shadow,.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a,.ui-body-b,.ui-btn-up-b,.ui-btn-hover-b, |
.ui-btn-down-b,.ui-bar-c,.ui-body-c,.ui-btn-up-c,.ui-btn-hover-c,.ui-btn-down-c,.ui-bar-c,.ui-body-d, | .ui-btn-down-b,.ui-bar-c,.ui-body-c,.ui-btn-up-c,.ui-btn-hover-c,.ui-btn-down-c,.ui-bar-c,.ui-body-d, |
.ui-btn-up-d,.ui-btn-hover-d,.ui-btn-down-d,.ui-bar-d,.ui-body-e,.ui-btn-up-e,.ui-btn-hover-e, | .ui-btn-up-d,.ui-btn-hover-d,.ui-btn-down-d,.ui-bar-d,.ui-body-e,.ui-btn-up-e,.ui-btn-hover-e, |
.ui-btn-down-e,.ui-bar-e,.ui-overlay-shadow,.ui-shadow,.ui-btn-active,.ui-body-a,.ui-bar-a { | .ui-btn-down-e,.ui-bar-e,.ui-overlay-shadow,.ui-shadow,.ui-btn-active,.ui-body-a,.ui-bar-a { |
text-shadow: none; | text-shadow: none; |
box-shadow: none; | box-shadow: none; |
-webkit-box-shadow: none; | -webkit-box-shadow: none; |
}'; | }'; |
echo '</style>'; | echo '</style>'; |
echo '<link rel="stylesheet" href="' . $basePath . 'css/local.css.php" />'; | echo '<link rel="stylesheet" href="' . $basePath . 'css/local.css.php" />'; |
if (isIOSDevice()){ | if (isIOSDevice()){ |
echo '<meta name="apple-mobile-web-app-capable" content="yes" /> | echo '<meta name="apple-mobile-web-app-capable" content="yes" /> |
<meta name="apple-mobile-web-app-status-bar-style" content="black" /> | <meta name="apple-mobile-web-app-status-bar-style" content="black" /> |
<link rel="apple-touch-startup-image" href="startup.png" /> | <link rel="apple-touch-startup-image" href="startup.png" /> |
<link rel="apple-touch-icon" href="apple-touch-icon.png" />'; | <link rel="apple-touch-icon" href="apple-touch-icon.png" />'; |
} | } |
if ($geolocate) { | if ($geolocate) { |
echo "<script> | echo "<script> |
function success(position) { | function success(position) { |
$('#error').val('Location now detected. Please wait for data to load.'); | $('#error').val('Location now detected. Please wait for data to load.'); |
$('#geolocate').val(position.coords.latitude+','+position.coords.longitude); | $('#geolocate').val(position.coords.latitude+','+position.coords.longitude); |
$.ajax({ async: false, | $.ajax({ async: false, |
success: function(){ | success: function(){ |
location.reload(true); | location.reload(true); |
}, | }, |
url: \"include/common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); | url: \"include/common.inc.php?geolocate=yes&lat=\"+position.coords.latitude+\"&lon=\"+position.coords.longitude }); |
} | } |
function error(msg) { | function error(msg) { |
$('#error').val('Error: '+msg); | $('#error').val('Error: '+msg); |
} | } |
function geolocate() { | function geolocate() { |
if (navigator.geolocation) { | if (navigator.geolocation) { |
var options = { | var options = { |
enableHighAccuracy: true, | enableHighAccuracy: true, |
timeout: 60000, | timeout: 60000, |
maximumAge: 10000 | maximumAge: 10000 |
} | } |
navigator.geolocation.getCurrentPosition(success, error, options); | navigator.geolocation.getCurrentPosition(success, error, options); |
} | } |
} | } |
$(document).ready(function() { | $(document).ready(function() { |
$('#here').click(function(event) { $('#geolocate').val(geolocate()); return false;}); | $('#here').click(function(event) { $('#geolocate').val(geolocate()); return false;}); |
$('#here').show(); | $('#here').show(); |
}); | }); |
"; | "; |
if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") | if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") |
echo "geolocate();"; | echo "geolocate();"; |
echo "</script> "; | echo "</script> "; |
} | } |
if (isAnalyticsOn()) | if (isAnalyticsOn()) |
echo ' | echo ' |
<script type="text/javascript">' . " | <script type="text/javascript">' . " |
var _gaq = _gaq || []; | var _gaq = _gaq || []; |
_gaq.push(['_setAccount', 'UA-22173039-1']); | _gaq.push(['_setAccount', 'UA-22173039-1']); |
_gaq.push(['_trackPageview']); | _gaq.push(['_trackPageview']); |
_gaq.push(['_trackPageLoadTime']); | _gaq.push(['_trackPageLoadTime']); |
</script>"; | </script>"; |
echo '</head> | echo '</head> |
<body> | <body> |
<div id="skip"> | <div id="skip"> |
<a href="#maincontent">Skip to content</a> | <a href="#maincontent">Skip to content</a> |
</div> | </div> |
'; | '; |
if ($opendiv) { | if ($opendiv) { |
echo '<div data-role="page"> | echo '<div data-role="page"> |
<div data-role="header" data-position="inline"> | <div data-role="header" data-position="inline"> |
<a href="' . (isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "javascript:history.go(-1)") . '" data-icon="arrow-l" data-rel="back" class="ui-btn-left">Back</a> | <a href="' . (isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "javascript:history.go(-1)") . '" data-icon="arrow-l" data-rel="back" class="ui-btn-left">Back</a> |
<h1>' . $pageTitle . '</h1> | <h1>' . $pageTitle . '</h1> |
<a href="' . $basePath . '/index.php" data-icon="home" class="ui-btn-right">Home</a> | <a href="' . $basePath . '/index.php" data-icon="home" class="ui-btn-right">Home</a> |
</div><!-- /header --> | </div><!-- /header --> |
<a name="maincontent" id="maincontent"></a> | <a name="maincontent" id="maincontent"></a> |
<div data-role="content"> '; | <div data-role="content"> '; |
if ($GTFSREnabled) { | if ($GTFSREnabled) { |
$overrides = getServiceOverride(); | $overrides = getServiceOverride(); |
if ($overrides['service_id']) { | if ($overrides['service_id']) { |
if ($overrides['service_id'] == "noservice") { | if ($overrides['service_id'] == "noservice") { |
echo '<div id="servicewarning">Buses are <strong>not running today</strong> due to industrial action/public holiday. See <a | echo '<div id="servicewarning">Buses are <strong>not running today</strong> due to industrial action/public holiday. See <a |
href="http://www.action.act.gov.au">http://www.action.act.gov.au</a> for details.</div>'; | href="http://www.action.act.gov.au">http://www.action.act.gov.au</a> for details.</div>'; |
} else { | } else { |
echo '<div id="servicewarning">Buses are running on an altered timetable today due to industrial action/public holiday. See <a href="http://www.action.act.gov.au">http://www.action.act.gov.au</a> for details.</div>'; | echo '<div id="servicewarning">Buses are running on an altered timetable today due to industrial action/public holiday. See <a href="http://www.action.act.gov.au">http://www.action.act.gov.au</a> for details.</div>'; |
} | } |
} | } |
$serviceAlerts = getServiceAlertsAsArray("agency", "0"); | $serviceAlerts = getServiceAlertsAsArray("agency", "0"); |
if (isset($serviceAlerts['entity']) && sizeof($serviceAlerts['entity']) > 0) { | if (isset($serviceAlerts['entity']) && sizeof($serviceAlerts['entity']) > 0) { |
foreach ($serviceAlerts['entity'] as $entity) { | foreach ($serviceAlerts['entity'] as $entity) { |
echo "<div id='servicewarning'>" . date("F j, g:i a", strtotime($entity['alert']['active_period'][0]['start'])) . " to " . date("F j, g:i a", strtotime($entity['alert']['active_period'][0]['end'])) . "{$entity['alert']['header_text']['translation'][0]['text']}<br>Warning: {$entity['alert']['description_text']['translation'][0]['text']} | echo "<div id='servicewarning'>" . date("F j, g:i a", strtotime($entity['alert']['active_period'][0]['start'])) . " to " . date("F j, g:i a", strtotime($entity['alert']['active_period'][0]['end'])) . "{$entity['alert']['header_text']['translation'][0]['text']}<br>Warning: {$entity['alert']['description_text']['translation'][0]['text']} |
<br><a href='{$entity['alert']['url']['translation'][0]['text']}'>Source</a> </div>"; | <br><a href='{$entity['alert']['url']['translation'][0]['text']}'>Source</a> </div>"; |
} | } |
} | } |
} | } |
} | } |
} | } |
function include_footer() { | function include_footer() { |
global $basePath; | global $basePath; |
echo '<div id="footer"><a href="' . $basePath . 'about.php">About/Contact Us</a> <a href="' . $basePath . 'feedback.php">Feedback/Bug Report</a> <a href="' . $basePath . 'privacy.php">Privacy Policy</a>'; | echo '<div id="footer"><a href="' . $basePath . 'about.php">About/Contact Us</a> <a href="' . $basePath . 'feedback.php">Feedback/Bug Report</a> <a href="' . $basePath . 'privacy.php">Privacy Policy</a>'; |
echo '</div>'; | echo '</div>'; |
if (isAnalyticsOn()) { | if (isAnalyticsOn()) { |
echo "<script> (function() { | echo "<script> (function() { |
var ga = document.createElement('script'); ga.type = | var ga = document.createElement('script'); ga.type = |
'text/javascript'; ga.async = true; | 'text/javascript'; ga.async = true; |
ga.src = ('https:' == document.location.protocol ? | ga.src = ('https:' == document.location.protocol ? |
'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; |
var s = document.getElementsByTagName('script')[0]; | var s = document.getElementsByTagName('script')[0]; |
s.parentNode.insertBefore(ga, s); | s.parentNode.insertBefore(ga, s); |
})();</script>"; | })();</script>"; |
$googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); | $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); |
echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" /></noscript>'; | echo '<noscript><img src="' . $googleAnalyticsImageUrl . '" /></noscript>'; |
} | } |
echo "\n</div></div></body></html>"; | echo "\n</div></div></body></html>"; |
} | } |
function placeSettings() { | function placeSettings() { |
global $service_periods; | global $service_periods; |
$geoerror = false; | $geoerror = false; |
$geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; | $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; |
echo '<div id="error">'; | echo '<div id="error">'; |
if ($geoerror) { | if ($geoerror) { |
echo 'Sorry, but your location could not currently be detected. | echo 'Sorry, but your location could not currently be detected. |
Please allow location permission, wait for your location to be detected, | Please allow location permission, wait for your location to be detected, |
or enter an address/co-ordinates in the box below.'; | or enter an address/co-ordinates in the box below.'; |
} | } |
echo '</div>'; | echo '</div>'; |
echo '<div id="settings" data-role="collapsible" data-collapsed="' . !$geoerror . '"> | echo '<div id="settings" data-role="collapsible" data-collapsed="' . !$geoerror . '"> |
<h3>Change Location...</h3> | <h3>Change Location...</h3> |
<form action="' . basename($_SERVER['PHP_SELF']) . "?" . $_SERVER['QUERY_STRING'] . '" method="post"> | <form action="' . basename($_SERVER['PHP_SELF']) . "?" . $_SERVER['QUERY_STRING'] . '" method="post"> |
<div class="ui-body"> | <div class="ui-body"> |
<div data-role="fieldcontain"> | <div data-role="fieldcontain"> |
<label for="geolocate"> Current Location: </label> | <label for="geolocate"> Current Location: </label> |
<input type="text" id="geolocate" name="geolocate" value="' . (isset($_SESSION['lat']) && isset($_SESSION['lon']) ? $_SESSION['lat'] . "," . $_SESSION['lon'] : "Enter co-ordinates or address here") . '"/> <a href="#" style="display:none" name="here" id="here">Here?</a> | <input type="text" id="geolocate" name="geolocate" value="' . (isset($_SESSION['lat']) && isset($_SESSION['lon']) ? $_SESSION['lat'] . "," . $_SESSION['lon'] : "Enter co-ordinates or address here") . '"/> <a href="#" style="display:none" name="here" id="here">Here?</a> |
</div> | </div> |
<input type="submit" value="Update"/> | <input type="submit" value="Update"/> |
</div></form> | </div></form> |
</div>'; | </div>'; |
} | } |
function trackEvent($category, $action, $label = "", $value = - 1) { | function trackEvent($category, $action, $label = "", $value = - 1) { |
if (isAnalyticsOn()) { | if (isAnalyticsOn()) { |
echo "\n<script> _gaq.push(['_trackEvent', '$category', '$action'" . ($label != "" ? ", '$label'" : "") . ($value != - 1 ? ", $value" : "") . "]);</script>"; | echo "\n<script> _gaq.push(['_trackEvent', '$category', '$action'" . ($label != "" ? ", '$label'" : "") . ($value != - 1 ? ", $value" : "") . "]);</script>"; |
} | } |
} | } |
//stop list collapsing | //stop list collapsing |
function stopCompare($stopName) { | function stopCompare($stopName) { |
return substr(trim(preg_replace("/\(Platform.*/", "", $stopName)),0,9); | return substr(trim(preg_replace("/\(Platform.*/", "", $stopName)),0,9); |
} | } |
function stopGroupTitle($stopName,$stopdesc) { | function stopGroupTitle($stopName,$stopdesc) { |
if (preg_match("/Dr |Cct |Cir |Av |St |Cr |Parade |Way |Bank /",$stopName)) { | if (preg_match("/Dr |Cct |Cir |Av |St |Cr |Parade |Way |Bank /",$stopName)) { |
$descParts = explode("<br>",$stopdesc); | $descParts = explode("<br>",$stopdesc); |
return trim(str_replace("Street: ","",$descParts[0])); | return trim(str_replace("Street: ","",$descParts[0])); |
} else { | } else { |
return trim(preg_replace("/\(Platform.*/", "",$stopName)); | return trim(preg_replace("/\(Platform.*/", "",$stopName)); |
} | } |
} | } |
function viaPointNames($tripid, $stop_sequence = "") { | function viaPointNames($tripid, $stop_sequence = "") { |
$viaPointNames = Array(); | $viaPointNames = Array(); |
foreach (viaPoints($tripid, $stop_sequence) as $point) { | foreach (viaPoints($tripid, $stop_sequence) as $point) { |
if (strstr($point['stop_name'], "Station") | if (strstr($point['stop_name'], "Station") |
|| strstr($point['stop_name'], "Shops") | || strstr($point['stop_name'], "Shops") |
|| strstr($point['stop_name'], "CIT") | || strstr($point['stop_name'], "CIT") |
|| strstr($point['stop_name'], "School") | || strstr($point['stop_name'], "School") |
|| strstr($point['stop_name'], "University") | || strstr($point['stop_name'], "University") |
) { | ) { |
$viaPointNames[] = $point['stop_name']; | $viaPointNames[] = $point['stop_name']; |
} | } |
} | } |
if (sizeof($viaPointNames) > 0) { | if (sizeof($viaPointNames) > 0) { |
return r_implode(", ", $viaPointNames); | return r_implode(", ", $viaPointNames); |
} else { | } else { |
return ""; | return ""; |
} | } |
} | } |
?> | ?> |
/*! | |
* jQuery Mobile v1.0rc1 | |
* 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", { | |
// decorate the parent _createWidget to trigger `widgetinit` for users | |
// who wish to do post post `widgetcreate` alterations/additions | |
// | |
// TODO create a pull request for jquery ui to trigger this event | |
// in the original _createWidget | |
_createWidget: function() { | |
$.Widget.prototype._createWidget.apply( this, arguments ); | |
this._trigger( 'init' ); | |
}, | |
_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 : a workaround for window.matchMedia | |
* 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" ); | |
/* $.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 = $( "<div id='jquery-mediatest'>" ), | |
fakeBody = $( "<body>" ).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 ]; | |
}; | |
})(); | |
})(jQuery);/* | |
* jQuery Mobile Framework : support tests | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. | |
*/ | |
(function( $, undefined ) { | |
var fakeBody = $( "<body>" ).prependTo( "html" ), | |
fbCSS = fakeBody[ 0 ].style, | |
vendors = [ "Webkit", "Moz", "O" ], | |
webos = "palmGetResource" in window, //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[ props[ 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 = "", | |
link, rebase; | |
if ( !base.length ) { | |
base = fauxEle = $( "<base>", { "href": fauxBase }).appendTo( "head" ); | |
} else { | |
href = base.attr( "href" ); | |
} | |
link = $( "<a href='testurl'></a>" ).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 = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->", a[ 0 ] ); | |
return v > 4 ? v : !v; | |
})(); | |
$.extend( $.support, { | |
orientation: "orientation" in window, | |
touch: "ontouchend" in document, | |
cssTransitions: "WebKitTransitionEvent" in window, | |
pushState: "pushState" in history && "replaceState" in history, | |
mediaquery: $.mobile.media( "only all" ), | |
cssPseudoElement: !!propExists( "content" ), | |
touchOverflow: !!propExists( "overflowScrolling" ), | |
boxShadow: !!propExists( "boxShadow" ) && !bb, | |
scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos, | |
dynamicBaseTag: baseTagTest() | |
}); | |
fakeBody.remove(); | |
// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian) | |
// or that generally work better browsing in regular http for full page refreshes (Opera Mini) | |
// Note: This detection below is used as a last resort. | |
// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible | |
var nokiaLTE7_3 = (function(){ | |
var ua = window.navigator.userAgent; | |
//The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older | |
return ua.indexOf( "Nokia" ) > -1 && | |
( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) && | |
ua.indexOf( "AppleWebKit" ) > -1 && | |
ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ ); | |
})(); | |
$.mobile.ajaxBlacklist = | |
// BlackBerry browsers, pre-webkit | |
window.blackberry && !window.WebKitPoint || | |
// Opera Mini | |
window.operamini && Object.prototype.toString.call( window.operamini ) === "[object OperaMini]" || | |
// Symbian webkits pre 7.3 | |
nokiaLTE7_3; | |
// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices | |
// to render the stylesheets when they're referenced before this script, as we'd recommend doing. | |
// This simply reappends the CSS in place, which for some reason makes it apply | |
if ( nokiaLTE7_3 ) { | |
$(function() { | |
$( "head link[rel=stylesheet]" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" ); | |
}); | |
} | |
// 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, | |
didScroll = false, | |
clickBlockList = [], | |
blockMouseTriggers = false, | |
blockTouchTriggers = false, | |
eventCaptureSupported = "addEventListener" in document, | |
$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, | |
oe, props, ne, prop, ct, touch, i, j; | |
event = $.Event(event); | |
event.type = eventType; | |
oe = event.originalEvent; | |
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 ( i = props.length, prop; i; ) { | |
prop = props[ --i ]; | |
event[ prop ] = oe[ prop ]; | |
} | |
} | |
// make sure that if the mouse and click virtual events are generated | |
// without a .which one is defined | |
if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ){ | |
event.which = 1; | |
} | |
if ( t.search(/^touch/) !== -1 ) { | |
ne = getNativeEvent( oe ); | |
t = ne.touches; | |
ct = ne.changedTouches; | |
touch = ( t && t.length ) ? t[0] : ( (ct && ct.length) ? ct[ 0 ] : undefined ); | |
if ( touch ) { | |
for ( j = 0, len = touchEventProps.length; j < len; j++){ | |
prop = touchEventProps[ j ]; | |
event[ prop ] = touch[ prop ]; | |
} | |
} | |
} | |
return event; | |
} | |
function getVirtualBindingFlags( element ) { | |
var flags = {}, | |
b, k; | |
while ( element ) { | |
b = $.data( element, dataPropertyName ); | |
for ( k in b ) { | |
if ( b[ k ] ) { | |
flags[ k ] = flags.hasVirtualBinding = true; | |
} | |
} | |
element = element.parentNode; | |
} | |
return flags; | |
} | |
function getClosestElementWithVirtualBinding( element, eventType ) { | |
var b; | |
while ( element ) { | |
b = $.data( element, dataPropertyName ); | |
if ( b && ( !eventType || b[ eventType ] ) ) { | |
return element; | |
} | |
element = element.parentNode; | |
} | |
return null; | |
} | |
function enableTouchBindings() { | |
blockTouchTriggers = false; | |
} | |
function disableTouchBindings() { | |
blockTouchTriggers = true; | |
} | |
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 ve; | |
if ( ( flags && flags[ eventType ] ) || | |
( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) { | |
ve = createVirtualEvent( event, eventType ); | |
$( event.target).trigger( ve ); | |
} | |
return ve; | |
} | |
function mouseEventCallback( event ) { | |
var touchID = $.data(event.target, touchTargetPropertyName); | |
if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ){ | |
var ve = triggerVirtualEvent( "v" + event.type, event ); | |
if ( ve ) { | |
if ( ve.isDefaultPrevented() ) { | |
event.preventDefault(); | |
} | |
if ( ve.isPropagationStopped() ) { | |
event.stopPropagation(); | |
} | |
if ( ve.isImmediatePropagationStopped() ) { | |
event.stopImmediatePropagation(); | |
} | |
} | |
} | |
} | |
function handleTouchStart( event ) { | |
var touches = getNativeEvent( event ).touches, | |
target, flags; | |
if ( touches && touches.length === 1 ) { | |
target = event.target; | |
flags = getVirtualBindingFlags( target ); | |
if ( flags.hasVirtualBinding ) { | |
lastTouchID = nextTouchID++; | |
$.data( target, touchTargetPropertyName, lastTouchID ); | |
clearResetTimer(); | |
disableMouseBindings(); | |
didScroll = false; | |
var t = getNativeEvent( event ).touches[ 0 ]; | |
startX = t.pageX; | |
startY = t.pageY; | |
triggerVirtualEvent( "vmouseover", event, flags ); | |
triggerVirtualEvent( "vmousedown", event, flags ); | |
} | |
} | |
} | |
function handleScroll( event ) { | |
if ( blockTouchTriggers ) { | |
return; | |
} | |
if ( !didScroll ) { | |
triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) ); | |
} | |
didScroll = true; | |
startResetTimer(); | |
} | |
function handleTouchMove( event ) { | |
if ( blockTouchTriggers ) { | |
return; | |
} | |
var t = getNativeEvent( event ).touches[ 0 ], | |
didCancel = didScroll, | |
moveThreshold = $.vmouse.moveDistanceThreshold; | |
didScroll = didScroll || | |
( Math.abs(t.pageX - startX) > moveThreshold || | |
Math.abs(t.pageY - startY) > moveThreshold ), | |
flags = getVirtualBindingFlags( event.target ); | |
if ( didScroll && !didCancel ) { | |
triggerVirtualEvent( "vmousecancel", event, flags ); | |
} | |
triggerVirtualEvent( "vmousemove", event, flags ); | |
startResetTimer(); | |
} | |
function handleTouchEnd( event ) { | |
if ( blockTouchTriggers ) { | |
return; | |
} | |
disableTouchBindings(); | |
var flags = getVirtualBindingFlags( event.target ), | |
t; | |
triggerVirtualEvent( "vmouseup", event, flags ); | |
if ( !didScroll ) { | |
var ve = triggerVirtualEvent( "vclick", event, flags ); | |
if ( ve && ve.isDefaultPrevented() ) { | |
// 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. | |
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 = $.data( ele, 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. | |
if ( !hasVirtualBindings( this ) ) { | |
$.data( this, 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 = $.data( this, 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 ) | |
.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 ); | |
} | |
} | |
}, | |
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 ) | |
.unbind( "touchmove", handleTouchMove ) | |
.unbind( "touchend", handleTouchEnd ) | |
.unbind( "scroll", handleScroll ); | |
} | |
} | |
var $this = $( this ), | |
bindings = $.data( this, dataPropertyName ); | |
// teardown may be called when an element was | |
// removed from the DOM. If this is the case, | |
// jQuery core may have already stripped the element | |
// of any data bindings so we need to check it before | |
// using it. | |
if ( bindings ) { | |
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, | |
target = e.target, | |
x, y, ele, i, o, touchID; | |
if ( cnt ) { | |
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. | |
ele = target; | |
while ( ele ) { | |
for ( i = 0; i < cnt; i++ ) { | |
o = clickBlockList[ i ]; | |
touchID = 0; | |
if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) || | |
$.data( ele, 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( $, window, undefined ) { | |
// add new event shortcuts | |
$.each( ( "touchstart touchmove touchend orientationchange throttledresize " + | |
"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 origTarget = event.target, | |
origEvent = event.originalEvent, | |
timer; | |
function clearTapTimer() { | |
clearTimeout( timer ); | |
} | |
function clearTapHandlers() { | |
clearTapTimer(); | |
$this.unbind( "vclick", clickHandler ) | |
.unbind( "vmouseup", clearTapTimer ) | |
.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( "vmouseup", clearTapTimer ) | |
.bind( "vclick", clickHandler ); | |
timer = setTimeout(function() { | |
triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) ); | |
}, 750 ); | |
}); | |
} | |
}; | |
// also handles swipeleft, swiperight | |
$.event.special.swipe = { | |
scrollSupressionThreshold: 10, // More than this horizontal displacement, and we will suppress scrolling. | |
durationThreshold: 1000, // More time than this, and it isn't a swipe. | |
horizontalDistanceThreshold: 30, // Swipe horizontal displacement must be more than this. | |
verticalDistanceThreshold: 75, // Swipe vertical displacement must be less than this. | |
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 ] ) > $.event.special.swipe.scrollSupressionThreshold ) { | |
event.preventDefault(); | |
} | |
} | |
$this.bind( touchMoveEvent, moveHandler ) | |
.one( touchStopEvent, function( event ) { | |
$this.unbind( touchMoveEvent, moveHandler ); | |
if ( start && stop ) { | |
if ( stop.time - start.time < $.event.special.swipe.durationThreshold && | |
Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold && | |
Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) { | |
start.origin.trigger( "swipe" ) | |
.trigger( start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight" ); | |
} | |
} | |
start = stop = undefined; | |
}); | |
}); | |
} | |
}; | |
(function( $, window ) { | |
// "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( "throttledresize", 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( "throttledresize", 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() | |
$.event.special.orientationchange.orientation = get_orientation = function() { | |
var elem = document.documentElement; | |
return elem && elem.clientWidth / elem.clientHeight < 1.1 ? "portrait" : "landscape"; | |
}; | |
})( jQuery, window ); | |
// throttled resize event | |
(function() { | |
$.event.special.throttledresize = { | |
setup: function() { | |
$( this ).bind( "resize", handler ); | |
}, | |
teardown: function(){ | |
$( this ).unbind( "resize", handler ); | |
} | |
}; | |
var throttle = 250, | |
handler = function() { | |
curr = ( new Date() ).getTime(); | |
diff = curr - lastCall; | |
if ( diff >= throttle ) { | |
lastCall = curr; | |
$( this ).trigger( "throttledresize" ); | |
} else { | |
if ( heldCall ) { | |
clearTimeout( heldCall ); | |
} | |
// Promise a held call will still execute | |
heldCall = setTimeout( handler, throttle - diff ); | |
} | |
}, | |
lastCall = 0, | |
heldCall, | |
curr, | |
diff; | |
})(); | |
$.each({ | |
scrollstop: "scrollstart", | |
taphold: "tap", | |
swipeleft: "swipe", | |
swiperight: "swipe" | |
}, function( event, sourceEvent ) { | |
$.event.special[ event ] = { | |
setup: function() { | |
$( this ).bind( sourceEvent, $.noop ); | |
} | |
}; | |
}); | |
})( jQuery, this ); | |
/*! | |
* 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 <jQuery.fn.hashchange.delay> and | |
// lowered its default value to 50. Added <jQuery.fn.hashchange.domain> | |
// and <jQuery.fn.hashchange.src> 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 <hashchange event> 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 <hashchange event> | |
// 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 <jQuery.fn.hashchange.src> 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 <jQuery.fn.hashchange.domain>), 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 <jQuery.fn.hashchange.delay> 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 <jQuery.fn.hashchange>: | |
// | |
// > // 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 = $('<iframe tabindex="-1" title="empty"/>').hide() | |
// When Iframe has completely loaded, initialize the history and | |
// start polling. | |
.one( 'load', function(){ | |
iframe_src || history_set( get_fragment() ); | |
poll(); | |
}) | |
// Load Iframe src if specified, otherwise nothing. | |
.attr( 'src', iframe_src || 'javascript:0' ) | |
// Append Iframe after the end of the body to prevent unnecessary | |
// initial page scrolling (yes, this works). | |
.insertAfter( 'body' )[0].contentWindow; | |
// Whenever `document.title` changes, update the Iframe's title to | |
// prettify the back/next history menu entries. Since IE sometimes | |
// errors with "Unspecified error" the very first time this is set | |
// (yes, very useful) wrap this with a try/catch block. | |
doc.onpropertychange = function(){ | |
try { | |
if ( event.propertyName === 'title' ) { | |
iframe.document.title = doc.title; | |
} | |
} catch(e) {} | |
}; | |
} | |
}; | |
// Override the "stop" method since an IE6/7 Iframe was created. Even | |
// if there are no longer any bound event handlers, the polling loop | |
// is still necessary for back/next to work at all! | |
self.stop = fn_retval; | |
// Get history by looking at the hidden Iframe's location.hash. | |
history_get = function() { | |
return get_fragment( iframe.location.href ); | |
}; | |
// Set a new history item by opening and then closing the Iframe | |
// document, *then* setting its location.hash. If document.domain has | |
// been set, update that as well. | |
history_set = function( hash, history_hash ) { | |
var iframe_doc = iframe.document, | |
domain = $.fn[ str_hashchange ].domain; | |
if ( hash !== history_hash ) { | |
// Update Iframe with any initial `document.title` that might be set. | |
iframe_doc.title = doc.title; | |
// Opening the Iframe's document after it has been closed is what | |
// actually adds a history entry. | |
iframe_doc.open(); | |
// Set document.domain for the Iframe document as well, if necessary. | |
domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' ); | |
iframe_doc.close(); | |
// Update the Iframe's hash, for great justice. | |
iframe.location.hash = hash; | |
} | |
}; | |
})(); | |
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
// ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^ | |
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
return self; | |
})(); | |
})(jQuery,this); | |
/* | |
* jQuery Mobile Framework : "page" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.page", $.mobile.widget, { | |
options: { | |
theme: "c", | |
domCache: false | |
}, | |
_create: function() { | |
this._trigger( "beforecreate" ); | |
this.element | |
.attr( "tabindex", "0" ) | |
.addClass( "ui-page ui-body-" + this.options.theme ); | |
} | |
}); | |
})( jQuery ); | |
/*! | |
* jQuery Mobile v@VERSION | |
* http://jquerymobile.com/ | |
* | |
* Copyright 2010, jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, window, undefined ) { | |
// jQuery.mobile configurable options | |
$.extend( $.mobile, { | |
// Namespace used framework-wide for data-attrs. Default is no namespace | |
ns: "", | |
// Define the url parameter used for referencing widget-generated sub-pages. | |
// Translates to to example.html&ui-page=subpageIdentifier | |
// hash segment before &ui-page= is used to make Ajax request | |
subPageUrlKey: "ui-page", | |
// Class assigned to page currently in view, and during transitions | |
activePageClass: "ui-page-active", | |
// Class used for "active" button state, from CSS framework | |
activeBtnClass: "ui-btn-active", | |
// Automatically handle clicks and form submissions through Ajax, when same-domain | |
ajaxEnabled: true, | |
// Automatically load and show pages based on location.hash | |
hashListeningEnabled: true, | |
// Set default page transition - 'none' for no transitions | |
defaultPageTransition: "slide", | |
// Minimum scroll distance that will be remembered when returning to a page | |
minScrollBack: 250, | |
// Set default dialog transition - 'none' for no transitions | |
defaultDialogTransition: "pop", | |
// Show loading message during Ajax requests | |
// if false, message will not appear, but loading classes will still be toggled on html el | |
loadingMessage: "loading", | |
// Error response message - appears when an Ajax page request fails | |
pageLoadErrorMessage: "Error Loading Page", | |
//automatically initialize the DOM when it's ready | |
autoInitializePage: true, | |
pushStateEnabled: true, | |
// Support conditions that must be met in order to proceed | |
// default enhanced qualifications are media query support OR IE 7+ | |
gradeA: function(){ | |
return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7; | |
}, | |
// TODO might be useful upstream in jquery itself ? | |
keyCode: { | |
ALT: 18, | |
BACKSPACE: 8, | |
CAPS_LOCK: 20, | |
COMMA: 188, | |
COMMAND: 91, | |
COMMAND_LEFT: 91, // COMMAND | |
COMMAND_RIGHT: 93, | |
CONTROL: 17, | |
DELETE: 46, | |
DOWN: 40, | |
END: 35, | |
ENTER: 13, | |
ESCAPE: 27, | |
HOME: 36, | |
INSERT: 45, | |
LEFT: 37, | |
MENU: 93, // COMMAND_RIGHT | |
NUMPAD_ADD: 107, | |
NUMPAD_DECIMAL: 110, | |
NUMPAD_DIVIDE: 111, | |
NUMPAD_ENTER: 108, | |
NUMPAD_MULTIPLY: 106, | |
NUMPAD_SUBTRACT: 109, | |
PAGE_DOWN: 34, | |
PAGE_UP: 33, | |
PERIOD: 190, | |
RIGHT: 39, | |
SHIFT: 16, | |
SPACE: 32, | |
TAB: 9, | |
UP: 38, | |
WINDOWS: 91 // COMMAND | |
}, | |
// Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value | |
silentScroll: function( ypos ) { | |
if ( $.type( ypos ) !== "number" ) { | |
ypos = $.mobile.defaultHomeScroll; | |
} | |
// prevent scrollstart and scrollstop events | |
$.event.special.scrollstart.enabled = false; | |
setTimeout(function() { | |
window.scrollTo( 0, ypos ); | |
$( document ).trigger( "silentscroll", { x: 0, y: ypos }); | |
}, 20 ); | |
setTimeout(function() { | |
$.event.special.scrollstart.enabled = true; | |
}, 150 ); | |
}, | |
// Take a data attribute property, prepend the namespace | |
// and then camel case the attribute string | |
nsNormalize: function( prop ) { | |
if ( !prop ) { | |
return; | |
} | |
return $.camelCase( $.mobile.ns + prop ); | |
} | |
}); | |
// Mobile version of data and removeData and hasData methods | |
// ensures all data is set and retrieved using jQuery Mobile's data namespace | |
$.fn.jqmData = function( prop, value ) { | |
var result; | |
if ( typeof prop != "undefined" ) { | |
result = this.data( prop ? $.mobile.nsNormalize( prop ) : prop, value ); | |
} | |
return result; | |
}; | |
$.jqmData = function( elem, prop, value ) { | |
var result; | |
if ( typeof prop != "undefined" ) { | |
result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value ); | |
} | |
return result; | |
}; | |
$.fn.jqmRemoveData = function( prop ) { | |
return this.removeData( $.mobile.nsNormalize( prop ) ); | |
}; | |
$.jqmRemoveData = function( elem, prop ) { | |
return $.removeData( elem, $.mobile.nsNormalize( prop ) ); | |
}; | |
$.fn.removeWithDependents = function() { | |
$.removeWithDependents( this ); | |
}; | |
$.removeWithDependents = function( elem ) { | |
var $elem = $( elem ); | |
( $elem.jqmData('dependents') || $() ).remove(); | |
$elem.remove(); | |
}; | |
$.fn.addDependents = function( newDependents ) { | |
$.addDependents( $(this), newDependents ); | |
}; | |
$.addDependents = function( elem, newDependents ) { | |
var dependents = $(elem).jqmData( 'dependents' ) || $(); | |
$(elem).jqmData( 'dependents', $.merge(dependents, newDependents) ); | |
}; | |
// note that this helper doesn't attempt to handle the callback | |
// or setting of an html elements text, its only purpose is | |
// to return the html encoded version of the text in all cases. (thus the name) | |
$.fn.getEncodedText = function() { | |
return $( "<div/>" ).text( $(this).text() ).html(); | |
}; | |
// Monkey-patching Sizzle to filter the :jqmData selector | |
var oldFind = $.find; | |
$.find = function( selector, context, ret, extra ) { | |
selector = selector.replace(/:jqmData\(([^)]*)\)/g, "[data-" + ( $.mobile.ns || "" ) + "$1]"); | |
return oldFind.call( this, selector, context, ret, extra ); | |
}; | |
$.extend( $.find, oldFind ); | |
$.find.matches = function( expr, set ) { | |
return $.find( expr, null, null, set ); | |
}; | |
$.find.matchesSelector = function( node, expr ) { | |
return $.find( expr, null, null, [ node ] ).length > 0; | |
}; | |
})( jQuery, this ); | |
/* | |
* jQuery Mobile Framework : core utilities for auto ajax navigation, base tag mgmt, | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
( function( $, undefined ) { | |
//define vars for interal use | |
var $window = $( window ), | |
$html = $( 'html' ), | |
$head = $( 'head' ), | |
//url path helpers for use in relative url management | |
path = { | |
// This scary looking regular expression parses an absolute URL or its relative | |
// variants (protocol, site, document, query, and hash), into the various | |
// components (protocol, host, path, query, fragment, etc that make up the | |
// URL as well as some other commonly used sub-parts. When used with RegExp.exec() | |
// or String.match, it parses the URL into a results array that looks like this: | |
// | |
// [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content | |
// [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread | |
// [2]: http://jblas:password@mycompany.com:8080/mail/inbox | |
// [3]: http://jblas:password@mycompany.com:8080 | |
// [4]: http: | |
// [5]: // | |
// [6]: jblas:password@mycompany.com:8080 | |
// [7]: jblas:password | |
// [8]: jblas | |
// [9]: password | |
// [10]: mycompany.com:8080 | |
// [11]: mycompany.com | |
// [12]: 8080 | |
// [13]: /mail/inbox | |
// [14]: /mail/ | |
// [15]: inbox | |
// [16]: ?msg=1234&type=unread | |
// [17]: #msg-content | |
// | |
urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/, | |
//Parse a URL into a structure that allows easy access to | |
//all of the URL components by name. | |
parseUrl: function( url ) { | |
// If we're passed an object, we'll assume that it is | |
// a parsed url object and just return it back to the caller. | |
if ( $.type( url ) === "object" ) { | |
return url; | |
} | |
var matches = path.urlParseRE.exec( url || "" ) || []; | |
// Create an object that allows the caller to access the sub-matches | |
// by name. Note that IE returns an empty string instead of undefined, | |
// like all other browsers do, so we normalize everything so its consistent | |
// no matter what browser we're running on. | |
return { | |
href: matches[ 0 ] || "", | |
hrefNoHash: matches[ 1 ] || "", | |
hrefNoSearch: matches[ 2 ] || "", | |
domain: matches[ 3 ] || "", | |
protocol: matches[ 4 ] || "", | |
doubleSlash: matches[ 5 ] || "", | |
authority: matches[ 6 ] || "", | |
username: matches[ 8 ] || "", | |
password: matches[ 9 ] || "", | |
host: matches[ 10 ] || "", | |
hostname: matches[ 11 ] || "", | |
port: matches[ 12 ] || "", | |
pathname: matches[ 13 ] || "", | |
directory: matches[ 14 ] || "", | |
filename: matches[ 15 ] || "", | |
search: matches[ 16 ] || "", | |
hash: matches[ 17 ] || "" | |
}; | |
}, | |
//Turn relPath into an asbolute path. absPath is | |
//an optional absolute path which describes what | |
//relPath is relative to. | |
makePathAbsolute: function( relPath, absPath ) { | |
if ( relPath && relPath.charAt( 0 ) === "/" ) { | |
return relPath; | |
} | |
relPath = relPath || ""; | |
absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : ""; | |
var absStack = absPath ? absPath.split( "/" ) : [], | |
relStack = relPath.split( "/" ); | |
for ( var i = 0; i < relStack.length; i++ ) { | |
var d = relStack[ i ]; | |
switch ( d ) { | |
case ".": | |
break; | |
case "..": | |
if ( absStack.length ) { | |
absStack.pop(); | |
} | |
break; | |
default: | |
absStack.push( d ); | |
break; | |
} | |
} | |
return "/" + absStack.join( "/" ); | |
}, | |
//Returns true if both urls have the same domain. | |
isSameDomain: function( absUrl1, absUrl2 ) { | |
return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain; | |
}, | |
//Returns true for any relative variant. | |
isRelativeUrl: function( url ) { | |
// All relative Url variants have one thing in common, no protocol. | |
return path.parseUrl( url ).protocol === ""; | |
}, | |
//Returns true for an absolute url. | |
isAbsoluteUrl: function( url ) { | |
return path.parseUrl( url ).protocol !== ""; | |
}, | |
//Turn the specified realtive URL into an absolute one. This function | |
//can handle all relative variants (protocol, site, document, query, fragment). | |
makeUrlAbsolute: function( relUrl, absUrl ) { | |
if ( !path.isRelativeUrl( relUrl ) ) { | |
return relUrl; | |
} | |
var relObj = path.parseUrl( relUrl ), | |
absObj = path.parseUrl( absUrl ), | |
protocol = relObj.protocol || absObj.protocol, | |
doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ); | |
authority = relObj.authority || absObj.authority, | |
hasPath = relObj.pathname !== "", | |
pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ), | |
search = relObj.search || ( !hasPath && absObj.search ) || "", | |
hash = relObj.hash; | |
return protocol + doubleSlash + authority + pathname + search + hash; | |
}, | |
//Add search (aka query) params to the specified url. | |
addSearchParams: function( url, params ) { | |
var u = path.parseUrl( url ), | |
p = ( typeof params === "object" ) ? $.param( params ) : params, | |
s = u.search || "?"; | |
return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" ); | |
}, | |
convertUrlToDataUrl: function( absUrl ) { | |
var u = path.parseUrl( absUrl ); | |
if ( path.isEmbeddedPage( u ) ) { | |
// For embedded pages, remove the dialog hash key as in getFilePath(), | |
// otherwise the Data Url won't match the id of the embedded Page. | |
return u.hash.split( dialogHashKey )[0].replace( /^#/, "" ); | |
} else if ( path.isSameDomain( u, documentBase ) ) { | |
return u.hrefNoHash.replace( documentBase.domain, "" ); | |
} | |
return absUrl; | |
}, | |
//get path from current hash, or from a file path | |
get: function( newPath ) { | |
if( newPath === undefined ) { | |
newPath = location.hash; | |
} | |
return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' ); | |
}, | |
//return the substring of a filepath before the sub-page key, for making a server request | |
getFilePath: function( path ) { | |
var splitkey = '&' + $.mobile.subPageUrlKey; | |
return path && path.split( splitkey )[0].split( dialogHashKey )[0]; | |
}, | |
//set location hash to path | |
set: function( path ) { | |
location.hash = path; | |
}, | |
//test if a given url (string) is a path | |
//NOTE might be exceptionally naive | |
isPath: function( url ) { | |
return ( /\// ).test( url ); | |
}, | |
//return a url path with the window's location protocol/hostname/pathname removed | |
clean: function( url ) { | |
return url.replace( documentBase.domain, "" ); | |
}, | |
//just return the url without an initial # | |
stripHash: function( url ) { | |
return url.replace( /^#/, "" ); | |
}, | |
//remove the preceding hash, any query params, and dialog notations | |
cleanHash: function( hash ) { | |
return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) ); | |
}, | |
//check whether a url is referencing the same domain, or an external domain or different protocol | |
//could be mailto, etc | |
isExternal: function( url ) { | |
var u = path.parseUrl( url ); | |
return u.protocol && u.domain !== documentUrl.domain ? true : false; | |
}, | |
hasProtocol: function( url ) { | |
return ( /^(:?\w+:)/ ).test( url ); | |
}, | |
//check if the specified url refers to the first page in the main application document. | |
isFirstPageUrl: function( url ) { | |
// We only deal with absolute paths. | |
var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ), | |
// Does the url have the same path as the document? | |
samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ), | |
// Get the first page element. | |
fp = $.mobile.firstPage, | |
// Get the id of the first page element if it has one. | |
fpId = fp && fp[0] ? fp[0].id : undefined; | |
// The url refers to the first page if the path matches the document and | |
// it either has no hash value, or the hash is exactly equal to the id of the | |
// first page element. | |
return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) ); | |
}, | |
isEmbeddedPage: function( url ) { | |
var u = path.parseUrl( url ); | |
//if the path is absolute, then we need to compare the url against | |
//both the documentUrl and the documentBase. The main reason for this | |
//is that links embedded within external documents will refer to the | |
//application document, whereas links embedded within the application | |
//document will be resolved against the document base. | |
if ( u.protocol !== "" ) { | |
return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) ); | |
} | |
return (/^#/).test( u.href ); | |
} | |
}, | |
//will be defined when a link is clicked and given an active class | |
$activeClickedLink = null, | |
//urlHistory is purely here to make guesses at whether the back or forward button was clicked | |
//and provide an appropriate transition | |
urlHistory = { | |
// Array of pages that are visited during a single page load. | |
// Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs) | |
stack: [], | |
//maintain an index number for the active page in the stack | |
activeIndex: 0, | |
//get active | |
getActive: function() { | |
return urlHistory.stack[ urlHistory.activeIndex ]; | |
}, | |
getPrev: function() { | |
return urlHistory.stack[ urlHistory.activeIndex - 1 ]; | |
}, | |
getNext: function() { | |
return urlHistory.stack[ urlHistory.activeIndex + 1 ]; | |
}, | |
// addNew is used whenever a new page is added | |
addNew: function( url, transition, title, pageUrl, role ) { | |
//if there's forward history, wipe it | |
if( urlHistory.getNext() ) { | |
urlHistory.clearForward(); | |
} | |
urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } ); | |
urlHistory.activeIndex = urlHistory.stack.length - 1; | |
}, | |
//wipe urls ahead of active index | |
clearForward: function() { | |
urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 ); | |
}, | |
directHashChange: function( opts ) { | |
var back , forward, newActiveIndex, prev = this.getActive(); | |
// check if url isp in history and if it's ahead or behind current page | |
$.each( urlHistory.stack, function( i, historyEntry ) { | |
//if the url is in the stack, it's a forward or a back | |
if( opts.currentUrl === historyEntry.url ) { | |
//define back and forward by whether url is older or newer than current page | |
back = i < urlHistory.activeIndex; | |
forward = !back; | |
newActiveIndex = i; | |
} | |
}); | |
// save new page index, null check to prevent falsey 0 result | |
this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex; | |
if( back ) { | |
( opts.either || opts.isBack )( true ); | |
} else if( forward ) { | |
( opts.either || opts.isForward )( false ); | |
} | |
}, | |
//disable hashchange event listener internally to ignore one change | |
//toggled internally when location.hash is updated to match the url of a successful page load | |
ignoreNextHashChange: false | |
}, | |
//define first selector to receive focus when a page is shown | |
focusable = "[tabindex],a,button:visible,select:visible,input", | |
//queue to hold simultanious page transitions | |
pageTransitionQueue = [], | |
//indicates whether or not page is in process of transitioning | |
isPageTransitioning = false, | |
//nonsense hash change key for dialogs, so they create a history entry | |
dialogHashKey = "&ui-state=dialog", | |
//existing base tag? | |
$base = $head.children( "base" ), | |
//tuck away the original document URL minus any fragment. | |
documentUrl = path.parseUrl( location.href ), | |
//if the document has an embedded base tag, documentBase is set to its | |
//initial value. If a base tag does not exist, then we default to the documentUrl. | |
documentBase = $base.length ? path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), documentUrl.href ) ) : documentUrl, | |
//cache the comparison once. | |
documentBaseDiffers = ( documentUrl.hrefNoHash !== documentBase.hrefNoHash ); | |
//base element management, defined depending on dynamic base tag support | |
var base = $.support.dynamicBaseTag ? { | |
//define base element, for use in routing asset urls that are referenced in Ajax-requested markup | |
element: ( $base.length ? $base : $( "<base>", { href: documentBase.hrefNoHash } ).prependTo( $head ) ), | |
//set the generated BASE element's href attribute to a new page's base path | |
set: function( href ) { | |
base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) ); | |
}, | |
//set the generated BASE element's href attribute to a new page's base path | |
reset: function() { | |
base.element.attr( "href", documentBase.hrefNoHash ); | |
} | |
} : undefined; | |
/* | |
internal utility functions | |
--------------------------------------*/ | |
//direct focus to the page title, or otherwise first focusable element | |
function reFocus( page ) { | |
var pageTitle = page.find( ".ui-title:eq(0)" ); | |
if( pageTitle.length ) { | |
pageTitle.focus(); | |
} | |
else{ | |
page.focus(); | |
} | |
} | |
//remove active classes after page transition or error | |
function removeActiveLinkClass( forceRemoval ) { | |
if( !!$activeClickedLink && ( !$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval ) ) { | |
$activeClickedLink.removeClass( $.mobile.activeBtnClass ); | |
} | |
$activeClickedLink = null; | |
} | |
function releasePageTransitionLock() { | |
isPageTransitioning = false; | |
if( pageTransitionQueue.length > 0 ) { | |
$.mobile.changePage.apply( null, pageTransitionQueue.pop() ); | |
} | |
} | |
// Save the last scroll distance per page, before it is hidden | |
var setLastScrollEnabled = true, | |
firstScrollElem, getScrollElem, setLastScroll, delayedSetLastScroll; | |
getScrollElem = function() { | |
var scrollElem = $window, activePage, | |
touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled; | |
if( touchOverflow ){ | |
activePage = $( ".ui-page-active" ); | |
scrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage; | |
} | |
return scrollElem; | |
}; | |
setLastScroll = function( scrollElem ) { | |
// this barrier prevents setting the scroll value based on the browser | |
// scrolling the window based on a hashchange | |
if( !setLastScrollEnabled ) { | |
return; | |
} | |
var active = $.mobile.urlHistory.getActive(); | |
if( active ) { | |
var lastScroll = scrollElem && scrollElem.scrollTop(); | |
// Set active page's lastScroll prop. | |
// If the location we're scrolling to is less than minScrollBack, let it go. | |
active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll; | |
} | |
}; | |
// bind to scrollstop to gather scroll position. The delay allows for the hashchange | |
// event to fire and disable scroll recording in the case where the browser scrolls | |
// to the hash targets location (sometimes the top of the page). once pagechange fires | |
// getLastScroll is again permitted to operate | |
delayedSetLastScroll = function() { | |
setTimeout( setLastScroll, 100, $(this) ); | |
}; | |
// disable an scroll setting when a hashchange has been fired, this only works | |
// because the recording of the scroll position is delayed for 100ms after | |
// the browser might have changed the position because of the hashchange | |
$window.bind( $.support.pushState ? "popstate" : "hashchange", function() { | |
setLastScrollEnabled = false; | |
}); | |
// handle initial hashchange from chrome :( | |
$window.one( $.support.pushState ? "popstate" : "hashchange", function() { | |
setLastScrollEnabled = true; | |
}); | |
// wait until the mobile page container has been determined to bind to pagechange | |
$window.one( "pagecontainercreate", function(){ | |
// once the page has changed, re-enable the scroll recording | |
$.mobile.pageContainer.bind( "pagechange", function() { | |
var scrollElem = getScrollElem(); | |
setLastScrollEnabled = true; | |
// remove any binding that previously existed on the get scroll | |
// which may or may not be different than the scroll element determined for | |
// this page previously | |
scrollElem.unbind( "scrollstop", delayedSetLastScroll ); | |
// determine and bind to the current scoll element which may be the window | |
// or in the case of touch overflow the element with touch overflow | |
scrollElem.bind( "scrollstop", delayedSetLastScroll ); | |
}); | |
}); | |
// bind to scrollstop for the first page as "pagechange" won't be fired in that case | |
getScrollElem().bind( "scrollstop", delayedSetLastScroll ); | |
// Make the iOS clock quick-scroll work again if we're using native overflow scrolling | |
/* | |
if( $.support.touchOverflow ){ | |
if( $.mobile.touchOverflowEnabled ){ | |
$( window ).bind( "scrollstop", function(){ | |
if( $( this ).scrollTop() === 0 ){ | |
$.mobile.activePage.scrollTop( 0 ); | |
} | |
}); | |
} | |
} | |
*/ | |
//function for transitioning between two existing pages | |
function transitionPages( toPage, fromPage, transition, reverse ) { | |
//get current scroll distance | |
var active = $.mobile.urlHistory.getActive(), | |
touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled, | |
toScroll = active.lastScroll || ( touchOverflow ? 0 : $.mobile.defaultHomeScroll ), | |
screenHeight = getScreenHeight(); | |
// Scroll to top, hide addr bar | |
window.scrollTo( 0, $.mobile.defaultHomeScroll ); | |
if( fromPage ) { | |
//trigger before show/hide events | |
fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } ); | |
} | |
if( !touchOverflow){ | |
toPage.height( screenHeight + toScroll ); | |
} | |
toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } ); | |
//clear page loader | |
$.mobile.hidePageLoadingMsg(); | |
if( touchOverflow && toScroll ){ | |
toPage.addClass( "ui-mobile-pre-transition" ); | |
// Send focus to page as it is now display: block | |
reFocus( toPage ); | |
//set page's scrollTop to remembered distance | |
if( toPage.is( ".ui-native-fixed" ) ){ | |
toPage.find( ".ui-content" ).scrollTop( toScroll ); | |
} | |
else{ | |
toPage.scrollTop( toScroll ); | |
} | |
} | |
//find the transition handler for the specified transition. If there | |
//isn't one in our transitionHandlers dictionary, use the default one. | |
//call the handler immediately to kick-off the transition. | |
var th = $.mobile.transitionHandlers[transition || "none"] || $.mobile.defaultTransitionHandler, | |
promise = th( transition, reverse, toPage, fromPage ); | |
promise.done(function() { | |
//reset toPage height back | |
if( !touchOverflow ){ | |
toPage.height( "" ); | |
// Send focus to the newly shown page | |
reFocus( toPage ); | |
} | |
// Jump to top or prev scroll, sometimes on iOS the page has not rendered yet. | |
if( !touchOverflow ){ | |
$.mobile.silentScroll( toScroll ); | |
} | |
//trigger show/hide events | |
if( fromPage ) { | |
if( !touchOverflow ){ | |
fromPage.height( "" ); | |
} | |
fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } ); | |
} | |
//trigger pageshow, define prevPage as either fromPage or empty jQuery obj | |
toPage.data( "page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } ); | |
}); | |
return promise; | |
} | |
//simply set the active page's minimum height to screen height, depending on orientation | |
function getScreenHeight(){ | |
var orientation = jQuery.event.special.orientationchange.orientation(), | |
port = orientation === "portrait", | |
winMin = port ? 480 : 320, | |
screenHeight = port ? screen.availHeight : screen.availWidth, | |
winHeight = Math.max( winMin, $( window ).height() ), | |
pageMin = Math.min( screenHeight, winHeight ); | |
return pageMin; | |
} | |
$.mobile.getScreenHeight = getScreenHeight; | |
//simply set the active page's minimum height to screen height, depending on orientation | |
function resetActivePageHeight(){ | |
// Don't apply this height in touch overflow enabled mode | |
if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){ | |
return; | |
} | |
$( "." + $.mobile.activePageClass ).css( "min-height", getScreenHeight() ); | |
} | |
//shared page enhancements | |
function enhancePage( $page, role ) { | |
// If a role was specified, make sure the data-role attribute | |
// on the page element is in sync. | |
if( role ) { | |
$page.attr( "data-" + $.mobile.ns + "role", role ); | |
} | |
//run page plugin | |
$page.page(); | |
} | |
/* exposed $.mobile methods */ | |
//animation complete callback | |
$.fn.animationComplete = function( callback ) { | |
if( $.support.cssTransitions ) { | |
return $( this ).one( 'webkitAnimationEnd', callback ); | |
} | |
else{ | |
// defer execution for consistency between webkit/non webkit | |
setTimeout( callback, 0 ); | |
return $( this ); | |
} | |
}; | |
//expose path object on $.mobile | |
$.mobile.path = path; | |
//expose base object on $.mobile | |
$.mobile.base = base; | |
//history stack | |
$.mobile.urlHistory = urlHistory; | |
$.mobile.dialogHashKey = dialogHashKey; | |
//default non-animation transition handler | |
$.mobile.noneTransitionHandler = function( name, reverse, $toPage, $fromPage ) { | |
if ( $fromPage ) { | |
$fromPage.removeClass( $.mobile.activePageClass ); | |
} | |
$toPage.addClass( $.mobile.activePageClass ); | |
return $.Deferred().resolve( name, reverse, $toPage, $fromPage ).promise(); | |
}; | |
//default handler for unknown transitions | |
$.mobile.defaultTransitionHandler = $.mobile.noneTransitionHandler; | |
//transition handler dictionary for 3rd party transitions | |
$.mobile.transitionHandlers = { | |
none: $.mobile.defaultTransitionHandler | |
}; | |
//enable cross-domain page support | |
$.mobile.allowCrossDomainPages = false; | |
//return the original document url | |
$.mobile.getDocumentUrl = function(asParsedObject) { | |
return asParsedObject ? $.extend( {}, documentUrl ) : documentUrl.href; | |
}; | |
//return the original document base url | |
$.mobile.getDocumentBase = function(asParsedObject) { | |
return asParsedObject ? $.extend( {}, documentBase ) : documentBase.href; | |
}; | |
$.mobile._bindPageRemove = function() { | |
var page = $(this); | |
// when dom caching is not enabled or the page is embedded bind to remove the page on hide | |
if( !page.data("page").options.domCache | |
&& page.is(":jqmData(external-page='true')") ) { | |
page.bind( 'pagehide.remove', function() { | |
var $this = $( this ), | |
prEvent = new $.Event( "pageremove" ); | |
$this.trigger( prEvent ); | |
if( !prEvent.isDefaultPrevented() ){ | |
$this.removeWithDependents(); | |
} | |
}); | |
} | |
}; | |
// Load a page into the DOM. | |
$.mobile.loadPage = function( url, options ) { | |
// This function uses deferred notifications to let callers | |
// know when the page is done loading, or if an error has occurred. | |
var deferred = $.Deferred(), | |
// The default loadPage options with overrides specified by | |
// the caller. | |
settings = $.extend( {}, $.mobile.loadPage.defaults, options ), | |
// The DOM element for the page after it has been loaded. | |
page = null, | |
// If the reloadPage option is true, and the page is already | |
// in the DOM, dupCachedPage will be set to the page element | |
// so that it can be removed after the new version of the | |
// page is loaded off the network. | |
dupCachedPage = null, | |
// determine the current base url | |
findBaseWithDefault = function(){ | |
var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) ); | |
return closestBase || documentBase.hrefNoHash; | |
}, | |
// The absolute version of the URL passed into the function. This | |
// version of the URL may contain dialog/subpage params in it. | |
absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() ); | |
// If the caller provided data, and we're using "get" request, | |
// append the data to the URL. | |
if ( settings.data && settings.type === "get" ) { | |
absUrl = path.addSearchParams( absUrl, settings.data ); | |
settings.data = undefined; | |
} | |
// If the caller is using a "post" request, reloadPage must be true | |
if( settings.data && settings.type === "post" ){ | |
settings.reloadPage = true; | |
} | |
// The absolute version of the URL minus any dialog/subpage params. | |
// In otherwords the real URL of the page to be loaded. | |
var fileUrl = path.getFilePath( absUrl ), | |
// The version of the Url actually stored in the data-url attribute of | |
// the page. For embedded pages, it is just the id of the page. For pages | |
// within the same domain as the document base, it is the site relative | |
// path. For cross-domain pages (Phone Gap only) the entire absolute Url | |
// used to load the page. | |
dataUrl = path.convertUrlToDataUrl( absUrl ); | |
// Make sure we have a pageContainer to work with. | |
settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; | |
// Check to see if the page already exists in the DOM. | |
page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); | |
// If we failed to find the page, check to see if the url is a | |
// reference to an embedded page. If so, it may have been dynamically | |
// injected by a developer, in which case it would be lacking a data-url | |
// attribute and in need of enhancement. | |
if ( page.length === 0 && !path.isPath( dataUrl ) ) { | |
page = settings.pageContainer.children( "#" + dataUrl ) | |
.attr( "data-" + $.mobile.ns + "url", dataUrl ) | |
} | |
// If we failed to find a page in the DOM, check the URL to see if it | |
// refers to the first page in the application. | |
if ( page.length === 0 && $.mobile.firstPage && path.isFirstPageUrl( absUrl ) ) { | |
page = $( $.mobile.firstPage ); | |
} | |
// Reset base to the default document base. | |
if ( base ) { | |
base.reset(); | |
} | |
// If the page we are interested in is already in the DOM, | |
// and the caller did not indicate that we should force a | |
// reload of the file, we are done. Otherwise, track the | |
// existing page as a duplicated. | |
if ( page.length ) { | |
if ( !settings.reloadPage ) { | |
enhancePage( page, settings.role ); | |
deferred.resolve( absUrl, options, page ); | |
return deferred.promise(); | |
} | |
dupCachedPage = page; | |
} | |
var mpc = settings.pageContainer, | |
pblEvent = new $.Event( "pagebeforeload" ), | |
triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings }; | |
// Let listeners know we're about to load a page. | |
mpc.trigger( pblEvent, triggerData ); | |
// If the default behavior is prevented, stop here! | |
if( pblEvent.isDefaultPrevented() ){ | |
return deferred.promise(); | |
} | |
if ( settings.showLoadMsg ) { | |
// This configurable timeout allows cached pages a brief delay to load without showing a message | |
var loadMsgDelay = setTimeout(function(){ | |
$.mobile.showPageLoadingMsg(); | |
}, settings.loadMsgDelay ), | |
// Shared logic for clearing timeout and removing message. | |
hideMsg = function(){ | |
// Stop message show timer | |
clearTimeout( loadMsgDelay ); | |
// Hide loading message | |
$.mobile.hidePageLoadingMsg(); | |
}; | |
} | |
if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) { | |
deferred.reject( absUrl, options ); | |
} else { | |
// Load the new page. | |
$.ajax({ | |
url: fileUrl, | |
type: settings.type, | |
data: settings.data, | |
dataType: "html", | |
success: function( html ) { | |
//pre-parse html to check for a data-url, | |
//use it as the new fileUrl, base path, etc | |
var all = $( "<div></div>" ), | |
//page title regexp | |
newPageTitle = html.match( /<title[^>]*>([^<]*)/ ) && RegExp.$1, | |
// TODO handle dialogs again | |
pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ), | |
dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" ); | |
// data-url must be provided for the base tag so resource requests can be directed to the | |
// correct url. loading into a temprorary element makes these requests immediately | |
if( pageElemRegex.test( html ) | |
&& RegExp.$1 | |
&& dataUrlRegex.test( RegExp.$1 ) | |
&& RegExp.$1 ) { | |
url = fileUrl = path.getFilePath( RegExp.$1 ); | |
} | |
if ( base ) { | |
base.set( fileUrl ); | |
} | |
//workaround to allow scripts to execute when included in page divs | |
all.get( 0 ).innerHTML = html; | |
page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); | |
//if page elem couldn't be found, create one and insert the body element's contents | |
if( !page.length ){ | |
page = $( "<div data-" + $.mobile.ns + "role='page'>" + html.split( /<\/?body[^>]*>/gmi )[1] + "</div>" ); | |
} | |
if ( newPageTitle && !page.jqmData( "title" ) ) { | |
page.jqmData( "title", newPageTitle ); | |
} | |
//rewrite src and href attrs to use a base url | |
if( !$.support.dynamicBaseTag ) { | |
var newPath = path.get( fileUrl ); | |
page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() { | |
var thisAttr = $( this ).is( '[href]' ) ? 'href' : | |
$(this).is('[src]') ? 'src' : 'action', | |
thisUrl = $( this ).attr( thisAttr ); | |
// XXX_jblas: We need to fix this so that it removes the document | |
// base URL, and then prepends with the new page URL. | |
//if full path exists and is same, chop it - helps IE out | |
thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' ); | |
if( !/^(\w+:|#|\/)/.test( thisUrl ) ) { | |
$( this ).attr( thisAttr, newPath + thisUrl ); | |
} | |
}); | |
} | |
//append to page and enhance | |
// TODO taging a page with external to make sure that embedded pages aren't removed | |
// by the various page handling code is bad. Having page handling code in many | |
// places is bad. Solutions post 1.0 | |
page | |
.attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) ) | |
.attr( "data-" + $.mobile.ns + "external-page", true ) | |
.appendTo( settings.pageContainer ); | |
// wait for page creation to leverage options defined on widget | |
page.one( 'pagecreate', $.mobile._bindPageRemove ); | |
enhancePage( page, settings.role ); | |
// Enhancing the page may result in new dialogs/sub pages being inserted | |
// into the DOM. If the original absUrl refers to a sub-page, that is the | |
// real page we are interested in. | |
if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) { | |
page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); | |
} | |
//bind pageHide to removePage after it's hidden, if the page options specify to do so | |
// Remove loading message. | |
if ( settings.showLoadMsg ) { | |
hideMsg(); | |
} | |
// Add the page reference to our triggerData. | |
triggerData.page = page; | |
// Let listeners know the page loaded successfully. | |
settings.pageContainer.trigger( "pageload", triggerData ); | |
deferred.resolve( absUrl, options, page, dupCachedPage ); | |
}, | |
error: function() { | |
//set base back to current path | |
if( base ) { | |
base.set( path.get() ); | |
} | |
var plfEvent = new $.Event( "pageloadfailed" ); | |
// Let listeners know the page load failed. | |
settings.pageContainer.trigger( plfEvent, triggerData ); | |
// If the default behavior is prevented, stop here! | |
// Note that it is the responsibility of the listener/handler | |
// that called preventDefault(), to resolve/reject the | |
// deferred object within the triggerData. | |
if( plfEvent.isDefaultPrevented() ){ | |
return; | |
} | |
// Remove loading message. | |
if ( settings.showLoadMsg ) { | |
// Remove loading message. | |
hideMsg(); | |
//show error message | |
$( "<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+ $.mobile.pageLoadErrorMessage +"</h1></div>" ) | |
.css({ "display": "block", "opacity": 0.96, "top": $window.scrollTop() + 100 }) | |
.appendTo( settings.pageContainer ) | |
.delay( 800 ) | |
.fadeOut( 400, function() { | |
$( this ).remove(); | |
}); | |
} | |
deferred.reject( absUrl, options ); | |
} | |
}); | |
} | |
return deferred.promise(); | |
}; | |
$.mobile.loadPage.defaults = { | |
type: "get", | |
data: undefined, | |
reloadPage: false, | |
role: undefined, // By default we rely on the role defined by the @data-role attribute. | |
showLoadMsg: false, | |
pageContainer: undefined, | |
loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message. | |
}; | |
// Show a specific page in the page container. | |
$.mobile.changePage = function( toPage, options ) { | |
// If we are in the midst of a transition, queue the current request. | |
// We'll call changePage() once we're done with the current transition to | |
// service the request. | |
if( isPageTransitioning ) { | |
pageTransitionQueue.unshift( arguments ); | |
return; | |
} | |
var settings = $.extend( {}, $.mobile.changePage.defaults, options ); | |
// Make sure we have a pageContainer to work with. | |
settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; | |
// Make sure we have a fromPage. | |
settings.fromPage = settings.fromPage || $.mobile.activePage; | |
var mpc = settings.pageContainer, | |
pbcEvent = new $.Event( "pagebeforechange" ), | |
triggerData = { toPage: toPage, options: settings }; | |
// Let listeners know we're about to change the current page. | |
mpc.trigger( pbcEvent, triggerData ); | |
// If the default behavior is prevented, stop here! | |
if( pbcEvent.isDefaultPrevented() ){ | |
return; | |
} | |
// We allow "pagebeforechange" observers to modify the toPage in the trigger | |
// data to allow for redirects. Make sure our toPage is updated. | |
toPage = triggerData.toPage; | |
// Set the isPageTransitioning flag to prevent any requests from | |
// entering this method while we are in the midst of loading a page | |
// or transitioning. | |
isPageTransitioning = true; | |
// If the caller passed us a url, call loadPage() | |
// to make sure it is loaded into the DOM. We'll listen | |
// to the promise object it returns so we know when | |
// it is done loading or if an error ocurred. | |
if ( typeof toPage == "string" ) { | |
$.mobile.loadPage( toPage, settings ) | |
.done(function( url, options, newPage, dupCachedPage ) { | |
isPageTransitioning = false; | |
options.duplicateCachedPage = dupCachedPage; | |
$.mobile.changePage( newPage, options ); | |
}) | |
.fail(function( url, options ) { | |
isPageTransitioning = false; | |
//clear out the active button state | |
removeActiveLinkClass( true ); | |
//release transition lock so navigation is free again | |
releasePageTransitionLock(); | |
settings.pageContainer.trigger( "pagechangefailed", triggerData ); | |
}); | |
return; | |
} | |
// The caller passed us a real page DOM element. Update our | |
// internal state and then trigger a transition to the page. | |
var fromPage = settings.fromPage, | |
url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ), | |
// The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path | |
pageUrl = url, | |
fileUrl = path.getFilePath( url ), | |
active = urlHistory.getActive(), | |
activeIsInitialPage = urlHistory.activeIndex === 0, | |
historyDir = 0, | |
pageTitle = document.title, | |
isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog"; | |
// By default, we prevent changePage requests when the fromPage and toPage | |
// are the same element, but folks that generate content manually/dynamically | |
// and reuse pages want to be able to transition to the same page. To allow | |
// this, they will need to change the default value of allowSamePageTransition | |
// to true, *OR*, pass it in as an option when they manually call changePage(). | |
// It should be noted that our default transition animations assume that the | |
// formPage and toPage are different elements, so they may behave unexpectedly. | |
// It is up to the developer that turns on the allowSamePageTransitiona option | |
// to either turn off transition animations, or make sure that an appropriate | |
// animation transition is used. | |
if( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) { | |
isPageTransitioning = false; | |
mpc.trigger( "pagechange", triggerData ); | |
return; | |
} | |
// We need to make sure the page we are given has already been enhanced. | |
enhancePage( toPage, settings.role ); | |
// If the changePage request was sent from a hashChange event, check to see if the | |
// page is already within the urlHistory stack. If so, we'll assume the user hit | |
// the forward/back button and will try to match the transition accordingly. | |
if( settings.fromHashChange ) { | |
urlHistory.directHashChange({ | |
currentUrl: url, | |
isBack: function() { historyDir = -1; }, | |
isForward: function() { historyDir = 1; } | |
}); | |
} | |
// Kill the keyboard. | |
// XXX_jblas: We need to stop crawling the entire document to kill focus. Instead, | |
// we should be tracking focus with a live() handler so we already have | |
// the element in hand at this point. | |
// Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement | |
// is undefined when we are in an IFrame. | |
try { | |
$( document.activeElement || "" ).add( "input:focus, textarea:focus, select:focus" ).blur(); | |
} catch(e) {} | |
// If we're displaying the page as a dialog, we don't want the url | |
// for the dialog content to be used in the hash. Instead, we want | |
// to append the dialogHashKey to the url of the current page. | |
if ( isDialog && active ) { | |
// on the initial page load active.url is undefined and in that case should | |
// be an empty string. Moving the undefined -> empty string back into | |
// urlHistory.addNew seemed imprudent given undefined better represents | |
// the url state | |
url = ( active.url || "" ) + dialogHashKey; | |
} | |
// Set the location hash. | |
if( settings.changeHash !== false && url ) { | |
//disable hash listening temporarily | |
urlHistory.ignoreNextHashChange = true; | |
//update hash and history | |
path.set( url ); | |
} | |
//if title element wasn't found, try the page div data attr too | |
var newPageTitle = toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).text(); | |
if( !!newPageTitle && pageTitle == document.title ) { | |
pageTitle = newPageTitle; | |
} | |
//add page to history stack if it's not back or forward | |
if( !historyDir ) { | |
urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role ); | |
} | |
//set page title | |
document.title = urlHistory.getActive().title; | |
//set "toPage" as activePage | |
$.mobile.activePage = toPage; | |
// Make sure we have a transition defined. | |
settings.transition = settings.transition | |
|| ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) | |
|| ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition ); | |
// If we're navigating back in the URL history, set reverse accordingly. | |
settings.reverse = settings.reverse || historyDir < 0; | |
transitionPages( toPage, fromPage, settings.transition, settings.reverse ) | |
.done(function() { | |
removeActiveLinkClass(); | |
//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden | |
if ( settings.duplicateCachedPage ) { | |
settings.duplicateCachedPage.remove(); | |
} | |
//remove initial build class (only present on first pageshow) | |
$html.removeClass( "ui-mobile-rendering" ); | |
releasePageTransitionLock(); | |
// Let listeners know we're all done changing the current page. | |
mpc.trigger( "pagechange", triggerData ); | |
}); | |
}; | |
$.mobile.changePage.defaults = { | |
transition: undefined, | |
reverse: false, | |
changeHash: true, | |
fromHashChange: false, | |
role: undefined, // By default we rely on the role defined by the @data-role attribute. | |
duplicateCachedPage: undefined, | |
pageContainer: undefined, | |
showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage | |
dataUrl: undefined, | |
fromPage: undefined, | |
allowSamePageTransition: false | |
}; | |
/* Event Bindings - hashchange, submit, and click */ | |
function findClosestLink( ele ) | |
{ | |
while ( ele ) { | |
if ( ele.nodeName.toLowerCase() == "a" ) { | |
break; | |
} | |
ele = ele.parentNode; | |
} | |
return ele; | |
} | |
// The base URL for any given element depends on the page it resides in. | |
function getClosestBaseUrl( ele ) | |
{ | |
// Find the closest page and extract out its url. | |
var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ), | |
base = documentBase.hrefNoHash; | |
if ( !url || !path.isPath( url ) ) { | |
url = base; | |
} | |
return path.makeUrlAbsolute( url, base); | |
} | |
//The following event bindings should be bound after mobileinit has been triggered | |
//the following function is called in the init file | |
$.mobile._registerInternalEvents = function(){ | |
//bind to form submit events, handle with Ajax | |
$( "form" ).live('submit', function( event ) { | |
var $this = $( this ); | |
if( !$.mobile.ajaxEnabled || | |
$this.is( ":jqmData(ajax='false')" ) ) { | |
return; | |
} | |
var type = $this.attr( "method" ), | |
target = $this.attr( "target" ), | |
url = $this.attr( "action" ); | |
// If no action is specified, browsers default to using the | |
// URL of the document containing the form. Since we dynamically | |
// pull in pages from external documents, the form should submit | |
// to the URL for the source document of the page containing | |
// the form. | |
if ( !url ) { | |
// Get the @data-url for the page containing the form. | |
url = getClosestBaseUrl( $this ); | |
if ( url === documentBase.hrefNoHash ) { | |
// The url we got back matches the document base, | |
// which means the page must be an internal/embedded page, | |
// so default to using the actual document url as a browser | |
// would. | |
url = documentUrl.hrefNoSearch; | |
} | |
} | |
url = path.makeUrlAbsolute( url, getClosestBaseUrl($this) ); | |
//external submits use regular HTTP | |
if( path.isExternal( url ) || target ) { | |
return; | |
} | |
$.mobile.changePage( | |
url, | |
{ | |
type: type && type.length && type.toLowerCase() || "get", | |
data: $this.serialize(), | |
transition: $this.jqmData( "transition" ), | |
direction: $this.jqmData( "direction" ), | |
reloadPage: true | |
} | |
); | |
event.preventDefault(); | |
}); | |
//add active state on vclick | |
$( document ).bind( "vclick", function( event ) { | |
// if this isn't a left click we don't care. Its important to note | |
// that when the virtual event is generated it will create | |
if ( event.which > 1 ){ | |
return; | |
} | |
var link = findClosestLink( event.target ); | |
if ( link ) { | |
if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) { | |
removeActiveLinkClass( true ); | |
$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" ); | |
$activeClickedLink.addClass( $.mobile.activeBtnClass ); | |
$( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur(); | |
} | |
} | |
}); | |
// click routing - direct to HTTP or Ajax, accordingly | |
$( document ).bind( "click", function( event ) { | |
var link = findClosestLink( event.target ); | |
// If there is no link associated with the click or its not a left | |
// click we want to ignore the click | |
if ( !link || event.which > 1) { | |
return; | |
} | |
var $link = $( link ), | |
//remove active link class if external (then it won't be there if you come back) | |
httpCleanup = function(){ | |
window.setTimeout( function() { removeActiveLinkClass( true ); }, 200 ); | |
}; | |
//if there's a data-rel=back attr, go back in history | |
if( $link.is( ":jqmData(rel='back')" ) ) { | |
window.history.back(); | |
return false; | |
} | |
var baseUrl = getClosestBaseUrl( $link ), | |
//get href, if defined, otherwise default to empty hash | |
href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl ); | |
//if ajax is disabled, exit early | |
if( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ){ | |
httpCleanup(); | |
//use default click handling | |
return; | |
} | |
// XXX_jblas: Ideally links to application pages should be specified as | |
// an url to the application document with a hash that is either | |
// the site relative path or id to the page. But some of the | |
// internal code that dynamically generates sub-pages for nested | |
// lists and select dialogs, just write a hash in the link they | |
// create. This means the actual URL path is based on whatever | |
// the current value of the base tag is at the time this code | |
// is called. For now we are just assuming that any url with a | |
// hash in it is an application page reference. | |
if ( href.search( "#" ) != -1 ) { | |
href = href.replace( /[^#]*#/, "" ); | |
if ( !href ) { | |
//link was an empty hash meant purely | |
//for interaction, so we ignore it. | |
event.preventDefault(); | |
return; | |
} else if ( path.isPath( href ) ) { | |
//we have apath so make it the href we want to load. | |
href = path.makeUrlAbsolute( href, baseUrl ); | |
} else { | |
//we have a simple id so use the documentUrl as its base. | |
href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash ); | |
} | |
} | |
// Should we handle this link, or let the browser deal with it? | |
var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ), | |
// Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR | |
// requests if the document doing the request was loaded via the file:// protocol. | |
// This is usually to allow the application to "phone home" and fetch app specific | |
// data. We normally let the browser handle external/cross-domain urls, but if the | |
// allowCrossDomainPages option is true, we will allow cross-domain http/https | |
// requests to go through our page loading logic. | |
isCrossDomainPageLoad = ( $.mobile.allowCrossDomainPages && documentUrl.protocol === "file:" && href.search( /^https?:/ ) != -1 ), | |
//check for protocol or rel and its not an embedded page | |
//TODO overlap in logic from isExternal, rel=external check should be | |
// moved into more comprehensive isExternalLink | |
isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !isCrossDomainPageLoad ); | |
if( isExternal ) { | |
httpCleanup(); | |
//use default click handling | |
return; | |
} | |
//use ajax | |
var transition = $link.jqmData( "transition" ), | |
direction = $link.jqmData( "direction" ), | |
reverse = ( direction && direction === "reverse" ) || | |
// deprecated - remove by 1.0 | |
$link.jqmData( "back" ), | |
//this may need to be more specific as we use data-rel more | |
role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined; | |
$.mobile.changePage( href, { transition: transition, reverse: reverse, role: role } ); | |
event.preventDefault(); | |
}); | |
//prefetch pages when anchors with data-prefetch are encountered | |
$( ".ui-page" ).live( "pageshow.prefetch", function(){ | |
var urls = []; | |
$( this ).find( "a:jqmData(prefetch)" ).each(function(){ | |
var url = $( this ).attr( "href" ); | |
if ( url && $.inArray( url, urls ) === -1 ) { | |
urls.push( url ); | |
$.mobile.loadPage( url ); | |
} | |
}); | |
} ); | |
$.mobile._handleHashChange = function( hash ) { | |
//find first page via hash | |
var to = path.stripHash( hash ), | |
//transition is false if it's the first page, undefined otherwise (and may be overridden by default) | |
transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined, | |
// default options for the changPage calls made after examining the current state | |
// of the page and the hash | |
changePageOptions = { | |
transition: transition, | |
changeHash: false, | |
fromHashChange: true | |
}; | |
//if listening is disabled (either globally or temporarily), or it's a dialog hash | |
if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) { | |
urlHistory.ignoreNextHashChange = false; | |
return; | |
} | |
// special case for dialogs | |
if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) { | |
// If current active page is not a dialog skip the dialog and continue | |
// in the same direction | |
if(!$.mobile.activePage.is( ".ui-dialog" )) { | |
//determine if we're heading forward or backward and continue accordingly past | |
//the current dialog | |
urlHistory.directHashChange({ | |
currentUrl: to, | |
isBack: function() { window.history.back(); }, | |
isForward: function() { window.history.forward(); } | |
}); | |
// prevent changePage() | |
return; | |
} else { | |
// if the current active page is a dialog and we're navigating | |
// to a dialog use the dialog objected saved in the stack | |
urlHistory.directHashChange({ | |
currentUrl: to, | |
// regardless of the direction of the history change | |
// do the following | |
either: function( isBack ) { | |
var active = $.mobile.urlHistory.getActive(); | |
to = active.pageUrl; | |
// make sure to set the role, transition and reversal | |
// as most of this is lost by the domCache cleaning | |
$.extend( changePageOptions, { | |
role: active.role, | |
transition: active.transition, | |
reverse: isBack | |
}); | |
} | |
}); | |
} | |
} | |
//if to is defined, load it | |
if ( to ) { | |
// At this point, 'to' can be one of 3 things, a cached page element from | |
// a history stack entry, an id, or site-relative/absolute URL. If 'to' is | |
// an id, we need to resolve it against the documentBase, not the location.href, | |
// since the hashchange could've been the result of a forward/backward navigation | |
// that crosses from an external page/dialog to an internal page/dialog. | |
to = ( typeof to === "string" && !path.isPath( to ) ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to; | |
$.mobile.changePage( to, changePageOptions ); | |
} else { | |
//there's no hash, go to the first page in the dom | |
$.mobile.changePage( $.mobile.firstPage, changePageOptions ); | |
} | |
}; | |
//hashchange event handler | |
$window.bind( "hashchange", function( e, triggered ) { | |
$.mobile._handleHashChange( location.hash ); | |
}); | |
//set page min-heights to be device specific | |
$( document ).bind( "pageshow", resetActivePageHeight ); | |
$( window ).bind( "throttledresize", resetActivePageHeight ); | |
};//_registerInternalEvents callback | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : history.pushState support, layered on top of hashchange | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
( function( $, window ) { | |
// For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents | |
// Scope self to pushStateHandler so we can reference it sanely within the | |
// methods handed off as event handlers | |
var pushStateHandler = {}, | |
self = pushStateHandler, | |
$win = $( window ), | |
url = $.mobile.path.parseUrl( location.href ); | |
$.extend( pushStateHandler, { | |
// TODO move to a path helper, this is rather common functionality | |
initialFilePath: (function() { | |
return url.pathname + url.search; | |
})(), | |
initialHref: url.hrefNoHash, | |
// Flag for tracking if a Hashchange naturally occurs after each popstate + replace | |
hashchangeFired: false, | |
state: function() { | |
return { | |
hash: location.hash || "#" + self.initialFilePath, | |
title: document.title, | |
// persist across refresh | |
initialHref: self.initialHref | |
}; | |
}, | |
resetUIKeys: function( url ) { | |
var dialog = $.mobile.dialogHashKey, | |
subkey = "&" + $.mobile.subPageUrlKey, | |
dialogIndex = url.indexOf( dialog ); | |
if( dialogIndex > -1 ) { | |
url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex ); | |
} else if( url.indexOf( subkey ) > -1 ) { | |
url = url.split( subkey ).join( "#" + subkey ); | |
} | |
return url; | |
}, | |
// TODO sort out a single barrier to hashchange functionality | |
nextHashChangePrevented: function( value ) { | |
$.mobile.urlHistory.ignoreNextHashChange = value; | |
self.onHashChangeDisabled = value; | |
}, | |
// on hash change we want to clean up the url | |
// NOTE this takes place *after* the vanilla navigation hash change | |
// handling has taken place and set the state of the DOM | |
onHashChange: function( e ) { | |
// disable this hash change | |
if( self.onHashChangeDisabled ){ | |
return; | |
} | |
var href, state, | |
hash = location.hash, | |
isPath = $.mobile.path.isPath( hash ); | |
hash = isPath ? hash.replace( "#", "" ) : hash; | |
// propulate the hash when its not available | |
state = self.state(); | |
// make the hash abolute with the current href | |
href = $.mobile.path.makeUrlAbsolute( hash, location.href ); | |
if ( isPath ) { | |
href = self.resetUIKeys( href ); | |
} | |
// replace the current url with the new href and store the state | |
// Note that in some cases we might be replacing an url with the | |
// same url. We do this anyways because we need to make sure that | |
// all of our history entries have a state object associated with | |
// them. This allows us to work around the case where window.history.back() | |
// is called to transition from an external page to an embedded page. | |
// In that particular case, a hashchange event is *NOT* generated by the browser. | |
// Ensuring each history entry has a state object means that onPopState() | |
// will always trigger our hashchange callback even when a hashchange event | |
// is not fired. | |
history.replaceState( state, document.title, href ); | |
}, | |
// on popstate (ie back or forward) we need to replace the hash that was there previously | |
// cleaned up by the additional hash handling | |
onPopState: function( e ) { | |
var poppedState = e.originalEvent.state, holdnexthashchange = false; | |
// if there's no state its not a popstate we care about, ie chrome's initial popstate | |
// or forward popstate | |
if( poppedState ) { | |
// disable any hashchange triggered by the browser | |
self.nextHashChangePrevented( true ); | |
// defer our manual hashchange until after the browser fired | |
// version has come and gone | |
setTimeout(function() { | |
// make sure that the manual hash handling takes place | |
self.nextHashChangePrevented( false ); | |
// change the page based on the hash | |
$.mobile._handleHashChange( poppedState.hash ); | |
}, 100); | |
} | |
}, | |
init: function() { | |
$win.bind( "hashchange", self.onHashChange ); | |
// Handle popstate events the occur through history changes | |
$win.bind( "popstate", self.onPopState ); | |
// if there's no hash, we need to replacestate for returning to home | |
if ( location.hash === "" ) { | |
history.replaceState( self.state(), document.title, location.href ); | |
} | |
} | |
}); | |
$( function() { | |
if( $.mobile.pushStateEnabled && $.support.pushState ){ | |
pushStateHandler.init(); | |
} | |
}); | |
})( jQuery, this );/*! | |
* jQuery Mobile v@VERSION | |
* http://jquerymobile.com/ | |
* | |
* Copyright 2010, jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, window, undefined ) { | |
function css3TransitionHandler( name, reverse, $to, $from ) { | |
var deferred = new $.Deferred(), | |
reverseClass = reverse ? " reverse" : "", | |
viewportClass = "ui-mobile-viewport-transitioning viewport-" + name, | |
doneFunc = function() { | |
$to.add( $from ).removeClass( "out in reverse " + name ); | |
if ( $from && $from[ 0 ] !== $to[ 0 ] ) { | |
$from.removeClass( $.mobile.activePageClass ); | |
} | |
$to.parent().removeClass( viewportClass ); | |
deferred.resolve( name, reverse, $to, $from ); | |
}; | |
$to.animationComplete( doneFunc ); | |
$to.parent().addClass( viewportClass ); | |
if ( $from ) { | |
$from.addClass( name + " out" + reverseClass ); | |
} | |
$to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass ); | |
return deferred.promise(); | |
} | |
// Make our transition handler public. | |
$.mobile.css3TransitionHandler = css3TransitionHandler; | |
// If the default transition handler is the 'none' handler, replace it with our handler. | |
if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) { | |
$.mobile.defaultTransitionHandler = css3TransitionHandler; | |
} | |
})( jQuery, this ); | |
/* | |
* jQuery Mobile Framework : "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made. | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.mobile.page.prototype.options.degradeInputs = { | |
color: false, | |
date: false, | |
datetime: false, | |
"datetime-local": false, | |
email: false, | |
month: false, | |
number: false, | |
range: "number", | |
search: "text", | |
tel: false, | |
time: false, | |
url: false, | |
week: false | |
}; | |
$.mobile.page.prototype.options.keepNative = ":jqmData(role='none'), :jqmData(role='nojs')"; | |
//auto self-init widgets | |
$( document ).bind( "pagecreate enhance", function( e ){ | |
var page = $( e.target ).data( "page" ), | |
o = page.options; | |
// degrade inputs to avoid poorly implemented native functionality | |
$( e.target ).find( "input" ).not( o.keepNative ).each(function() { | |
var $this = $( this ), | |
type = this.getAttribute( "type" ), | |
optType = o.degradeInputs[ type ] || "text"; | |
if ( o.degradeInputs[ type ] ) { | |
var html = $( "<div>" ).html( $this.clone() ).html(), | |
// In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead | |
hasType = html.indexOf( " type=" ) > -1, | |
findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/, | |
repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" ); | |
$this.replaceWith( html.replace( findstr, repstr ) ); | |
} | |
}); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : "dialog" plugin. | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. | |
*/ | |
(function( $, window, undefined ) { | |
$.widget( "mobile.dialog", $.mobile.widget, { | |
options: { | |
closeBtnText : "Close", | |
theme : "a", | |
initSelector : ":jqmData(role='dialog')" | |
}, | |
_create: function() { | |
var self = this, | |
$el = this.element, | |
pageTheme = $el.attr( "class" ).match( /ui-body-[a-z]/ ), | |
headerCloseButton = $( "<a href='#' data-" + $.mobile.ns + "icon='delete' data-" + $.mobile.ns + "iconpos='notext'>"+ this.options.closeBtnText + "</a>" ); | |
if( pageTheme.length ){ | |
$el.removeClass( pageTheme[ 0 ] ); | |
} | |
$el.addClass( "ui-body-" + this.options.theme ); | |
// Class the markup for dialog styling | |
// Set aria role | |
$el.attr( "role", "dialog" ) | |
.addClass( "ui-dialog" ) | |
.find( ":jqmData(role='header')" ) | |
.addClass( "ui-corner-top ui-overlay-shadow" ) | |
.prepend( headerCloseButton ) | |
.end() | |
.find( ":jqmData(role='content'),:jqmData(role='footer')" ) | |
.last() | |
.addClass( "ui-corner-bottom ui-overlay-shadow" ); | |
// this must be an anonymous function so that select menu dialogs can replace | |
// the close method. This is a change from previously just defining data-rel=back | |
// on the button and letting nav handle it | |
headerCloseButton.bind( "vclick", function() { | |
self.close(); | |
}); | |
/* bind events | |
- clicks and submits should use the closing transition that the dialog opened with | |
unless a data-transition is specified on the link/form | |
- if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally | |
*/ | |
$el.bind( "vclick submit", function( event ) { | |
var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ), | |
active; | |
if ( $target.length && !$target.jqmData( "transition" ) ) { | |
active = $.mobile.urlHistory.getActive() || {}; | |
$target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) ) | |
.attr( "data-" + $.mobile.ns + "direction", "reverse" ); | |
} | |
}) | |
.bind( "pagehide", function() { | |
$( this ).find( "." + $.mobile.activeBtnClass ).removeClass( $.mobile.activeBtnClass ); | |
}); | |
}, | |
// Close method goes back in history | |
close: function() { | |
window.history.back(); | |
} | |
}); | |
//auto self-init widgets | |
$( $.mobile.dialog.prototype.options.initSelector ).live( "pagecreate", function(){ | |
$( this ).dialog(); | |
}); | |
})( jQuery, this ); | |
/* | |
* jQuery Mobile Framework : This plugin handles theming and layout of headers, footers, and content areas | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.mobile.page.prototype.options.backBtnText = "Back"; | |
$.mobile.page.prototype.options.addBackBtn = false; | |
$.mobile.page.prototype.options.backBtnTheme = null; | |
$.mobile.page.prototype.options.headerTheme = "a"; | |
$.mobile.page.prototype.options.footerTheme = "a"; | |
$.mobile.page.prototype.options.contentTheme = null; | |
$( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", function( e ) { | |
var $page = $( this ), | |
o = $page.data( "page" ).options, | |
pageTheme = o.theme; | |
$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() { | |
var $this = $( this ), | |
role = $this.jqmData( "role" ), | |
theme = $this.jqmData( "theme" ), | |
$headeranchors, | |
leftbtn, | |
rightbtn, | |
backBtn; | |
$this.addClass( "ui-" + role ); | |
//apply theming and markup modifications to page,header,content,footer | |
if ( role === "header" || role === "footer" ) { | |
var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme; | |
//add theme class | |
$this.addClass( "ui-bar-" + thisTheme ); | |
// Add ARIA role | |
$this.attr( "role", role === "header" ? "banner" : "contentinfo" ); | |
// Right,left buttons | |
$headeranchors = $this.children( "a" ); | |
leftbtn = $headeranchors.hasClass( "ui-btn-left" ); | |
rightbtn = $headeranchors.hasClass( "ui-btn-right" ); | |
if ( !leftbtn ) { | |
leftbtn = $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length; | |
} | |
if ( !rightbtn ) { | |
rightbtn = $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length; | |
} | |
// Auto-add back btn on pages beyond first view | |
if ( o.addBackBtn && role === "header" && | |
$( ".ui-page" ).length > 1 && | |
$this.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) && | |
!leftbtn ) { | |
backBtn = $( "<a href='#' class='ui-btn-left' data-"+ $.mobile.ns +"rel='back' data-"+ $.mobile.ns +"icon='arrow-l'>"+ o.backBtnText +"</a>" ).prependTo( $this ); | |
// If theme is provided, override default inheritance | |
backBtn.attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme ); | |
} | |
// Page title | |
$this.children( "h1, h2, h3, h4, h5, h6" ) | |
.addClass( "ui-title" ) | |
// Regardless of h element number in src, it becomes h1 for the enhanced page | |
.attr({ | |
"tabindex": "0", | |
"role": "heading", | |
"aria-level": "1" | |
}); | |
} else if ( role === "content" ) { | |
if (theme || o.contentTheme) { | |
$this.addClass( "ui-body-" + ( theme || o.contentTheme ) ); | |
} | |
// Add ARIA role | |
$this.attr( "role", "main" ); | |
} | |
}); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : "collapsible" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.collapsible", $.mobile.widget, { | |
options: { | |
expandCueText: " click to expand contents", | |
collapseCueText: " click to collapse contents", | |
collapsed: true, | |
heading: ">:header,>legend", | |
theme: null, | |
contentTheme: null, | |
iconTheme: "d", | |
initSelector: ":jqmData(role='collapsible')" | |
}, | |
_create: function() { | |
var $el = this.element, | |
o = this.options, | |
collapsible = $el.addClass( "ui-collapsible" ), | |
collapsibleHeading = $el.find( o.heading ).eq( 0 ), | |
collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).find( ".ui-collapsible-content" ), | |
collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ), | |
colllapsiblesInSet = collapsibleSet.children( ":jqmData(role='collapsible')" ); | |
// Replace collapsibleHeading if it's a legend | |
if ( collapsibleHeading.is( "legend" ) ) { | |
collapsibleHeading = $( "<div role='heading'>"+ collapsibleHeading.html() +"</div>" ).insertBefore( collapsibleHeading ); | |
collapsibleHeading.next().remove(); | |
} | |
// If we are in a collapsible set | |
if ( collapsibleSet.length ) { | |
// Inherit the theme from collapsible-set | |
if ( !o.theme ) { | |
o.theme = collapsibleSet.jqmData( "theme" ); | |
} | |
// Inherit the content-theme from collapsible-set | |
if ( !o.contentTheme ) { | |
o.contentTheme = collapsibleSet.jqmData( "content-theme" ); | |
} | |
} | |
collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : ""); | |
collapsibleHeading | |
//drop heading in before content | |
.insertBefore( collapsibleContent ) | |
//modify markup & attributes | |
.addClass( "ui-collapsible-heading" ) | |
.append( "<span class='ui-collapsible-heading-status'></span>" ) | |
.wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" ) | |
.find( "a:eq(0)" ) | |
.buttonMarkup({ | |
shadow: false, | |
corners: false, | |
iconPos: "left", | |
icon: "plus", | |
theme: o.theme | |
}); | |
if ( !collapsibleSet.length ) { | |
collapsibleHeading | |
.find( "a:eq(0), .ui-btn-inner" ) | |
.addClass( "ui-corner-top ui-corner-bottom" ); | |
} else { | |
// If we are in a collapsible set | |
// Initialize the collapsible set if it's not already initialized | |
if ( !collapsibleSet.jqmData( "collapsiblebound" ) ) { | |
collapsibleSet | |
.jqmData( "collapsiblebound", true ) | |
.bind( "expand", function( event ) { | |
$( event.target ) | |
.closest( ".ui-collapsible" ) | |
.siblings( ".ui-collapsible" ) | |
.trigger( "collapse" ); | |
}); | |
} | |
colllapsiblesInSet.first() | |
.find( "a:eq(0)" ) | |
.addClass( "ui-corner-top" ) | |
.find( ".ui-btn-inner" ) | |
.addClass( "ui-corner-top" ); | |
colllapsiblesInSet.last() | |
.jqmData( "collapsible-last", true ) | |
.find( "a:eq(0)" ) | |
.addClass( "ui-corner-bottom" ) | |
.find( ".ui-btn-inner" ) | |
.addClass( "ui-corner-bottom" ); | |
if ( collapsible.jqmData( "collapsible-last" ) ) { | |
collapsibleHeading | |
.find( "a:eq(0), .ui-btn-inner" ) | |
.addClass( "ui-corner-bottom" ); | |
} | |
} | |
//events | |
collapsible | |
.bind( "expand collapse", function( event ) { | |
if ( !event.isDefaultPrevented() ) { | |
event.preventDefault(); | |
var $this = $( this ), | |
isCollapse = ( event.type === "collapse" ), | |
contentTheme = o.contentTheme; | |
collapsibleHeading | |
.toggleClass( "ui-collapsible-heading-collapsed", isCollapse) | |
.find( ".ui-collapsible-heading-status" ) | |
.text( o.expandCueText ) | |
.end() | |
.find( ".ui-icon" ) | |
.toggleClass( "ui-icon-minus", !isCollapse ) | |
.toggleClass( "ui-icon-plus", isCollapse ); | |
$this.toggleClass( "ui-collapsible-collapsed", isCollapse ); | |
collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse ); | |
if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) { | |
collapsibleHeading | |
.find( "a:eq(0), .ui-btn-inner" ) | |
.toggleClass( "ui-corner-bottom", isCollapse ); | |
collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse ); | |
} | |
} | |
}) | |
.trigger( o.collapsed ? "collapse" : "expand" ); | |
collapsibleHeading | |
.bind( "click", function( event ) { | |
var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? | |
"expand" : "collapse"; | |
collapsible.trigger( type ); | |
event.preventDefault(); | |
}); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "fieldcontain" plugin - simple class additions to make form row separators | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.fn.fieldcontain = function( options ) { | |
return this.addClass( "ui-field-contain ui-body ui-br" ); | |
}; | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( ":jqmData(role='fieldcontain')", e.target ).fieldcontain(); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : plugin for creating CSS grids | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.fn.grid = function( options ) { | |
return this.each(function() { | |
var $this = $( this ), | |
o = $.extend({ | |
grid: null | |
},options), | |
$kids = $this.children(), | |
gridCols = {solo:1, a:2, b:3, c:4, d:5}, | |
grid = o.grid, | |
iterator; | |
if ( !grid ) { | |
if ( $kids.length <= 5 ) { | |
for ( var letter in gridCols ) { | |
if ( gridCols[ letter ] === $kids.length ) { | |
grid = letter; | |
} | |
} | |
} else { | |
grid = "a"; | |
} | |
} | |
iterator = gridCols[grid]; | |
$this.addClass( "ui-grid-" + grid ); | |
$kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" ); | |
if ( iterator > 1 ) { | |
$kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" ); | |
} | |
if ( iterator > 2 ) { | |
$kids.filter( ":nth-child(3n+3)" ).addClass( "ui-block-c" ); | |
} | |
if ( iterator > 3 ) { | |
$kids.filter( ":nth-child(4n+4)" ).addClass( "ui-block-d" ); | |
} | |
if ( iterator > 4 ) { | |
$kids.filter( ":nth-child(5n+5)" ).addClass( "ui-block-e" ); | |
} | |
}); | |
}; | |
})( jQuery );/* | |
* jQuery Mobile Framework : "navbar" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.navbar", $.mobile.widget, { | |
options: { | |
iconpos: "top", | |
grid: null, | |
initSelector: ":jqmData(role='navbar')" | |
}, | |
_create: function(){ | |
var $navbar = this.element, | |
$navbtns = $navbar.find( "a" ), | |
iconpos = $navbtns.filter( ":jqmData(icon)" ).length ? | |
this.options.iconpos : undefined; | |
$navbar.addClass( "ui-navbar" ) | |
.attr( "role","navigation" ) | |
.find( "ul" ) | |
.grid({ grid: this.options.grid }); | |
if ( !iconpos ) { | |
$navbar.addClass( "ui-navbar-noicons" ); | |
} | |
$navbtns.buttonMarkup({ | |
corners: false, | |
shadow: false, | |
iconpos: iconpos | |
}); | |
$navbar.delegate( "a", "vclick", function( event ) { | |
$navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass ); | |
$( this ).addClass( $.mobile.activeBtnClass ); | |
}); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.navbar.prototype.options.initSelector, e.target ).navbar(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "listview" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
//Keeps track of the number of lists per page UID | |
//This allows support for multiple nested list in the same page | |
//https://github.com/jquery/jquery-mobile/issues/1617 | |
var listCountPerPage = {}; | |
$.widget( "mobile.listview", $.mobile.widget, { | |
options: { | |
theme: "c", | |
countTheme: "c", | |
headerTheme: "b", | |
dividerTheme: "b", | |
splitIcon: "arrow-r", | |
splitTheme: "b", | |
inset: false, | |
initSelector: ":jqmData(role='listview')" | |
}, | |
_create: function() { | |
var t = this; | |
// create listview markup | |
t.element.addClass(function( i, orig ) { | |
return orig + " ui-listview " + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" ); | |
}); | |
t.refresh( true ); | |
}, | |
_itemApply: function( $list, item ) { | |
var $countli = item.find( ".ui-li-count" ); | |
if ( $countli.length ) { | |
item.addClass( "ui-li-has-count" ); | |
} | |
$countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" ); | |
// TODO class has to be defined in markup | |
item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end() | |
.find( "p, dl" ).addClass( "ui-li-desc" ).end() | |
.find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function() { | |
item.addClass( $(this).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" ); | |
}).end() | |
.find( ".ui-li-aside" ).each(function() { | |
var $this = $(this); | |
$this.prependTo( $this.parent() ); //shift aside to front for css float | |
}); | |
}, | |
_removeCorners: function( li, which ) { | |
var top = "ui-corner-top ui-corner-tr ui-corner-tl", | |
bot = "ui-corner-bottom ui-corner-br ui-corner-bl"; | |
li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) ); | |
if ( which === "top" ) { | |
li.removeClass( top ); | |
} else if ( which === "bottom" ) { | |
li.removeClass( bot ); | |
} else { | |
li.removeClass( top + " " + bot ); | |
} | |
}, | |
_refreshCorners: function( create ) { | |
var $li, | |
$visibleli, | |
$topli, | |
$bottomli; | |
if ( this.options.inset ) { | |
$li = this.element.children( "li" ); | |
// at create time the li are not visible yet so we need to rely on .ui-screen-hidden | |
$visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" ); | |
this._removeCorners( $li ); | |
// Select the first visible li element | |
$topli = $visibleli.first() | |
.addClass( "ui-corner-top" ); | |
$topli.add( $topli.find( ".ui-btn-inner" ) ) | |
.find( ".ui-li-link-alt" ) | |
.addClass( "ui-corner-tr" ) | |
.end() | |
.find( ".ui-li-thumb" ) | |
.addClass( "ui-corner-tl" ); | |
// Select the last visible li element | |
$bottomli = $visibleli.last() | |
.addClass( "ui-corner-bottom" ); | |
$bottomli.add( $bottomli.find( ".ui-btn-inner" ) ) | |
.find( ".ui-li-link-alt" ) | |
.addClass( "ui-corner-br" ) | |
.end() | |
.find( ".ui-li-thumb" ) | |
.addClass( "ui-corner-bl" ); | |
} | |
}, | |
refresh: function( create ) { | |
this.parentPage = this.element.closest( ".ui-page" ); | |
this._createSubPages(); | |
var o = this.options, | |
$list = this.element, | |
self = this, | |
dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme, | |
listsplittheme = $list.jqmData( "splittheme" ), | |
listspliticon = $list.jqmData( "spliticon" ), | |
li = $list.children( "li" ), | |
counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1, | |
item, itemClass, itemTheme, | |
a, last, splittheme, countParent, icon; | |
if ( counter ) { | |
$list.find( ".ui-li-dec" ).remove(); | |
} | |
for ( var pos = 0, numli = li.length; pos < numli; pos++ ) { | |
item = li.eq( pos ); | |
itemClass = "ui-li"; | |
// If we're creating the element, we update it regardless | |
if ( create || !item.hasClass( "ui-li" ) ) { | |
itemTheme = item.jqmData("theme") || o.theme; | |
a = item.children( "a" ); | |
if ( a.length ) { | |
icon = item.jqmData("icon"); | |
item.buttonMarkup({ | |
wrapperEls: "div", | |
shadow: false, | |
corners: false, | |
iconpos: "right", | |
icon: a.length > 1 || icon === false ? false : icon || "arrow-r", | |
theme: itemTheme | |
}); | |
if ( ( icon != false ) && ( a.length == 1 ) ) { | |
item.addClass( "ui-li-has-arrow" ); | |
} | |
a.first().addClass( "ui-link-inherit" ); | |
if ( a.length > 1 ) { | |
itemClass += " ui-li-has-alt"; | |
last = a.last(); | |
splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme; | |
last.appendTo(item) | |
.attr( "title", last.text() ) | |
.addClass( "ui-li-link-alt" ) | |
.empty() | |
.buttonMarkup({ | |
shadow: false, | |
corners: false, | |
theme: itemTheme, | |
icon: false, | |
iconpos: false | |
}) | |
.find( ".ui-btn-inner" ) | |
.append( | |
$( "<span />" ).buttonMarkup({ | |
shadow: true, | |
corners: true, | |
theme: splittheme, | |
iconpos: "notext", | |
icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon | |
}) | |
); | |
} | |
} else if ( item.jqmData( "role" ) === "list-divider" ) { | |
itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme; | |
item.attr( "role", "heading" ); | |
//reset counter when a divider heading is encountered | |
if ( counter ) { | |
counter = 1; | |
} | |
} else { | |
itemClass += " ui-li-static ui-body-" + itemTheme; | |
} | |
} | |
if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) { | |
countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" ); | |
countParent.addClass( "ui-li-jsnumbering" ) | |
.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" ); | |
} | |
item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass ); | |
self._itemApply( $list, item ); | |
} | |
this._refreshCorners( create ); | |
}, | |
//create a string for ID/subpage url creation | |
_idStringEscape: function( str ) { | |
return str.replace(/[^a-zA-Z0-9]/g, '-'); | |
}, | |
_createSubPages: function() { | |
var parentList = this.element, | |
parentPage = parentList.closest( ".ui-page" ), | |
parentUrl = parentPage.jqmData( "url" ), | |
parentId = parentUrl || parentPage[ 0 ][ $.expando ], | |
parentListId = parentList.attr( "id" ), | |
o = this.options, | |
dns = "data-" + $.mobile.ns, | |
self = this, | |
persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ), | |
hasSubPages; | |
if ( typeof listCountPerPage[ parentId ] === "undefined" ) { | |
listCountPerPage[ parentId ] = -1; | |
} | |
parentListId = parentListId || ++listCountPerPage[ parentId ]; | |
$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) { | |
var self = this, | |
list = $( this ), | |
listId = list.attr( "id" ) || parentListId + "-" + i, | |
parent = list.parent(), | |
nodeEls = $( list.prevAll().toArray().reverse() ), | |
nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" ), | |
title = nodeEls.first().text(),//url limits to first 30 chars of text | |
id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId, | |
theme = list.jqmData( "theme" ) || o.theme, | |
countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme, | |
newPage, anchor; | |
//define hasSubPages for use in later removal | |
hasSubPages = true; | |
newPage = list.detach() | |
.wrap( "<div " + dns + "role='page' " + dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" ) | |
.parent() | |
.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" ) | |
.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='"+ persistentFooterID +"'>") : "" ) | |
.parent() | |
.appendTo( $.mobile.pageContainer ); | |
newPage.page(); | |
anchor = parent.find('a:first'); | |
if ( !anchor.length ) { | |
anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() ); | |
} | |
anchor.attr( "href", "#" + id ); | |
}).listview(); | |
// on pagehide, remove any nested pages along with the parent page, as long as they aren't active | |
// and aren't embedded | |
if( hasSubPages && | |
parentPage.is( ":jqmData(external-page='true')" ) && | |
parentPage.data("page").options.domCache === false ) { | |
var newRemove = function( e, ui ){ | |
var nextPage = ui.nextPage, npURL; | |
if( ui.nextPage ){ | |
npURL = nextPage.jqmData( "url" ); | |
if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){ | |
self.childPages().remove(); | |
parentPage.remove(); | |
} | |
} | |
}; | |
// unbind the original page remove and replace with our specialized version | |
parentPage | |
.unbind( "pagehide.remove" ) | |
.bind( "pagehide.remove", newRemove); | |
} | |
}, | |
// TODO sort out a better way to track sub pages of the listview this is brittle | |
childPages: function(){ | |
var parentUrl = this.parentPage.jqmData( "url" ); | |
return $( ":jqmData(url^='"+ parentUrl + "&" + $.mobile.subPageUrlKey +"')"); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.listview.prototype.options.initSelector, e.target ).listview(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "listview" filter extension | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.mobile.listview.prototype.options.filter = false; | |
$.mobile.listview.prototype.options.filterPlaceholder = "Filter items..."; | |
$.mobile.listview.prototype.options.filterTheme = "c"; | |
$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){ | |
return text.toLowerCase().indexOf( searchValue ) === -1; | |
}; | |
$( ":jqmData(role='listview')" ).live( "listviewcreate", function() { | |
var list = $( this ), | |
listview = list.data( "listview" ); | |
if ( !listview.options.filter ) { | |
return; | |
} | |
var wrapper = $( "<form>", { | |
"class": "ui-listview-filter ui-bar-" + listview.options.filterTheme, | |
"role": "search" | |
}), | |
search = $( "<input>", { | |
placeholder: listview.options.filterPlaceholder | |
}) | |
.attr( "data-" + $.mobile.ns + "type", "search" ) | |
.jqmData( "lastval", "" ) | |
.bind( "keyup change", function() { | |
var $this = $(this), | |
val = this.value.toLowerCase(), | |
listItems = null, | |
lastval = $this.jqmData( "lastval" ) + "", | |
childItems = false, | |
itemtext = "", | |
item, change; | |
// Change val as lastval for next execution | |
$this.jqmData( "lastval" , val ); | |
change = val.replace( new RegExp( "^" + lastval ) , "" ); | |
if ( val.length < lastval.length || change.length != ( val.length - lastval.length ) ) { | |
// Removed chars or pasted something totaly different, check all items | |
listItems = list.children(); | |
} else { | |
// Only chars added, not removed, only use visible subset | |
listItems = list.children( ":not(.ui-screen-hidden)" ); | |
} | |
if ( val ) { | |
// This handles hiding regular rows without the text we search for | |
// and any list dividers without regular rows shown under it | |
for ( var i = listItems.length - 1; i >= 0; i-- ) { | |
item = $( listItems[ i ] ); | |
itemtext = item.jqmData( "filtertext" ) || item.text(); | |
if ( item.is( "li:jqmData(role=list-divider)" ) ) { | |
item.toggleClass( "ui-filter-hidequeue" , !childItems ); | |
// New bucket! | |
childItems = false; | |
} else if ( listview.options.filterCallback( itemtext, val ) ) { | |
//mark to be hidden | |
item.toggleClass( "ui-filter-hidequeue" , true ); | |
} else { | |
// There"s a shown item in the bucket | |
childItems = true; | |
} | |
} | |
// Show items, not marked to be hidden | |
listItems | |
.filter( ":not(.ui-filter-hidequeue)" ) | |
.toggleClass( "ui-screen-hidden", false ); | |
// Hide items, marked to be hidden | |
listItems | |
.filter( ".ui-filter-hidequeue" ) | |
.toggleClass( "ui-screen-hidden", true ) | |
.toggleClass( "ui-filter-hidequeue", false ); | |
} else { | |
//filtervalue is empty => show all | |
listItems.toggleClass( "ui-screen-hidden", false ); | |
} | |
listview._refreshCorners(); | |
}) | |
.appendTo( wrapper ) | |
.textinput(); | |
if ( $( this ).jqmData( "inset" ) ) { | |
wrapper.addClass( "ui-listview-filter-inset" ); | |
} | |
wrapper.bind( "submit", function() { | |
return false; | |
}) | |
.insertBefore( list ); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : "nojs" plugin - class to make elements hidden to A grade browsers | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" ); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : "checkboxradio" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.checkboxradio", $.mobile.widget, { | |
options: { | |
theme: null, | |
initSelector: "input[type='checkbox'],input[type='radio']" | |
}, | |
_create: function() { | |
var self = this, | |
input = this.element, | |
// NOTE: Windows Phone could not find the label through a selector | |
// filter works though. | |
label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label" ).filter( "[for='" + input[ 0 ].id + "']"), | |
inputtype = input.attr( "type" ), | |
checkedState = inputtype + "-on", | |
uncheckedState = inputtype + "-off", | |
icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState, | |
activeBtn = icon ? "" : " " + $.mobile.activeBtnClass, | |
checkedClass = "ui-" + checkedState + activeBtn, | |
uncheckedClass = "ui-" + uncheckedState, | |
checkedicon = "ui-icon-" + checkedState, | |
uncheckedicon = "ui-icon-" + uncheckedState; | |
if ( inputtype !== "checkbox" && inputtype !== "radio" ) { | |
return; | |
} | |
// Expose for other methods | |
$.extend( this, { | |
label: label, | |
inputtype: inputtype, | |
checkedClass: checkedClass, | |
uncheckedClass: uncheckedClass, | |
checkedicon: checkedicon, | |
uncheckedicon: uncheckedicon | |
}); | |
// If there's no selected theme... | |
if( !this.options.theme ) { | |
this.options.theme = this.element.jqmData( "theme" ); | |
} | |
label.buttonMarkup({ | |
theme: this.options.theme, | |
icon: icon, | |
shadow: false | |
}); | |
// Wrap the input + label in a div | |
input.add( label ) | |
.wrapAll( "<div class='ui-" + inputtype + "'></div>" ); | |
label.bind({ | |
vmouseover: function() { | |
if ( $( this ).parent().is( ".ui-disabled" ) ) { | |
return false; | |
} | |
}, | |
vclick: function( event ) { | |
if ( input.is( ":disabled" ) ) { | |
event.preventDefault(); | |
return; | |
} | |
self._cacheVals(); | |
input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) ); | |
// Input set for common radio buttons will contain all the radio | |
// buttons, but will not for checkboxes. clearing the checked status | |
// of other radios ensures the active button state is applied properly | |
self._getInputSet().not( input ).prop( "checked", false ); | |
self._updateAll(); | |
return false; | |
} | |
}); | |
input | |
.bind({ | |
vmousedown: function() { | |
this._cacheVals(); | |
}, | |
vclick: function() { | |
var $this = $(this); | |
// Adds checked attribute to checked input when keyboard is used | |
if ( $this.is( ":checked" ) ) { | |
$this.prop( "checked", true); | |
self._getInputSet().not($this).prop( "checked", false ); | |
} else { | |
$this.prop( "checked", false ); | |
} | |
self._updateAll(); | |
}, | |
focus: function() { | |
label.addClass( "ui-focus" ); | |
}, | |
blur: function() { | |
label.removeClass( "ui-focus" ); | |
} | |
}); | |
this.refresh(); | |
}, | |
_cacheVals: function() { | |
this._getInputSet().each(function() { | |
var $this = $(this); | |
$this.jqmData( "cacheVal", $this.is( ":checked" ) ); | |
}); | |
}, | |
//returns either a set of radios with the same name attribute, or a single checkbox | |
_getInputSet: function(){ | |
if(this.inputtype == "checkbox") { | |
return this.element; | |
} | |
return this.element.closest( "form,fieldset,:jqmData(role='page')" ) | |
.find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" ); | |
}, | |
_updateAll: function() { | |
var self = this; | |
this._getInputSet().each(function() { | |
var $this = $(this); | |
if ( $this.is( ":checked" ) || self.inputtype === "checkbox" ) { | |
$this.trigger( "change" ); | |
} | |
}) | |
.checkboxradio( "refresh" ); | |
}, | |
refresh: function() { | |
var input = this.element, | |
label = this.label, | |
icon = label.find( ".ui-icon" ); | |
// input[0].checked expando doesn't always report the proper value | |
// for checked='checked' | |
if ( $( input[ 0 ] ).prop( "checked" ) ) { | |
label.addClass( this.checkedClass ).removeClass( this.uncheckedClass ); | |
icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon ); | |
} else { | |
label.removeClass( this.checkedClass ).addClass( this.uncheckedClass ); | |
icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon ); | |
} | |
if ( input.is( ":disabled" ) ) { | |
this.disable(); | |
} else { | |
this.enable(); | |
} | |
}, | |
disable: function() { | |
this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" ); | |
}, | |
enable: function() { | |
this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" ); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.checkboxradio.prototype.options.initSelector, e.target ) | |
.not( ":jqmData(role='none'), :jqmData(role='nojs')" ) | |
.checkboxradio(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "button" plugin - links that proxy to native input/buttons | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.button", $.mobile.widget, { | |
options: { | |
theme: null, | |
icon: null, | |
iconpos: null, | |
inline: null, | |
corners: true, | |
shadow: true, | |
iconshadow: true, | |
initSelector: "button, [type='button'], [type='submit'], [type='reset'], [type='image']" | |
}, | |
_create: function() { | |
var $el = this.element, | |
o = this.options, | |
type, | |
name, | |
$buttonPlaceholder; | |
// Add ARIA role | |
this.button = $( "<div></div>" ) | |
.text( $el.text() || $el.val() ) | |
.buttonMarkup({ | |
theme: o.theme, | |
icon: o.icon, | |
iconpos: o.iconpos, | |
inline: o.inline, | |
corners: o.corners, | |
shadow: o.shadow, | |
iconshadow: o.iconshadow | |
}) | |
.insertBefore( $el ) | |
.append( $el.addClass( "ui-btn-hidden" ) ); | |
type = $el.attr( "type" ); | |
name = $el.attr( "name" ); | |
// Add hidden input during submit if input type="submit" has a name. | |
if ( type !== "button" && type !== "reset" && name ) { | |
$el.bind( "vclick", function() { | |
// Add hidden input if it doesn’t already exist. | |
if( $buttonPlaceholder === undefined ) { | |
$buttonPlaceholder = $( "<input>", { | |
type: "hidden", | |
name: $el.attr( "name" ), | |
value: $el.attr( "value" ) | |
}) | |
.insertBefore( $el ); | |
// Bind to doc to remove after submit handling | |
$( document ).submit(function(){ | |
$buttonPlaceholder.remove(); | |
}); | |
} | |
}); | |
} | |
this.refresh(); | |
}, | |
enable: function() { | |
this.element.attr( "disabled", false ); | |
this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); | |
return this._setOption( "disabled", false ); | |
}, | |
disable: function() { | |
this.element.attr( "disabled", true ); | |
this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true ); | |
return this._setOption( "disabled", true ); | |
}, | |
refresh: function() { | |
if ( this.element.attr( "disabled" ) ) { | |
this.disable(); | |
} else { | |
this.enable(); | |
} | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.button.prototype.options.initSelector, e.target ) | |
.not( ":jqmData(role='none'), :jqmData(role='nojs')" ) | |
.button(); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : "slider" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
( function( $, undefined ) { | |
$.widget( "mobile.slider", $.mobile.widget, { | |
options: { | |
theme: null, | |
trackTheme: null, | |
disabled: false, | |
initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')" | |
}, | |
_create: function() { | |
// TODO: Each of these should have comments explain what they're for | |
var self = this, | |
control = this.element, | |
parentTheme = control.parents( "[class*='ui-bar-'],[class*='ui-body-']" ).eq( 0 ), | |
parentTheme = parentTheme.length ? parentTheme.attr( "class" ).match( /ui-(bar|body)-([a-z])/ )[ 2 ] : "c", | |
theme = this.options.theme ? this.options.theme : parentTheme, | |
trackTheme = this.options.trackTheme ? this.options.trackTheme : parentTheme, | |
cType = control[ 0 ].nodeName.toLowerCase(), | |
selectClass = ( cType == "select" ) ? "ui-slider-switch" : "", | |
controlID = control.attr( "id" ), | |
labelID = controlID + "-label", | |
label = $( "[for='"+ controlID +"']" ).attr( "id", labelID ), | |
val = function() { | |
return cType == "input" ? parseFloat( control.val() ) : control[0].selectedIndex; | |
}, | |
min = cType == "input" ? parseFloat( control.attr( "min" ) ) : 0, | |
max = cType == "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1, | |
step = window.parseFloat( control.attr( "step" ) || 1 ), | |
slider = $( "<div class='ui-slider " + selectClass + " ui-btn-down-" + trackTheme + | |
" ui-btn-corner-all' role='application'></div>" ), | |
handle = $( "<a href='#' class='ui-slider-handle'></a>" ) | |
.appendTo( slider ) | |
.buttonMarkup({ corners: true, theme: theme, shadow: true }) | |
.attr({ | |
"role": "slider", | |
"aria-valuemin": min, | |
"aria-valuemax": max, | |
"aria-valuenow": val(), | |
"aria-valuetext": val(), | |
"title": val(), | |
"aria-labelledby": labelID | |
}), | |
options; | |
$.extend( this, { | |
slider: slider, | |
handle: handle, | |
dragging: false, | |
beforeStart: null, | |
userModified: false | |
}); | |
if ( cType == "select" ) { | |
slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" ); | |
options = control.find( "option" ); | |
control.find( "option" ).each(function( i ) { | |
var side = !i ? "b":"a", | |
corners = !i ? "right" :"left", | |
theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass ); | |
$( "<div class='ui-slider-labelbg ui-slider-labelbg-" + side + theme + " ui-btn-corner-" + corners + "'></div>" ) | |
.prependTo( slider ); | |
$( "<span class='ui-slider-label ui-slider-label-" + side + theme + " ui-btn-corner-" + corners + "' role='img'>" + $( this ).text() + "</span>" ) | |
.prependTo( handle ); | |
}); | |
} | |
label.addClass( "ui-slider" ); | |
// monitor the input for updated values | |
control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" ) | |
.change( function() { | |
self.refresh( val(), true ); | |
}) | |
.keyup( function() { // necessary? | |
self.refresh( val(), true, true ); | |
}) | |
.blur( function() { | |
self.refresh( val(), true ); | |
}); | |
// prevent screen drag when slider activated | |
$( document ).bind( "vmousemove", function( event ) { | |
if ( self.dragging ) { | |
self.refresh( event ); | |
self.userModified = self.userModified || self.beforeStart !== control[0].selectedIndex; | |
return false; | |
} | |
}); | |
slider.bind( "vmousedown", function( event ) { | |
self.dragging = true; | |
self.userModified = false; | |
if ( cType === "select" ) { | |
self.beforeStart = control[0].selectedIndex; | |
} | |
self.refresh( event ); | |
return false; | |
}); | |
slider.add( document ) | |
.bind( "vmouseup", function() { | |
if ( self.dragging ) { | |
self.dragging = false; | |
if ( cType === "select" ) { | |
if ( !self.userModified ) { | |
//tap occurred, but value didn't change. flip it! | |
handle.addClass( "ui-slider-handle-snapping" ); | |
self.refresh( !self.beforeStart ? 1 : 0 ); | |
} | |
} | |
return false; | |
} | |
}); | |
slider.insertAfter( control ); | |
// NOTE force focus on handle | |
this.handle | |
.bind( "vmousedown", function() { | |
$( this ).focus(); | |
}) | |
.bind( "vclick", false ); | |
this.handle | |
.bind( "keydown", function( event ) { | |
var index = val(); | |
if ( self.options.disabled ) { | |
return; | |
} | |
// In all cases prevent the default and mark the handle as active | |
switch ( event.keyCode ) { | |
case $.mobile.keyCode.HOME: | |
case $.mobile.keyCode.END: | |
case $.mobile.keyCode.PAGE_UP: | |
case $.mobile.keyCode.PAGE_DOWN: | |
case $.mobile.keyCode.UP: | |
case $.mobile.keyCode.RIGHT: | |
case $.mobile.keyCode.DOWN: | |
case $.mobile.keyCode.LEFT: | |
event.preventDefault(); | |
if ( !self._keySliding ) { | |
self._keySliding = true; | |
$( this ).addClass( "ui-state-active" ); | |
} | |
break; | |
} | |
// move the slider according to the keypress | |
switch ( event.keyCode ) { | |
case $.mobile.keyCode.HOME: | |
self.refresh( min ); | |
break; | |
case $.mobile.keyCode.END: | |
self.refresh( max ); | |
break; | |
case $.mobile.keyCode.PAGE_UP: | |
case $.mobile.keyCode.UP: | |
case $.mobile.keyCode.RIGHT: | |
self.refresh( index + step ); | |
break; | |
case $.mobile.keyCode.PAGE_DOWN: | |
case $.mobile.keyCode.DOWN: | |
case $.mobile.keyCode.LEFT: | |
self.refresh( index - step ); | |
break; | |
} | |
}) // remove active mark | |
.keyup( function( event ) { | |
if ( self._keySliding ) { | |
self._keySliding = false; | |
$( this ).removeClass( "ui-state-active" ); | |
} | |
}); | |
this.refresh(undefined, undefined, true); | |
}, | |
refresh: function( val, isfromControl, preventInputUpdate ) { | |
if ( this.options.disabled ) { return; } | |
var control = this.element, percent, | |
cType = control[0].nodeName.toLowerCase(), | |
min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0, | |
max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1; | |
if ( typeof val === "object" ) { | |
var data = val, | |
// a slight tolerance helped get to the ends of the slider | |
tol = 8; | |
if ( !this.dragging || | |
data.pageX < this.slider.offset().left - tol || | |
data.pageX > this.slider.offset().left + this.slider.width() + tol ) { | |
return; | |
} | |
percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 ); | |
} else { | |
if ( val == null ) { | |
val = cType === "input" ? parseFloat( control.val() ) : control[0].selectedIndex; | |
} | |
percent = ( parseFloat( val ) - min ) / ( max - min ) * 100; | |
} | |
if ( isNaN( percent ) ) { | |
return; | |
} | |
if ( percent < 0 ) { | |
percent = 0; | |
} | |
if ( percent > 100 ) { | |
percent = 100; | |
} | |
var newval = Math.round( ( percent / 100 ) * ( max - min ) ) + min; | |
if ( newval < min ) { | |
newval = min; | |
} | |
if ( newval > max ) { | |
newval = max; | |
} | |
// Flip the stack of the bg colors | |
if ( percent > 60 && cType === "select" ) { | |
// TODO: Dead path? | |
} | |
this.handle.css( "left", percent + "%" ); | |
this.handle.attr( { | |
"aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ), | |
"aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).text(), | |
title: newval | |
}); | |
// add/remove classes for flip toggle switch | |
if ( cType === "select" ) { | |
if ( newval === 0 ) { | |
this.slider.addClass( "ui-slider-switch-a" ) | |
.removeClass( "ui-slider-switch-b" ); | |
} else { | |
this.slider.addClass( "ui-slider-switch-b" ) | |
.removeClass( "ui-slider-switch-a" ); | |
} | |
} | |
if ( !preventInputUpdate ) { | |
var valueChanged = false; | |
// update control"s value | |
if ( cType === "input" ) { | |
valueChanged = control.val() !== newval; | |
control.val( newval ); | |
} else { | |
valueChanged = control[ 0 ].selectedIndex !== newval; | |
control[ 0 ].selectedIndex = newval; | |
} | |
if ( !isfromControl && valueChanged ) { | |
control.trigger( "change" ); | |
} | |
} | |
}, | |
enable: function() { | |
this.element.attr( "disabled", false ); | |
this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); | |
return this._setOption( "disabled", false ); | |
}, | |
disable: function() { | |
this.element.attr( "disabled", true ); | |
this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true ); | |
return this._setOption( "disabled", true ); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.slider.prototype.options.initSelector, e.target ) | |
.not( ":jqmData(role='none'), :jqmData(role='nojs')" ) | |
.slider(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "textinput" plugin for text inputs, textareas | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.textinput", $.mobile.widget, { | |
options: { | |
theme: null, | |
initSelector: "input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input:not([type])" | |
}, | |
_create: function() { | |
var input = this.element, | |
o = this.options, | |
theme = o.theme, | |
themedParent, themeclass, themeLetter, focusedEl, clearbtn; | |
if ( !theme ) { | |
themedParent = this.element.closest( "[class*='ui-bar-'],[class*='ui-body-']" ); | |
themeLetter = themedParent.length && /ui-(bar|body)-([a-z])/.exec( themedParent.attr( "class" ) ); | |
theme = themeLetter && themeLetter[2] || "c"; | |
} | |
themeclass = " ui-body-" + theme; | |
$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" ); | |
input.addClass("ui-input-text ui-body-"+ o.theme ); | |
focusedEl = input; | |
// XXX: Temporary workaround for issue 785 (Apple bug 8910589). | |
// Turn off autocorrect and autocomplete on non-iOS 5 devices | |
// since the popup they use can't be dismissed by the user. Note | |
// that we test for the presence of the feature by looking for | |
// the autocorrect property on the input element. We currently | |
// have no test for iOS 5 or newer so we're temporarily using | |
// the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas | |
if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) { | |
// Set the attribute instead of the property just in case there | |
// is code that attempts to make modifications via HTML. | |
input[0].setAttribute( "autocorrect", "off" ); | |
input[0].setAttribute( "autocomplete", "off" ); | |
} | |
//"search" input widget | |
if ( input.is( "[type='search'],:jqmData(type='search')" ) ) { | |
focusedEl = input.wrap( "<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield" + themeclass + "'></div>" ).parent(); | |
clearbtn = $( "<a href='#' class='ui-input-clear' title='clear text'>clear text</a>" ) | |
.tap(function( event ) { | |
input.val( "" ).focus(); | |
input.trigger( "change" ); | |
clearbtn.addClass( "ui-input-clear-hidden" ); | |
event.preventDefault(); | |
}) | |
.appendTo( focusedEl ) | |
.buttonMarkup({ | |
icon: "delete", | |
iconpos: "notext", | |
corners: true, | |
shadow: true | |
}); | |
function toggleClear() { | |
if ( !input.val() ) { | |
clearbtn.addClass( "ui-input-clear-hidden" ); | |
} else { | |
clearbtn.removeClass( "ui-input-clear-hidden" ); | |
} | |
} | |
toggleClear(); | |
input.keyup( toggleClear ) | |
.focus( toggleClear ); | |
} else { | |
input.addClass( "ui-corner-all ui-shadow-inset" + themeclass ); | |
} | |
input.focus(function() { | |
focusedEl.addClass( "ui-focus" ); | |
}) | |
.blur(function(){ | |
focusedEl.removeClass( "ui-focus" ); | |
}); | |
// Autogrow | |
if ( input.is( "textarea" ) ) { | |
var extraLineHeight = 15, | |
keyupTimeoutBuffer = 100, | |
keyup = function() { | |
var scrollHeight = input[ 0 ].scrollHeight, | |
clientHeight = input[ 0 ].clientHeight; | |
if ( clientHeight < scrollHeight ) { | |
input.css({ | |
height: (scrollHeight + extraLineHeight) | |
}); | |
} | |
}, | |
keyupTimeout; | |
input.keyup(function() { | |
clearTimeout( keyupTimeout ); | |
keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer ); | |
}); | |
} | |
}, | |
disable: function(){ | |
( this.element.attr( "disabled", true ).is( "[type='search'],:jqmData(type='search')" ) ? | |
this.element.parent() : this.element ).addClass( "ui-disabled" ); | |
}, | |
enable: function(){ | |
( this.element.attr( "disabled", false).is( "[type='search'],:jqmData(type='search')" ) ? | |
this.element.parent() : this.element ).removeClass( "ui-disabled" ); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.textinput.prototype.options.initSelector, e.target ) | |
.not( ":jqmData(role='none'), :jqmData(role='nojs')" ) | |
.textinput(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : custom "selectmenu" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
var extendSelect = function( widget ){ | |
var select = widget.select, | |
selectID = widget.selectID, | |
label = widget.label, | |
thisPage = widget.select.closest( ".ui-page" ), | |
screen = $( "<div>", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ), | |
selectOptions = widget._selectOptions(), | |
isMultiple = widget.isMultiple = widget.select[ 0 ].multiple, | |
buttonId = selectID + "-button", | |
menuId = selectID + "-menu", | |
menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' data-" +$.mobile.ns + "theme='"+ widget.options.menuPageTheme +"'>" + | |
"<div data-" + $.mobile.ns + "role='header'>" + | |
"<div class='ui-title'>" + label.getEncodedText() + "</div>"+ | |
"</div>"+ | |
"<div data-" + $.mobile.ns + "role='content'></div>"+ | |
"</div>" ).appendTo( $.mobile.pageContainer ).page(), | |
listbox = $("<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen), | |
list = $( "<ul>", { | |
"class": "ui-selectmenu-list", | |
"id": menuId, | |
"role": "listbox", | |
"aria-labelledby": buttonId | |
}).attr( "data-" + $.mobile.ns + "theme", widget.options.theme ).appendTo( listbox ), | |
header = $( "<div>", { | |
"class": "ui-header ui-bar-" + widget.options.theme | |
}).prependTo( listbox ), | |
headerTitle = $( "<h1>", { | |
"class": "ui-title" | |
}).appendTo( header ), | |
headerClose = $( "<a>", { | |
"text": widget.options.closeText, | |
"href": "#", | |
"class": "ui-btn-left" | |
}).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(), | |
menuPageContent = menuPage.find( ".ui-content" ), | |
menuPageClose = menuPage.find( ".ui-header a" ); | |
$.extend( widget, { | |
select: widget.select, | |
selectID: selectID, | |
buttonId: buttonId, | |
menuId: menuId, | |
thisPage: thisPage, | |
menuPage: menuPage, | |
label: label, | |
screen: screen, | |
selectOptions: selectOptions, | |
isMultiple: isMultiple, | |
theme: widget.options.theme, | |
listbox: listbox, | |
list: list, | |
header: header, | |
headerTitle: headerTitle, | |
headerClose: headerClose, | |
menuPageContent: menuPageContent, | |
menuPageClose: menuPageClose, | |
placeholder: "", | |
build: function() { | |
var self = this; | |
// Create list from select, update state | |
self.refresh(); | |
self.select.attr( "tabindex", "-1" ).focus(function() { | |
$( this ).blur(); | |
self.button.focus(); | |
}); | |
// Button events | |
self.button.bind( "vclick keydown" , function( event ) { | |
if ( event.type == "vclick" || | |
event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER || | |
event.keyCode === $.mobile.keyCode.SPACE ) ) { | |
self.open(); | |
event.preventDefault(); | |
} | |
}); | |
// Events for list items | |
self.list.attr( "role", "listbox" ) | |
.delegate( ".ui-li>a", "focusin", function() { | |
$( this ).attr( "tabindex", "0" ); | |
}) | |
.delegate( ".ui-li>a", "focusout", function() { | |
$( this ).attr( "tabindex", "-1" ); | |
}) | |
.delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) { | |
// index of option tag to be selected | |
var oldIndex = self.select[ 0 ].selectedIndex, | |
newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ), | |
option = self._selectOptions().eq( newIndex )[ 0 ]; | |
// toggle selected status on the tag for multi selects | |
option.selected = self.isMultiple ? !option.selected : true; | |
// toggle checkbox class for multiple selects | |
if ( self.isMultiple ) { | |
$( this ).find( ".ui-icon" ) | |
.toggleClass( "ui-icon-checkbox-on", option.selected ) | |
.toggleClass( "ui-icon-checkbox-off", !option.selected ); | |
} | |
// trigger change if value changed | |
if ( self.isMultiple || oldIndex !== newIndex ) { | |
self.select.trigger( "change" ); | |
} | |
//hide custom select for single selects only | |
if ( !self.isMultiple ) { | |
self.close(); | |
} | |
event.preventDefault(); | |
}) | |
.keydown(function( event ) { //keyboard events for menu items | |
var target = $( event.target ), | |
li = target.closest( "li" ), | |
prev, next; | |
// switch logic based on which key was pressed | |
switch ( event.keyCode ) { | |
// up or left arrow keys | |
case 38: | |
prev = li.prev(); | |
// if there's a previous option, focus it | |
if ( prev.length ) { | |
target | |
.blur() | |
.attr( "tabindex", "-1" ); | |
prev.find( "a" ).first().focus(); | |
} | |
return false; | |
break; | |
// down or right arrow keys | |
case 40: | |
next = li.next(); | |
// if there's a next option, focus it | |
if ( next.length ) { | |
target | |
.blur() | |
.attr( "tabindex", "-1" ); | |
next.find( "a" ).first().focus(); | |
} | |
return false; | |
break; | |
// If enter or space is pressed, trigger click | |
case 13: | |
case 32: | |
target.trigger( "click" ); | |
return false; | |
break; | |
} | |
}); | |
// button refocus ensures proper height calculation | |
// by removing the inline style and ensuring page inclusion | |
self.menuPage.bind( "pagehide", function() { | |
self.list.appendTo( self.listbox ); | |
self._focusButton(); | |
// TODO centralize page removal binding / handling in the page plugin. | |
// Suggestion from @jblas to do refcounting | |
// | |
// TODO extremely confusing dependency on the open method where the pagehide.remove | |
// bindings are stripped to prevent the parent page from disappearing. The way | |
// we're keeping pages in the DOM right now sucks | |
// | |
// rebind the page remove that was unbound in the open function | |
// to allow for the parent page removal from actions other than the use | |
// of a dialog sized custom select | |
// | |
// doing this here provides for the back button on the custom select dialog | |
$.mobile._bindPageRemove.call( self.thisPage ); | |
}); | |
// Events on "screen" overlay | |
self.screen.bind( "vclick", function( event ) { | |
self.close(); | |
}); | |
// Close button on small overlays | |
self.headerClose.click( function() { | |
if ( self.menuType == "overlay" ) { | |
self.close(); | |
return false; | |
} | |
}); | |
// track this dependency so that when the parent page | |
// is removed on pagehide it will also remove the menupage | |
self.thisPage.addDependents( this.menuPage ); | |
}, | |
_isRebuildRequired: function() { | |
var list = this.list.find( "li" ), | |
options = this._selectOptions(); | |
// TODO exceedingly naive method to determine difference | |
// ignores value changes etc in favor of a forcedRebuild | |
// from the user in the refresh method | |
return options.text() !== list.text(); | |
}, | |
refresh: function( forceRebuild , foo ){ | |
var self = this, | |
select = this.element, | |
isMultiple = this.isMultiple, | |
options = this._selectOptions(), | |
selected = this.selected(), | |
// return an array of all selected index's | |
indicies = this.selectedIndices(); | |
if ( forceRebuild || this._isRebuildRequired() ) { | |
self._buildList(); | |
} | |
self.setButtonText(); | |
self.setButtonCount(); | |
self.list.find( "li:not(.ui-li-divider)" ) | |
.removeClass( $.mobile.activeBtnClass ) | |
.attr( "aria-selected", false ) | |
.each(function( i ) { | |
if ( $.inArray( i, indicies ) > -1 ) { | |
var item = $( this ); | |
// Aria selected attr | |
item.attr( "aria-selected", true ); | |
// Multiple selects: add the "on" checkbox state to the icon | |
if ( self.isMultiple ) { | |
item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" ); | |
} else { | |
item.addClass( $.mobile.activeBtnClass ); | |
} | |
} | |
}); | |
}, | |
close: function() { | |
if ( this.options.disabled || !this.isOpen ) { | |
return; | |
} | |
var self = this; | |
if ( self.menuType == "page" ) { | |
// doesn't solve the possible issue with calling change page | |
// where the objects don't define data urls which prevents dialog key | |
// stripping - changePage has incoming refactor | |
window.history.back(); | |
} else { | |
self.screen.addClass( "ui-screen-hidden" ); | |
self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" ); | |
self.list.appendTo( self.listbox ); | |
self._focusButton(); | |
} | |
// allow the dialog to be closed again | |
self.isOpen = false; | |
}, | |
open: function() { | |
if ( this.options.disabled ) { | |
return; | |
} | |
var self = this, | |
menuHeight = self.list.parent().outerHeight(), | |
menuWidth = self.list.parent().outerWidth(), | |
activePage = $( ".ui-page-active" ), | |
tOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled, | |
tScrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage; | |
scrollTop = tOverflow ? tScrollElem.scrollTop() : $( window ).scrollTop(), | |
btnOffset = self.button.offset().top, | |
screenHeight = window.innerHeight, | |
screenWidth = window.innerWidth; | |
//add active class to button | |
self.button.addClass( $.mobile.activeBtnClass ); | |
//remove after delay | |
setTimeout( function() { | |
self.button.removeClass( $.mobile.activeBtnClass ); | |
}, 300); | |
function focusMenuItem() { | |
self.list.find( $.mobile.activeBtnClass ).focus(); | |
} | |
if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) { | |
// prevent the parent page from being removed from the DOM, | |
// otherwise the results of selecting a list item in the dialog | |
// fall into a black hole | |
self.thisPage.unbind( "pagehide.remove" ); | |
//for webos (set lastscroll using button offset) | |
if ( scrollTop == 0 && btnOffset > screenHeight ) { | |
self.thisPage.one( "pagehide", function() { | |
$( this ).jqmData( "lastScroll", btnOffset ); | |
}); | |
} | |
self.menuPage.one( "pageshow", function() { | |
// silentScroll() is called whenever a page is shown to restore | |
// any previous scroll position the page may have had. We need to | |
// wait for the "silentscroll" event before setting focus to avoid | |
// the browser"s "feature" which offsets rendering to make sure | |
// whatever has focus is in view. | |
$( window ).one( "silentscroll", function() { | |
focusMenuItem(); | |
}); | |
self.isOpen = true; | |
}); | |
self.menuType = "page"; | |
self.menuPageContent.append( self.list ); | |
$.mobile.changePage( self.menuPage, { | |
transition: $.mobile.defaultDialogTransition | |
}); | |
} else { | |
self.menuType = "overlay"; | |
self.screen.height( $(document).height() ) | |
.removeClass( "ui-screen-hidden" ); | |
// Try and center the overlay over the button | |
var roomtop = btnOffset - scrollTop, | |
roombot = scrollTop + screenHeight - btnOffset, | |
halfheight = menuHeight / 2, | |
maxwidth = parseFloat( self.list.parent().css( "max-width" ) ), | |
newtop, newleft; | |
if ( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ) { | |
newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight; | |
} else { | |
// 30px tolerance off the edges | |
newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30; | |
} | |
// If the menuwidth is smaller than the screen center is | |
if ( menuWidth < maxwidth ) { | |
newleft = ( screenWidth - menuWidth ) / 2; | |
} else { | |
//otherwise insure a >= 30px offset from the left | |
newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2; | |
// 30px tolerance off the edges | |
if ( newleft < 30 ) { | |
newleft = 30; | |
} else if ( (newleft + menuWidth) > screenWidth ) { | |
newleft = screenWidth - menuWidth - 30; | |
} | |
} | |
self.listbox.append( self.list ) | |
.removeClass( "ui-selectmenu-hidden" ) | |
.css({ | |
top: newtop, | |
left: newleft | |
}) | |
.addClass( "in" ); | |
focusMenuItem(); | |
// duplicate with value set in page show for dialog sized selects | |
self.isOpen = true; | |
} | |
}, | |
_buildList: function() { | |
var self = this, | |
o = this.options, | |
placeholder = this.placeholder, | |
optgroups = [], | |
lis = [], | |
dataIcon = self.isMultiple ? "checkbox-off" : "false"; | |
self.list.empty().filter( ".ui-listview" ).listview( "destroy" ); | |
// Populate menu with options from select element | |
self.select.find( "option" ).each( function( i ) { | |
var $this = $( this ), | |
$parent = $this.parent(), | |
text = $this.getEncodedText(), | |
anchor = "<a href='#'>"+ text +"</a>", | |
classes = [], | |
extraAttrs = []; | |
// Are we inside an optgroup? | |
if ( $parent.is( "optgroup" ) ) { | |
var optLabel = $parent.attr( "label" ); | |
// has this optgroup already been built yet? | |
if ( $.inArray( optLabel, optgroups ) === -1 ) { | |
lis.push( "<li data-" + $.mobile.ns + "role='list-divider'>"+ optLabel +"</li>" ); | |
optgroups.push( optLabel ); | |
} | |
} | |
// Find placeholder text | |
// TODO: Are you sure you want to use getAttribute? ^RW | |
if ( !this.getAttribute( "value" ) || text.length == 0 || $this.jqmData( "placeholder" ) ) { | |
if ( o.hidePlaceholderMenuItems ) { | |
classes.push( "ui-selectmenu-placeholder" ); | |
} | |
placeholder = self.placeholder = text; | |
} | |
// support disabled option tags | |
if ( this.disabled ) { | |
classes.push( "ui-disabled" ); | |
extraAttrs.push( "aria-disabled='true'" ); | |
} | |
lis.push( "<li data-" + $.mobile.ns + "option-index='" + i + "' data-" + $.mobile.ns + "icon='"+ dataIcon +"' class='"+ classes.join(" ") + "' " + extraAttrs.join(" ") +">"+ anchor +"</li>" ); | |
}); | |
self.list.html( lis.join(" ") ); | |
self.list.find( "li" ) | |
.attr({ "role": "option", "tabindex": "-1" }) | |
.first().attr( "tabindex", "0" ); | |
// Hide header close link for single selects | |
if ( !this.isMultiple ) { | |
this.headerClose.hide(); | |
} | |
// Hide header if it's not a multiselect and there's no placeholder | |
if ( !this.isMultiple && !placeholder.length ) { | |
this.header.hide(); | |
} else { | |
this.headerTitle.text( this.placeholder ); | |
} | |
// Now populated, create listview | |
self.list.listview(); | |
}, | |
_button: function(){ | |
return $( "<a>", { | |
"href": "#", | |
"role": "button", | |
// TODO value is undefined at creation | |
"id": this.buttonId, | |
"aria-haspopup": "true", | |
// TODO value is undefined at creation | |
"aria-owns": this.menuId | |
}); | |
} | |
}); | |
}; | |
$( "select" ).live( "selectmenubeforecreate", function(){ | |
var selectmenuWidget = $( this ).data( "selectmenu" ); | |
if( !selectmenuWidget.options.nativeMenu ){ | |
extendSelect( selectmenuWidget ); | |
} | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "selectmenu" plugin | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.widget( "mobile.selectmenu", $.mobile.widget, { | |
options: { | |
theme: null, | |
disabled: false, | |
icon: "arrow-d", | |
iconpos: "right", | |
inline: null, | |
corners: true, | |
shadow: true, | |
iconshadow: true, | |
menuPageTheme: "b", | |
overlayTheme: "a", | |
hidePlaceholderMenuItems: true, | |
closeText: "Close", | |
nativeMenu: true, | |
initSelector: "select:not(:jqmData(role='slider'))" | |
}, | |
_button: function(){ | |
return $( "<div/>" ); | |
}, | |
_theme: function(){ | |
if ( this.options.theme ){ | |
return this.options.theme; | |
} | |
var themedParent, theme; | |
// if no theme is defined, try to find closest theme container | |
// TODO move to core as something like findCurrentTheme | |
themedParent = this.select.closest( "[class*='ui-bar-'], [class*='ui-body-']" ); | |
theme = themedParent.length ? | |
/ui-(bar|body)-([a-z])/.exec( themedParent.attr( "class" ) )[2] : | |
"c"; | |
return theme; | |
}, | |
_setDisabled: function( value ) { | |
this.element.attr( "disabled", value ); | |
this.button.attr( "aria-disabled", value ); | |
return this._setOption( "disabled", value ); | |
}, | |
_focusButton : function() { | |
var self = this; | |
setTimeout( function() { | |
self.button.focus(); | |
}, 40); | |
}, | |
_selectOptions: function() { | |
return this.select.find( "option" ); | |
}, | |
// setup items that are generally necessary for select menu extension | |
_preExtension: function(){ | |
this.select = this.element.wrap( "<div class='ui-select'>" ); | |
this.selectID = this.select.attr( "id" ); | |
this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" ); | |
this.isMultiple = this.select[ 0 ].multiple; | |
this.options.theme = this._theme(); | |
}, | |
_create: function() { | |
this._preExtension(); | |
// Allows for extension of the native select for custom selects and other plugins | |
// see select.custom for example extension | |
// TODO explore plugin registration | |
this._trigger( "beforeCreate" ); | |
this.button = this._button(); | |
var self = this, | |
options = this.options, | |
// IE throws an exception at options.item() function when | |
// there is no selected item | |
// select first in this case | |
selectedIndex = this.select[ 0 ].selectedIndex == -1 ? 0 : this.select[ 0 ].selectedIndex, | |
// TODO values buttonId and menuId are undefined here | |
button = this.button | |
.text( $( this.select[ 0 ].options.item( selectedIndex ) ).text() ) | |
.insertBefore( this.select ) | |
.buttonMarkup( { | |
theme: options.theme, | |
icon: options.icon, | |
iconpos: options.iconpos, | |
inline: options.inline, | |
corners: options.corners, | |
shadow: options.shadow, | |
iconshadow: options.iconshadow | |
}); | |
// Opera does not properly support opacity on select elements | |
// In Mini, it hides the element, but not its text | |
// On the desktop,it seems to do the opposite | |
// for these reasons, using the nativeMenu option results in a full native select in Opera | |
if ( options.nativeMenu && window.opera && window.opera.version ) { | |
this.select.addClass( "ui-select-nativeonly" ); | |
} | |
// Add counter for multi selects | |
if ( this.isMultiple ) { | |
this.buttonCount = $( "<span>" ) | |
.addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" ) | |
.hide() | |
.appendTo( button.addClass('ui-li-has-count') ); | |
} | |
// Disable if specified | |
if ( options.disabled ) { | |
this.disable(); | |
} | |
// Events on native select | |
this.select.change( function() { | |
self.refresh(); | |
}); | |
this.build(); | |
}, | |
build: function() { | |
var self = this; | |
this.select | |
.appendTo( self.button ) | |
.bind( "vmousedown", function() { | |
// Add active class to button | |
self.button.addClass( $.mobile.activeBtnClass ); | |
}) | |
.bind( "focus vmouseover", function() { | |
self.button.trigger( "vmouseover" ); | |
}) | |
.bind( "vmousemove", function() { | |
// Remove active class on scroll/touchmove | |
self.button.removeClass( $.mobile.activeBtnClass ); | |
}) | |
.bind( "change blur vmouseout", function() { | |
self.button.trigger( "vmouseout" ) | |
.removeClass( $.mobile.activeBtnClass ); | |
}) | |
.bind( "change blur", function() { | |
self.button.removeClass( "ui-btn-down-" + self.options.theme ); | |
}); | |
}, | |
selected: function() { | |
return this._selectOptions().filter( ":selected" ); | |
}, | |
selectedIndices: function() { | |
var self = this; | |
return this.selected().map( function() { | |
return self._selectOptions().index( this ); | |
}).get(); | |
}, | |
setButtonText: function() { | |
var self = this, selected = this.selected(); | |
this.button.find( ".ui-btn-text" ).text( function() { | |
if ( !self.isMultiple ) { | |
return selected.text(); | |
} | |
return selected.length ? selected.map( function() { | |
return $( this ).text(); | |
}).get().join( ", " ) : self.placeholder; | |
}); | |
}, | |
setButtonCount: function() { | |
var selected = this.selected(); | |
// multiple count inside button | |
if ( this.isMultiple ) { | |
this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length ); | |
} | |
}, | |
refresh: function() { | |
this.setButtonText(); | |
this.setButtonCount(); | |
}, | |
// open and close preserved in native selects | |
// to simplify users code when looping over selects | |
open: $.noop, | |
close: $.noop, | |
disable: function() { | |
this._setDisabled( true ); | |
this.button.addClass( "ui-disabled" ); | |
}, | |
enable: function() { | |
this._setDisabled( false ); | |
this.button.removeClass( "ui-disabled" ); | |
} | |
}); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( $.mobile.selectmenu.prototype.options.initSelector, e.target ) | |
.not( ":jqmData(role='none'), :jqmData(role='nojs')" ) | |
.selectmenu(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : plugin for making button-like links | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
( function( $, undefined ) { | |
$.fn.buttonMarkup = function( options ) { | |
return this.each( function() { | |
var el = $( this ), | |
o = $.extend( {}, $.fn.buttonMarkup.defaults, { | |
icon: el.jqmData( "icon" ), | |
iconpos: el.jqmData( "iconpos" ), | |
theme: el.jqmData( "theme" ), | |
inline: el.jqmData( "inline" ) | |
}, options ), | |
// Classes Defined | |
innerClass = "ui-btn-inner", | |
buttonClass, iconClass, | |
themedParent, wrap; | |
if ( attachEvents ) { | |
attachEvents(); | |
} | |
// if not, try to find closest theme container | |
if ( !o.theme ) { | |
themedParent = el.closest( "[class*='ui-bar-'],[class*='ui-body-']" ); | |
o.theme = themedParent.length ? | |
/ui-(bar|body)-([a-z])/.exec( themedParent.attr( "class" ) )[2] : | |
"c"; | |
} | |
buttonClass = "ui-btn ui-btn-up-" + o.theme; | |
if ( o.inline ) { | |
buttonClass += " ui-btn-inline"; | |
} | |
if ( o.icon ) { | |
o.icon = "ui-icon-" + o.icon; | |
o.iconpos = o.iconpos || "left"; | |
iconClass = "ui-icon " + o.icon; | |
if ( o.iconshadow ) { | |
iconClass += " ui-icon-shadow"; | |
} | |
} | |
if ( o.iconpos ) { | |
buttonClass += " ui-btn-icon-" + o.iconpos; | |
if ( o.iconpos == "notext" && !el.attr( "title" ) ) { | |
el.attr( "title", el.text() ); | |
} | |
} | |
if ( o.corners ) { | |
buttonClass += " ui-btn-corner-all"; | |
innerClass += " ui-btn-corner-all"; | |
} | |
if ( o.shadow ) { | |
buttonClass += " ui-shadow"; | |
} | |
el.attr( "data-" + $.mobile.ns + "theme", o.theme ) | |
.addClass( buttonClass ); | |
wrap = ( "<D class='" + innerClass + "'><D class='ui-btn-text'></D>" + | |
( o.icon ? "<span class='" + iconClass + "'></span>" : "" ) + | |
"</D>" ).replace( /D/g, o.wrapperEls ); | |
el.wrapInner( wrap ); | |
}); | |
}; | |
$.fn.buttonMarkup.defaults = { | |
corners: true, | |
shadow: true, | |
iconshadow: true, | |
inline: false, | |
wrapperEls: "span" | |
}; | |
function closestEnabledButton( element ) { | |
while ( element ) { | |
var $ele = $( element ); | |
if ( $ele.hasClass( "ui-btn" ) && !$ele.hasClass( "ui-disabled" ) ) { | |
break; | |
} | |
element = element.parentNode; | |
} | |
return element; | |
} | |
var attachEvents = function() { | |
$( document ).bind( { | |
"vmousedown": function( event ) { | |
var btn = closestEnabledButton( event.target ), | |
$btn, theme; | |
if ( btn ) { | |
$btn = $( btn ); | |
theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); | |
$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme ); | |
} | |
}, | |
"vmousecancel vmouseup": function( event ) { | |
var btn = closestEnabledButton( event.target ), | |
$btn, theme; | |
if ( btn ) { | |
$btn = $( btn ); | |
theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); | |
$btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme ); | |
} | |
}, | |
"vmouseover focus": function( event ) { | |
var btn = closestEnabledButton( event.target ), | |
$btn, theme; | |
if ( btn ) { | |
$btn = $( btn ); | |
theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); | |
$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme ); | |
} | |
}, | |
"vmouseout blur": function( event ) { | |
var btn = closestEnabledButton( event.target ), | |
$btn, theme; | |
if ( btn ) { | |
$btn = $( btn ); | |
theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); | |
$btn.removeClass( "ui-btn-hover-" + theme ).addClass( "ui-btn-up-" + theme ); | |
} | |
} | |
}); | |
attachEvents = null; | |
}; | |
//links in bars, or those with data-role become buttons | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a", e.target ) | |
.not( ".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" ) | |
.buttonMarkup(); | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework: "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$.fn.controlgroup = function( options ) { | |
return this.each(function() { | |
var $el = $( this ), | |
o = $.extend({ | |
direction: $el.jqmData( "type" ) || "vertical", | |
shadow: false, | |
excludeInvisible: true | |
}, options ), | |
groupheading = $el.find( ">legend" ), | |
flCorners = o.direction == "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ], | |
type = $el.find( "input:eq(0)" ).attr( "type" ); | |
// Replace legend with more stylable replacement div | |
if ( groupheading.length ) { | |
$el.wrapInner( "<div class='ui-controlgroup-controls'></div>" ); | |
$( "<div role='heading' class='ui-controlgroup-label'>" + groupheading.html() + "</div>" ).insertBefore( $el.children(0) ); | |
groupheading.remove(); | |
} | |
$el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction ); | |
// TODO: This should be moved out to the closure | |
// otherwise it is redefined each time controlgroup() is called | |
function flipClasses( els ) { | |
els.removeClass( "ui-btn-corner-all ui-shadow" ) | |
.eq( 0 ).addClass( flCorners[ 0 ] ) | |
.end() | |
.filter( ":last" ).addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" ); | |
} | |
flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ) ); | |
flipClasses( $el.find( ".ui-btn-inner" ) ); | |
if ( o.shadow ) { | |
$el.addClass( "ui-shadow" ); | |
} | |
}); | |
}; | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( e ){ | |
$( ":jqmData(role='controlgroup')", e.target ).controlgroup({ excludeInvisible: false }); | |
}); | |
})(jQuery);/* | |
* jQuery Mobile Framework : "links" plugin - simple class additions for links | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
$( document ).bind( "pagecreate create", function( e ){ | |
//links within content areas | |
$( e.target ) | |
.find( "a" ) | |
.not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" ) | |
.addClass( "ui-link" ); | |
}); | |
})( jQuery );/* | |
* jQuery Mobile Framework : "fixHeaderFooter" plugin - on-demand positioning for headers,footers | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
var slideDownClass = "ui-header-fixed ui-fixed-inline fade", | |
slideUpClass = "ui-footer-fixed ui-fixed-inline fade", | |
slideDownSelector = ".ui-header:jqmData(position='fixed')", | |
slideUpSelector = ".ui-footer:jqmData(position='fixed')"; | |
$.fn.fixHeaderFooter = function( options ) { | |
if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) { | |
return this; | |
} | |
return this.each(function() { | |
var $this = $( this ); | |
if ( $this.jqmData( "fullscreen" ) ) { | |
$this.addClass( "ui-page-fullscreen" ); | |
} | |
// Should be slidedown | |
$this.find( slideDownSelector ).addClass( slideDownClass ); | |
// Should be slideup | |
$this.find( slideUpSelector ).addClass( slideUpClass ); | |
}); | |
}; | |
// single controller for all showing,hiding,toggling | |
$.mobile.fixedToolbars = (function() { | |
if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) { | |
return; | |
} | |
var stickyFooter, delayTimer, | |
currentstate = "inline", | |
autoHideMode = false, | |
showDelay = 100, | |
ignoreTargets = "a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed", | |
toolbarSelector = ".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last", | |
// for storing quick references to duplicate footers | |
supportTouch = $.support.touch, | |
touchStartEvent = supportTouch ? "touchstart" : "mousedown", | |
touchStopEvent = supportTouch ? "touchend" : "mouseup", | |
stateBefore = null, | |
scrollTriggered = false, | |
touchToggleEnabled = true; | |
function showEventCallback( event ) { | |
// An event that affects the dimensions of the visual viewport has | |
// been triggered. If the header and/or footer for the current page are in overlay | |
// mode, we want to hide them, and then fire off a timer to show them at a later | |
// point. Events like a resize can be triggered continuously during a scroll, on | |
// some platforms, so the timer is used to delay the actual positioning until the | |
// flood of events have subsided. | |
// | |
// If we are in autoHideMode, we don't do anything because we know the scroll | |
// callbacks for the plugin will fire off a show when the scrolling has stopped. | |
if ( !autoHideMode && currentstate === "overlay" ) { | |
if ( !delayTimer ) { | |
$.mobile.fixedToolbars.hide( true ); | |
} | |
$.mobile.fixedToolbars.startShowTimer(); | |
} | |
} | |
$(function() { | |
var $document = $( document ), | |
$window = $( window ); | |
$document | |
.bind( "vmousedown", function( event ) { | |
if ( touchToggleEnabled ) { | |
stateBefore = currentstate; | |
} | |
}) | |
.bind( "vclick", function( event ) { | |
if ( touchToggleEnabled ) { | |
if ( $(event.target).closest( ignoreTargets ).length ) { | |
return; | |
} | |
if ( !scrollTriggered ) { | |
$.mobile.fixedToolbars.toggle( stateBefore ); | |
stateBefore = null; | |
} | |
} | |
}) | |
.bind( "silentscroll", showEventCallback ); | |
// The below checks first for a $(document).scrollTop() value, and if zero, binds scroll events to $(window) instead. | |
// If the scrollTop value is actually zero, both will return zero anyway. | |
// | |
// Works with $(document), not $(window) : Opera Mobile (WinMO phone; kinda broken anyway) | |
// Works with $(window), not $(document) : IE 7/8 | |
// Works with either $(window) or $(document) : Chrome, FF 3.6/4, Android 1.6/2.1, iOS | |
// Needs work either way : BB5, Opera Mobile (iOS) | |
( ( $document.scrollTop() === 0 ) ? $window : $document ) | |
.bind( "scrollstart", function( event ) { | |
scrollTriggered = true; | |
if ( stateBefore === null ) { | |
stateBefore = currentstate; | |
} | |
// We only enter autoHideMode if the headers/footers are in | |
// an overlay state or the show timer was started. If the | |
// show timer is set, clear it so the headers/footers don't | |
// show up until after we're done scrolling. | |
var isOverlayState = stateBefore == "overlay"; | |
autoHideMode = isOverlayState || !!delayTimer; | |
if ( autoHideMode ) { | |
$.mobile.fixedToolbars.clearShowTimer(); | |
if ( isOverlayState ) { | |
$.mobile.fixedToolbars.hide( true ); | |
} | |
} | |
}) | |
.bind( "scrollstop", function( event ) { | |
if ( $( event.target ).closest( ignoreTargets ).length ) { | |
return; | |
} | |
scrollTriggered = false; | |
if ( autoHideMode ) { | |
$.mobile.fixedToolbars.startShowTimer(); | |
autoHideMode = false; | |
} | |
stateBefore = null; | |
}); | |
$window.bind( "resize", showEventCallback ); | |
}); | |
// 1. Before page is shown, check for duplicate footer | |
// 2. After page is shown, append footer to new page | |
$( ".ui-page" ) | |
.live( "pagebeforeshow", function( event, ui ) { | |
var page = $( event.target ), | |
footer = page.find( ":jqmData(role='footer')" ), | |
id = footer.data( "id" ), | |
prevPage = ui.prevPage, | |
prevFooter = prevPage && prevPage.find( ":jqmData(role='footer')" ), | |
prevFooterMatches = prevFooter.length && prevFooter.jqmData( "id" ) === id; | |
if ( id && prevFooterMatches ) { | |
stickyFooter = footer; | |
setTop( stickyFooter.removeClass( "fade in out" ).appendTo( $.mobile.pageContainer ) ); | |
} | |
}) | |
.live( "pageshow", function( event, ui ) { | |
var $this = $( this ); | |
if ( stickyFooter && stickyFooter.length ) { | |
setTimeout(function() { | |
setTop( stickyFooter.appendTo( $this ).addClass( "fade" ) ); | |
stickyFooter = null; | |
}, 500); | |
} | |
$.mobile.fixedToolbars.show( true, this ); | |
}); | |
// When a collapsiable is hidden or shown we need to trigger the fixed toolbar to reposition itself (#1635) | |
$( ".ui-collapsible-contain" ).live( "collapse expand", showEventCallback ); | |
// element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The | |
// coordinates inside of the rect it returns don't have the page scroll position | |
// factored out of it like the other platforms do. To get around this, | |
// we'll just calculate the top offset the old fashioned way until core has | |
// a chance to figure out how to handle this situation. | |
// | |
// TODO: We'll need to get rid of getOffsetTop() once a fix gets folded into core. | |
function getOffsetTop( ele ) { | |
var top = 0, | |
op, body; | |
if ( ele ) { | |
body = document.body; | |
op = ele.offsetParent; | |
top = ele.offsetTop; | |
while ( ele && ele != body ) { | |
top += ele.scrollTop || 0; | |
if ( ele == op ) { | |
top += op.offsetTop; | |
op = ele.offsetParent; | |
} | |
ele = ele.parentNode; | |
} | |
} | |
return top; | |
} | |
function setTop( el ) { | |
var fromTop = $(window).scrollTop(), | |
thisTop = getOffsetTop( el[ 0 ] ), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead. | |
thisCSStop = el.css( "top" ) == "auto" ? 0 : parseFloat(el.css( "top" )), | |
screenHeight = window.innerHeight, | |
thisHeight = el.outerHeight(), | |
useRelative = el.parents( ".ui-page:not(.ui-page-fullscreen)" ).length, | |
relval; | |
if ( el.is( ".ui-header-fixed" ) ) { | |
relval = fromTop - thisTop + thisCSStop; | |
if ( relval < thisTop ) { | |
relval = 0; | |
} | |
return el.css( "top", useRelative ? relval : fromTop ); | |
} else { | |
// relval = -1 * (thisTop - (fromTop + screenHeight) + thisCSStop + thisHeight); | |
// if ( relval > thisTop ) { relval = 0; } | |
relval = fromTop + screenHeight - thisHeight - (thisTop - thisCSStop ); | |
return el.css( "top", useRelative ? relval : fromTop + screenHeight - thisHeight ); | |
} | |
} | |
// Exposed methods | |
return { | |
show: function( immediately, page ) { | |
$.mobile.fixedToolbars.clearShowTimer(); | |
currentstate = "overlay"; | |
var $ap = page ? $( page ) : | |
( $.mobile.activePage ? $.mobile.activePage : | |
$( ".ui-page-active" ) ); | |
return $ap.children( toolbarSelector ).each(function() { | |
var el = $( this ), | |
fromTop = $( window ).scrollTop(), | |
// el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead. | |
thisTop = getOffsetTop( el[ 0 ] ), | |
screenHeight = window.innerHeight, | |
thisHeight = el.outerHeight(), | |
alreadyVisible = ( el.is( ".ui-header-fixed" ) && fromTop <= thisTop + thisHeight ) || | |
( el.is( ".ui-footer-fixed" ) && thisTop <= fromTop + screenHeight ); | |
// Add state class | |
el.addClass( "ui-fixed-overlay" ).removeClass( "ui-fixed-inline" ); | |
if ( !alreadyVisible && !immediately ) { | |
el.animationComplete(function() { | |
el.removeClass( "in" ); | |
}).addClass( "in" ); | |
} | |
setTop(el); | |
}); | |
}, | |
hide: function( immediately ) { | |
currentstate = "inline"; | |
var $ap = $.mobile.activePage ? $.mobile.activePage : | |
$( ".ui-page-active" ); | |
return $ap.children( toolbarSelector ).each(function() { | |
var el = $(this), | |
thisCSStop = el.css( "top" ), | |
classes; | |
thisCSStop = thisCSStop == "auto" ? 0 : | |
parseFloat(thisCSStop); | |
// Add state class | |
el.addClass( "ui-fixed-inline" ).removeClass( "ui-fixed-overlay" ); | |
if ( thisCSStop < 0 || ( el.is( ".ui-header-fixed" ) && thisCSStop !== 0 ) ) { | |
if ( immediately ) { | |
el.css( "top", 0); | |
} else { | |
if ( el.css( "top" ) !== "auto" && parseFloat( el.css( "top" ) ) !== 0 ) { | |
classes = "out reverse"; | |
el.animationComplete(function() { | |
el.removeClass( classes ).css( "top", 0 ); | |
}).addClass( classes ); | |
} | |
} | |
} | |
}); | |
}, | |
startShowTimer: function() { | |
$.mobile.fixedToolbars.clearShowTimer(); | |
var args = [].slice.call( arguments ); | |
delayTimer = setTimeout(function() { | |
delayTimer = undefined; | |
$.mobile.fixedToolbars.show.apply( null, args ); | |
}, showDelay); | |
}, | |
clearShowTimer: function() { | |
if ( delayTimer ) { | |
clearTimeout( delayTimer ); | |
} | |
delayTimer = undefined; | |
}, | |
toggle: function( from ) { | |
if ( from ) { | |
currentstate = from; | |
} | |
return ( currentstate === "overlay" ) ? $.mobile.fixedToolbars.hide() : | |
$.mobile.fixedToolbars.show(); | |
}, | |
setTouchToggleEnabled: function( enabled ) { | |
touchToggleEnabled = enabled; | |
} | |
}; | |
})(); | |
//auto self-init widgets | |
$( document ).bind( "pagecreate create", function( event ) { | |
if ( $( ":jqmData(position='fixed')", event.target ).length ) { | |
$( event.target ).each(function() { | |
if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) { | |
return this; | |
} | |
var $this = $( this ); | |
if ( $this.jqmData( "fullscreen" ) ) { | |
$this.addClass( "ui-page-fullscreen" ); | |
} | |
// Should be slidedown | |
$this.find( slideDownSelector ).addClass( slideDownClass ); | |
// Should be slideup | |
$this.find( slideUpSelector ).addClass( slideUpClass ); | |
}) | |
} | |
}); | |
})( jQuery ); | |
/* | |
* jQuery Mobile Framework : "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content | |
* Copyright (c) jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, undefined ) { | |
// Enable touch overflow scrolling when it's natively supported | |
$.mobile.touchOverflowEnabled = false; | |
// Enabled zoom when touch overflow is enabled. Can cause usability issues, unfortunately | |
$.mobile.touchOverflowZoomEnabled = false; | |
$( document ).bind( "pagecreate", function( event ) { | |
if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){ | |
var $target = $( event.target ), | |
scrollStartY = 0; | |
if( $target.is( ":jqmData(role='page')" ) ){ | |
$target.each(function() { | |
var $page = $( this ), | |
$fixies = $page.find( ":jqmData(role='header'), :jqmData(role='footer')" ).filter( ":jqmData(position='fixed')" ), | |
fullScreen = $page.jqmData( "fullscreen" ), | |
$scrollElem = $fixies.length ? $page.find( ".ui-content" ) : $page; | |
$page.addClass( "ui-mobile-touch-overflow" ); | |
$scrollElem.bind( "scrollstop", function(){ | |
if( $scrollElem.scrollTop() > 0 ){ | |
window.scrollTo( 0, $.mobile.defaultHomeScroll ); | |
} | |
}); | |
if( $fixies.length ){ | |
$page.addClass( "ui-native-fixed" ); | |
if( fullScreen ){ | |
$page.addClass( "ui-native-fullscreen" ); | |
$fixies.addClass( "fade in" ); | |
$( document ).bind( "vclick", function(){ | |
$fixies | |
.removeClass( "ui-native-bars-hidden" ) | |
.toggleClass( "in out" ) | |
.animationComplete(function(){ | |
$(this).not( ".in" ).addClass( "ui-native-bars-hidden" ); | |
}); | |
}); | |
} | |
} | |
}); | |
} | |
} | |
}); | |
})( jQuery ); | |
/*! | |
* jQuery Mobile v@VERSION | |
* http://jquerymobile.com/ | |
* | |
* Copyright 2010, jQuery Project | |
* Dual licensed under the MIT or GPL Version 2 licenses. | |
* http://jquery.org/license | |
*/ | |
(function( $, window, undefined ) { | |
var $html = $( "html" ), | |
$head = $( "head" ), | |
$window = $( window ); | |
// trigger mobileinit event - useful hook for configuring $.mobile settings before they're used | |
$( window.document ).trigger( "mobileinit" ); | |
// support conditions | |
// if device support condition(s) aren't met, leave things as they are -> a basic, usable experience, | |
// otherwise, proceed with the enhancements | |
if ( !$.mobile.gradeA() ) { | |
return; | |
} | |
// override ajaxEnabled on platforms that have known conflicts with hash history updates | |
// or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini) | |
if ( $.mobile.ajaxBlacklist ) { | |
$.mobile.ajaxEnabled = false; | |
} | |
// add mobile, initial load "rendering" classes to docEl | |
$html.addClass( "ui-mobile ui-mobile-rendering" ); | |
// loading div which appears during Ajax requests | |
// will not appear if $.mobile.loadingMessage is false | |
var $loader = $( "<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>" ); | |
$.extend($.mobile, { | |
// turn on/off page loading message. | |
showPageLoadingMsg: function() { | |
if ( $.mobile.loadingMessage ) { | |
var activeBtn = $( "." + $.mobile.activeBtnClass ).first(); | |
$loader | |
.find( "h1" ) | |
.text( $.mobile.loadingMessage ) | |
.end() | |
.appendTo( $.mobile.pageContainer ) | |
// position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top | |
.css({ | |
top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 || | |
activeBtn.length && activeBtn.offset().top || 100 | |
}); | |
} | |
$html.addClass( "ui-loading" ); | |
}, | |
hidePageLoadingMsg: function() { | |
$html.removeClass( "ui-loading" ); | |
}, | |
// find and enhance the pages in the dom and transition to the first page. | |
initializePage: function() { | |
// find present pages | |
var $pages = $( ":jqmData(role='page')" ); | |
// if no pages are found, create one with body's inner html | |
if ( !$pages.length ) { | |
$pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 ); | |
} | |
// add dialogs, set data-url attrs | |
$pages.add( ":jqmData(role='dialog')" ).each(function() { | |
var $this = $(this); | |
// unless the data url is already set set it to the pathname | |
if ( !$this.jqmData("url") ) { | |
$this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search ); | |
} | |
}); | |
// define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback) | |
$.mobile.firstPage = $pages.first(); | |
// define page container | |
$.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" ); | |
// alert listeners that the pagecontainer has been determined for binding | |
// to events triggered on it | |
$window.trigger( "pagecontainercreate" ); | |
// cue page loading message | |
$.mobile.showPageLoadingMsg(); | |
// if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM | |
if ( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ) { | |
$.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } ); | |
} | |
// otherwise, trigger a hashchange to load a deeplink | |
else { | |
$window.trigger( "hashchange", [ true ] ); | |
} | |
} | |
}); | |
// This function injects a meta viewport tag to prevent scaling. Off by default, on by default when touchOverflow scrolling is enabled | |
function disableZoom() { | |
var cont = "user-scalable=no", | |
meta = $( "meta[name='viewport']" ); | |
if( meta.length ){ | |
meta.attr( "content", meta.attr( "content" ) + ", " + cont ); | |
} | |
else{ | |
$( "head" ).prepend( "<meta>", { "name": "viewport", "content": cont } ); | |
} | |
} | |
// if touch-overflow is enabled, disable user scaling, as it creates usability issues | |
if( $.support.touchOverflow && $.mobile.touchOverflowEnabled && !$.mobile.touchOverflowZoomEnabled ){ | |
disableZoom(); | |
} | |
// initialize events now, after mobileinit has occurred | |
$.mobile._registerInternalEvents(); | |
// check which scrollTop value should be used by scrolling to 1 immediately at domready | |
// then check what the scroll top is. Android will report 0... others 1 | |
// note that this initial scroll won't hide the address bar. It's just for the check. | |
$(function() { | |
window.scrollTo( 0, 1 ); | |
// if defaultHomeScroll hasn't been set yet, see if scrollTop is 1 | |
// it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar) | |
// so if it's 1, use 0 from now on | |
$.mobile.defaultHomeScroll = ( !$.support.scrollTop || $(window).scrollTop() === 1 ) ? 0 : 1; | |
//dom-ready inits | |
if( $.mobile.autoInitializePage ){ | |
$.mobile.initializePage(); | |
} | |
// window load event | |
// hide iOS browser chrome on load | |
$window.load( $.mobile.silentScroll ); | |
}); | |
})( jQuery, this ); | |
/*! jQuery Mobile v1.0rc2 jquerymobile.com | jquery.org/license */ | |
(function(a,e){if(a.cleanData){var b=a.cleanData;a.cleanData=function(f){for(var d=0,c;(c=f[d])!=null;d++)a(c).triggerHandler("remove");b(f)}}else{var c=a.fn.remove;a.fn.remove=function(b,d){return this.each(function(){d||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){a(this).triggerHandler("remove")});return c.call(a(this),b,d)})}}a.widget=function(b,d,c){var e=b.split(".")[0],i,b=b.split(".")[1];i=e+"-"+b;if(!c)c=d,d=a.Widget;a.expr[":"][i]=function(d){return!!a.data(d, | |
b)};a[e]=a[e]||{};a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};d=new d;d.options=a.extend(true,{},d.options);a[e][b].prototype=a.extend(true,d,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:i},c);a.widget.bridge(b,a[e][b])};a.widget.bridge=function(b,d){a.fn[b]=function(c){var h=typeof c==="string",i=Array.prototype.slice.call(arguments,1),k=this,c=!h&&i.length?a.extend.apply(null,[true,c].concat(i)):c;if(h&&c.charAt(0)==="_")return k; | |
h?this.each(function(){var d=a.data(this,b);if(!d)throw"cannot call methods on "+b+" prior to initialization; attempted to call method '"+c+"'";if(!a.isFunction(d[c]))throw"no such method '"+c+"' for "+b+" widget instance";var h=d[c].apply(d,i);if(h!==d&&h!==e)return k=h,false}):this.each(function(){var e=a.data(this,b);e?e.option(c||{})._init():a.data(this,b,new d(c,this))});return k}};a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)};a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"", | |
options:{disabled:false},_createWidget:function(b,d){a.data(d,this.widgetName,this);this.element=a(d);this.options=a.extend(true,{},this.options,this._getCreateOptions(),b);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){var b={};a.metadata&&(b=a.metadata.get(element)[this.widgetName]);return b},_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(b,d){var c=b;if(arguments.length===0)return a.extend({},this.options);if(typeof b==="string"){if(d===e)return this.options[b];c={};c[b]=d}this._setOptions(c);return this},_setOptions:function(b){var d=this;a.each(b,function(a,b){d._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b;a==="disabled"&& | |
this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(b,d,c){var e=this.options[b],d=a.Event(d);d.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase();c=c||{};if(d.originalEvent)for(var b=a.event.props.length,i;b;)i=a.event.props[--b],d[i]=d.originalEvent[i];this.element.trigger(d, | |
c);return!(a.isFunction(e)&&e.call(this.element[0],d,c)===false||d.isDefaultPrevented())}}})(jQuery); | |
(function(a,e){a.widget("mobile.widget",{_createWidget:function(){a.Widget.prototype._createWidget.apply(this,arguments);this._trigger("init")},_getCreateOptions:function(){var b=this.element,c={};a.each(this.options,function(a){var d=b.jqmData(a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}));d!==e&&(c[a]=d)});return c},enhanceWithin:function(b){var c=a(b).closest(":jqmData(role='page')").data("page"),c=c&&c.keepNativeSelector()||"";a(this.options.initSelector,b).not(c)[this.widgetName]()}})})(jQuery); | |
(function(a){a(window);var e=a("html");a.mobile.media=function(){var b={},c=a("<div id='jquery-mediatest'>"),f=a("<body>").append(c);return function(a){if(!(a in b)){var g=document.createElement("style"),h="@media "+a+" { #jquery-mediatest { position:absolute; } }";g.type="text/css";g.styleSheet?g.styleSheet.cssText=h:g.appendChild(document.createTextNode(h));e.prepend(f).prepend(g);b[a]=c.css("position")==="absolute";f.add(g).remove()}return b[a]}}()})(jQuery); | |
(function(a,e){function b(a){var b=a.charAt(0).toUpperCase()+a.substr(1),a=(a+" "+d.join(b+" ")+b).split(" "),c;for(c in a)if(f[a[c]]!==e)return true}var c=a("<body>").prependTo("html"),f=c[0].style,d=["Webkit","Moz","O"],g="palmGetResource"in window,h=window.blackberry;a.mobile.browser={};a.mobile.browser.ie=function(){for(var a=3,b=document.createElement("div"),d=b.all||[];b.innerHTML="<\!--[if gt IE "+ ++a+"]><br><![endif]--\>",d[0];);return a>4?a:!a}();a.extend(a.support,{orientation:"orientation"in | |
window&&"onorientationchange"in window,touch:"ontouchend"in document,cssTransitions:"WebKitTransitionEvent"in window,pushState:"pushState"in history&&"replaceState"in history,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!b("content"),touchOverflow:!!b("overflowScrolling"),boxShadow:!!b("boxShadow")&&!h,scrollTop:("pageXOffset"in window||"scrollTop"in document.documentElement||"scrollTop"in c[0])&&!g,dynamicBaseTag:function(){var b=location.protocol+"//"+location.host+location.pathname+ | |
"ui-dir/",d=a("head base"),f=null,e="",g;d.length?e=d.attr("href"):d=f=a("<base>",{href:b}).appendTo("head");g=a("<a href='testurl' />").prependTo(c)[0].href;d[0].href=e||location.pathname;f&&f.remove();return g.indexOf(b)===0}()});c.remove();g=function(){var a=window.navigator.userAgent;return a.indexOf("Nokia")>-1&&(a.indexOf("Symbian/3")>-1||a.indexOf("Series60/5")>-1)&&a.indexOf("AppleWebKit")>-1&&a.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();a.mobile.ajaxBlacklist=window.blackberry&&!window.WebKitPoint|| | |
window.operamini&&Object.prototype.toString.call(window.operamini)==="[object OperaMini]"||g;g&&a(function(){a("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")});a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")})(jQuery); | |
(function(a,e,b,c){function f(a){for(;a&&typeof a.originalEvent!=="undefined";)a=a.originalEvent;return a}function d(b){for(var d={},f,c;b;){f=a.data(b,n);for(c in f)if(f[c])d[c]=d.hasVirtualBinding=true;b=b.parentNode}return d}function g(){v&&(clearTimeout(v),v=0);v=setTimeout(function(){E=v=0;u.length=0;D=false;y=true},a.vmouse.resetTimerDuration)}function h(b,d,s){var e,g;if(!(g=s&&s[b])){if(s=!s)a:{for(s=d.target;s;){if((g=a.data(s,n))&&(!b||g[b]))break a;s=s.parentNode}s=null}g=s}if(g){e=d;var s= | |
e.type,j,i;e=a.Event(e);e.type=b;g=e.originalEvent;j=a.event.props;if(g)for(i=j.length;i;)b=j[--i],e[b]=g[b];if(s.search(/mouse(down|up)|click/)>-1&&!e.which)e.which=1;if(s.search(/^touch/)!==-1&&(b=f(g),s=b.touches,b=b.changedTouches,s=s&&s.length?s[0]:b&&b.length?b[0]:c))for(g=0,len=z.length;g<len;g++)b=z[g],e[b]=s[b];a(d.target).trigger(e)}return e}function i(b){var d=a.data(b.target,A);if(!D&&(!E||E!==d))if(d=h("v"+b.type,b))d.isDefaultPrevented()&&b.preventDefault(),d.isPropagationStopped()&& | |
b.stopPropagation(),d.isImmediatePropagationStopped()&&b.stopImmediatePropagation()}function k(b){var c=f(b).touches,e;if(c&&c.length===1&&(e=b.target,c=d(e),c.hasVirtualBinding))E=s++,a.data(e,A,E),v&&(clearTimeout(v),v=0),w=y=false,e=f(b).touches[0],x=e.pageX,r=e.pageY,h("vmouseover",b,c),h("vmousedown",b,c)}function m(a){y||(w||h("vmousecancel",a,d(a.target)),w=true,g())}function q(b){if(!y){var c=f(b).touches[0],s=w,e=a.vmouse.moveDistanceThreshold;w=w||Math.abs(c.pageX-x)>e||Math.abs(c.pageY- | |
r)>e;flags=d(b.target);w&&!s&&h("vmousecancel",b,flags);h("vmousemove",b,flags);g()}}function o(a){if(!y){y=true;var b=d(a.target),c;h("vmouseup",a,b);if(!w&&(c=h("vclick",a,b))&&c.isDefaultPrevented())c=f(a).changedTouches[0],u.push({touchID:E,x:c.clientX,y:c.clientY}),D=true;h("vmouseout",a,b);w=false;g()}}function l(b){var b=a.data(b,n),d;if(b)for(d in b)if(b[d])return true;return false}function j(){}function p(b){var d=b.substr(1);return{setup:function(){l(this)||a.data(this,n,{});a.data(this, | |
n)[b]=true;t[b]=(t[b]||0)+1;t[b]===1&&B.bind(d,i);a(this).bind(d,j);if(C)t.touchstart=(t.touchstart||0)+1,t.touchstart===1&&B.bind("touchstart",k).bind("touchend",o).bind("touchmove",q).bind("scroll",m)},teardown:function(){--t[b];t[b]||B.unbind(d,i);C&&(--t.touchstart,t.touchstart||B.unbind("touchstart",k).unbind("touchmove",q).unbind("touchend",o).unbind("scroll",m));var c=a(this),f=a.data(this,n);f&&(f[b]=false);c.unbind(d,j);l(this)||c.removeData(n)}}}var n="virtualMouseBindings",A="virtualTouchID", | |
e="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),z="clientX clientY pageX pageY screenX screenY".split(" "),t={},v=0,x=0,r=0,w=false,u=[],D=false,y=false,C="addEventListener"in b,B=a(b),s=1,E=0;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var F=0;F<e.length;F++)a.event.special[e[F]]=p(e[F]);C&&b.addEventListener("click",function(b){var d=u.length,c=b.target,f,s,e,g,j;if(d){f=b.clientX;s=b.clientY;threshold=a.vmouse.clickDistanceThreshold; | |
for(e=c;e;){for(g=0;g<d;g++)if(j=u[g],e===c&&Math.abs(j.x-f)<threshold&&Math.abs(j.y-s)<threshold||a.data(e,A)===j.touchID){b.preventDefault();b.stopPropagation();return}e=e.parentNode}}},true)})(jQuery,window,document); | |
(function(a,e,b){function c(b,d,c){var f=c.type;c.type=d;a.event.handle.call(b,c);c.type=f}a.each("touchstart touchmove touchend orientationchange throttledresize tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(b,d){a.fn[d]=function(a){return a?this.bind(d,a):this.trigger(d)};a.attrFn[d]=true});var f=a.support.touch,d=f?"touchstart":"mousedown",g=f?"touchend":"mouseup",h=f?"touchmove":"mousemove";a.event.special.scrollstart={enabled:true,setup:function(){function b(a, | |
e){f=e;c(d,f?"scrollstart":"scrollstop",a)}var d=this,f,e;a(d).bind("touchmove scroll",function(d){a.event.special.scrollstart.enabled&&(f||b(d,true),clearTimeout(e),e=setTimeout(function(){b(d,false)},50))})}};a.event.special.tap={setup:function(){var b=this,d=a(b);d.bind("vmousedown",function(f){function e(){clearTimeout(p)}function g(){e();d.unbind("vclick",h).unbind("vmouseup",e).unbind("vmousecancel",g)}function h(a){g();j==a.target&&c(b,"tap",a)}if(f.which&&f.which!==1)return false;var j=f.target, | |
p;d.bind("vmousecancel",g).bind("vmouseup",e).bind("vclick",h);p=setTimeout(function(){c(b,"taphold",a.Event("taphold"))},750)})}};a.event.special.swipe={scrollSupressionThreshold:10,durationThreshold:1E3,horizontalDistanceThreshold:30,verticalDistanceThreshold:75,setup:function(){var c=a(this);c.bind(d,function(d){function f(b){if(o){var d=b.originalEvent.touches?b.originalEvent.touches[0]:b;l={time:(new Date).getTime(),coords:[d.pageX,d.pageY]};Math.abs(o.coords[0]-l.coords[0])>a.event.special.swipe.scrollSupressionThreshold&& | |
b.preventDefault()}}var e=d.originalEvent.touches?d.originalEvent.touches[0]:d,o={time:(new Date).getTime(),coords:[e.pageX,e.pageY],origin:a(d.target)},l;c.bind(h,f).one(g,function(){c.unbind(h,f);o&&l&&l.time-o.time<a.event.special.swipe.durationThreshold&&Math.abs(o.coords[0]-l.coords[0])>a.event.special.swipe.horizontalDistanceThreshold&&Math.abs(o.coords[1]-l.coords[1])<a.event.special.swipe.verticalDistanceThreshold&&o.origin.trigger("swipe").trigger(o.coords[0]>l.coords[0]?"swipeleft":"swiperight"); | |
o=l=b})})}};(function(a,b){function d(){var a=f();a!==e&&(e=a,c.trigger("orientationchange"))}var c=a(b),f,e;a.event.special.orientationchange={setup:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;e=f();c.bind("throttledresize",d)},teardown:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;c.unbind("throttledresize",d)},add:function(a){var b=a.handler;a.handler=function(a){a.orientation=f();return b.apply(this,arguments)}}};a.event.special.orientationchange.orientation= | |
f=function(){var d=true,d=document.documentElement;return(d=a.support.orientation?b.orientation%180==0:d&&d.clientWidth/d.clientHeight<1.1)?"portrait":"landscape"}})(jQuery,e);(function(){a.event.special.throttledresize={setup:function(){a(this).bind("resize",b)},teardown:function(){a(this).unbind("resize",b)}};var b=function(){f=(new Date).getTime();e=f-d;e>=250?(d=f,a(this).trigger("throttledresize")):(c&&clearTimeout(c),c=setTimeout(b,250-e))},d=0,c,f,e})();a.each({scrollstop:"scrollstart",taphold:"tap", | |
swipeleft:"swipe",swiperight:"swipe"},function(b,d){a.event.special[b]={setup:function(){a(this).bind(d,a.noop)}}})})(jQuery,this); | |
(function(a,e,b){function c(a){a=a||location.href;return"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var f="hashchange",d=document,g,h=a.event.special,i=d.documentMode,k="on"+f in e&&(i===b||i>7);a.fn[f]=function(a){return a?this.bind(f,a):this.trigger(f)};a.fn[f].delay=50;h[f]=a.extend(h[f],{setup:function(){if(k)return false;a(g.start)},teardown:function(){if(k)return false;a(g.stop)}});g=function(){function g(){var b=c(),d=n(l);if(b!==l)p(l=b,d),a(e).trigger(f);else if(d!==l)location.href=location.href.replace(/#.*/, | |
"")+d;i=setTimeout(g,a.fn[f].delay)}var h={},i,l=c(),j=function(a){return a},p=j,n=j;h.start=function(){i||g()};h.stop=function(){i&&clearTimeout(i);i=b};a.browser.msie&&!k&&function(){var b,e;h.start=function(){if(!b)e=(e=a.fn[f].src)&&e+c(),b=a('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){e||p(c());g()}).attr("src",e||"javascript:0").insertAfter("body")[0].contentWindow,d.onpropertychange=function(){try{if(event.propertyName==="title")b.document.title=d.title}catch(a){}}}; | |
h.stop=j;n=function(){return c(b.location.href)};p=function(c,e){var g=b.document,h=a.fn[f].domain;if(c!==e)g.title=d.title,g.open(),h&&g.write('<script>document.domain="'+h+'"<\/script>'),g.close(),b.location.hash=c}}();return h}()})(jQuery,this); | |
(function(a){a.widget("mobile.page",a.mobile.widget,{options:{theme:"c",domCache:false,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){this._trigger("beforecreate");this.element.attr("tabindex","0").addClass("ui-page ui-body-"+this.options.theme)},keepNativeSelector:function(){var e=this.options;return e.keepNative&&a.trim(e.keepNative)&&e.keepNative!==e.keepNativeDefault?[e.keepNative,e.keepNativeDefault].join(", "):e.keepNativeDefault}})})(jQuery); | |
(function(a,e){var b={};a.extend(a.mobile,{ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",ajaxEnabled:true,hashListeningEnabled:true,linkBindingEnabled:true,defaultPageTransition:"slide",minScrollBack:250,defaultDialogTransition:"pop",loadingMessage:"loading",pageLoadErrorMessage:"Error Loading Page",autoInitializePage:true,pushStateEnabled:true,orientationChangeEnabled:true,gradeA:function(){return a.support.mediaquery||a.mobile.browser.ie&&a.mobile.browser.ie>= | |
7},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91},silentScroll:function(b){if(a.type(b)!=="number")b=a.mobile.defaultHomeScroll;a.event.special.scrollstart.enabled=false; | |
setTimeout(function(){e.scrollTo(0,b);a(document).trigger("silentscroll",{x:0,y:b})},20);setTimeout(function(){a.event.special.scrollstart.enabled=true},150)},nsNormalizeDict:b,nsNormalize:function(d){return!d?void 0:b[d]||(b[d]=a.camelCase(a.mobile.ns+d))},getInheritedTheme:function(a,b){for(var c=a[0],f="",e=/ui-(bar|body)-([a-z])\b/,m,q;c;){m=c.className||"";if((q=e.exec(m))&&(f=q[2]))break;c=c.parentNode}return f||b||"a"}});a.fn.jqmData=function(b,c){var f;typeof b!="undefined"&&(f=this.data(b? | |
a.mobile.nsNormalize(b):b,c));return f};a.jqmData=function(b,c,f){var e;typeof c!="undefined"&&(e=a.data(b,c?a.mobile.nsNormalize(c):c,f));return e};a.fn.jqmRemoveData=function(b){return this.removeData(a.mobile.nsNormalize(b))};a.jqmRemoveData=function(b,c){return a.removeData(b,a.mobile.nsNormalize(c))};a.fn.removeWithDependents=function(){a.removeWithDependents(this)};a.removeWithDependents=function(b){b=a(b);(b.jqmData("dependents")||a()).remove();b.remove()};a.fn.addDependents=function(b){a.addDependents(a(this), | |
b)};a.addDependents=function(b,c){var f=a(b).jqmData("dependents")||a();a(b).jqmData("dependents",a.merge(f,c))};a.fn.getEncodedText=function(){return a("<div/>").text(a(this).text()).html()};var c=a.find,f=/:jqmData\(([^)]*)\)/g;a.find=function(b,e,h,i){b=b.replace(f,"[data-"+(a.mobile.ns||"")+"$1]");return c.call(this,b,e,h,i)};a.extend(a.find,c);a.find.matches=function(b,c){return a.find(b,null,null,c)};a.find.matchesSelector=function(b,c){return a.find(c,null,null,[b]).length>0}})(jQuery,this); | |
(function(a,e){function b(a){var b=a.find(".ui-title:eq(0)");b.length?b.focus():a.focus()}function c(b){p&&(!p.closest(".ui-page-active").length||b)&&p.removeClass(a.mobile.activeBtnClass);p=null}function f(){z=false;A.length>0&&a.mobile.changePage.apply(null,A.pop())}function d(c,d,f,e){var j=a.mobile.urlHistory.getActive(),h=a.support.touchOverflow&&a.mobile.touchOverflowEnabled,i=j.lastScroll||(h?0:a.mobile.defaultHomeScroll),j=g();window.scrollTo(0,a.mobile.defaultHomeScroll);d&&d.data("page")._trigger("beforehide", | |
null,{nextPage:c});h||c.height(j+i);c.data("page")._trigger("beforeshow",null,{prevPage:d||a("")});a.mobile.hidePageLoadingMsg();h&&i&&(c.addClass("ui-mobile-pre-transition"),b(c),c.is(".ui-native-fixed")?c.find(".ui-content").scrollTop(i):c.scrollTop(i));f=(a.mobile.transitionHandlers[f||"none"]||a.mobile.defaultTransitionHandler)(f,e,c,d);f.done(function(){h||(c.height(""),b(c));h||a.mobile.silentScroll(i);d&&(h||d.height(""),d.data("page")._trigger("hide",null,{nextPage:c}));c.data("page")._trigger("show", | |
null,{prevPage:d||a("")})});return f}function g(){var b=a.event.special.orientationchange.orientation()==="portrait",c=b?screen.availHeight:screen.availWidth,b=Math.max(b?480:320,a(window).height());return Math.min(c,b)}function h(){(!a.support.touchOverflow||!a.mobile.touchOverflowEnabled)&&a("."+a.mobile.activePageClass).css("min-height",g())}function i(b,c){c&&b.attr("data-"+a.mobile.ns+"role",c);b.page()}function k(a){for(;a;){if(a.nodeName.toLowerCase()=="a")break;a=a.parentNode}return a}function m(b){var b= | |
a(b).closest(".ui-page").jqmData("url"),c=r.hrefNoHash;if(!b||!j.isPath(b))b=c;return j.makeUrlAbsolute(b,c)}var q=a(window),o=a("html"),l=a("head"),j={urlParseRE:/^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,parseUrl:function(b){if(a.type(b)==="object")return b;b=j.urlParseRE.exec(b||"")||[];return{href:b[0]||"",hrefNoHash:b[1]||"",hrefNoSearch:b[2]||"",domain:b[3]|| | |
"",protocol:b[4]||"",doubleSlash:b[5]||"",authority:b[6]||"",username:b[8]||"",password:b[9]||"",host:b[10]||"",hostname:b[11]||"",port:b[12]||"",pathname:b[13]||"",directory:b[14]||"",filename:b[15]||"",search:b[16]||"",hash:b[17]||""}},makePathAbsolute:function(a,b){if(a&&a.charAt(0)==="/")return a;for(var a=a||"",c=(b=b?b.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"")?b.split("/"):[],d=a.split("/"),f=0;f<d.length;f++){var e=d[f];switch(e){case ".":break;case "..":c.length&&c.pop();break;default:c.push(e)}}return"/"+ | |
c.join("/")},isSameDomain:function(a,b){return j.parseUrl(a).domain===j.parseUrl(b).domain},isRelativeUrl:function(a){return j.parseUrl(a).protocol===""},isAbsoluteUrl:function(a){return j.parseUrl(a).protocol!==""},makeUrlAbsolute:function(a,b){if(!j.isRelativeUrl(a))return a;var c=j.parseUrl(a),d=j.parseUrl(b),f=c.protocol||d.protocol,e=c.protocol?c.doubleSlash:c.doubleSlash||d.doubleSlash,g=c.authority||d.authority,h=c.pathname!=="",i=j.makePathAbsolute(c.pathname||d.filename,d.pathname);return f+ | |
e+g+i+(c.search||!h&&d.search||"")+c.hash},addSearchParams:function(b,c){var d=j.parseUrl(b),f=typeof c==="object"?a.param(c):c,e=d.search||"?";return d.hrefNoSearch+e+(e.charAt(e.length-1)!=="?"?"&":"")+f+(d.hash||"")},convertUrlToDataUrl:function(a){var b=j.parseUrl(a);if(j.isEmbeddedPage(b))return b.hash.split(t)[0].replace(/^#/,"");else if(j.isSameDomain(b,r))return b.hrefNoHash.replace(r.domain,"");return a},get:function(a){if(a===e)a=location.hash;return j.stripHash(a).replace(/[^\/]*\.[^\/*]+$/, | |
"")},getFilePath:function(b){var c="&"+a.mobile.subPageUrlKey;return b&&b.split(c)[0].split(t)[0]},set:function(a){location.hash=a},isPath:function(a){return/\//.test(a)},clean:function(a){return a.replace(r.domain,"")},stripHash:function(a){return a.replace(/^#/,"")},cleanHash:function(a){return j.stripHash(a.replace(/\?.*$/,"").replace(t,""))},isExternal:function(a){a=j.parseUrl(a);return a.protocol&&a.domain!==x.domain?true:false},hasProtocol:function(a){return/^(:?\w+:)/.test(a)},isFirstPageUrl:function(b){var b= | |
j.parseUrl(j.makeUrlAbsolute(b,r)),c=a.mobile.firstPage,c=c&&c[0]?c[0].id:e;return(b.hrefNoHash===x.hrefNoHash||w&&b.hrefNoHash===r.hrefNoHash)&&(!b.hash||b.hash==="#"||c&&b.hash.replace(/^#/,"")===c)},isEmbeddedPage:function(a){a=j.parseUrl(a);return a.protocol!==""?a.hash&&(a.hrefNoHash===x.hrefNoHash||w&&a.hrefNoHash===r.hrefNoHash):/^#/.test(a.href)}},p=null,n={stack:[],activeIndex:0,getActive:function(){return n.stack[n.activeIndex]},getPrev:function(){return n.stack[n.activeIndex-1]},getNext:function(){return n.stack[n.activeIndex+ | |
1]},addNew:function(a,b,c,d,f){n.getNext()&&n.clearForward();n.stack.push({url:a,transition:b,title:c,pageUrl:d,role:f});n.activeIndex=n.stack.length-1},clearForward:function(){n.stack=n.stack.slice(0,n.activeIndex+1)},directHashChange:function(b){var c,d,f;this.getActive();a.each(n.stack,function(a,e){b.currentUrl===e.url&&(c=a<n.activeIndex,d=!c,f=a)});this.activeIndex=f!==e?f:this.activeIndex;c?(b.either||b.isBack)(true):d&&(b.either||b.isForward)(false)},ignoreNextHashChange:false},A=[],z=false, | |
t="&ui-state=dialog",v=l.children("base"),x=j.parseUrl(location.href),r=v.length?j.parseUrl(j.makeUrlAbsolute(v.attr("href"),x.href)):x,w=x.hrefNoHash!==r.hrefNoHash,u=a.support.dynamicBaseTag?{element:v.length?v:a("<base>",{href:r.hrefNoHash}).prependTo(l),set:function(a){u.element.attr("href",j.makeUrlAbsolute(a,r))},reset:function(){u.element.attr("href",r.hrefNoHash)}}:e,D=true,y,C,B;y=function(){var b=q;a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&(b=a(".ui-page-active"),b=b.is(".ui-native-fixed")? | |
b.find(".ui-content"):b);return b};C=function(b){if(D){var c=a.mobile.urlHistory.getActive();if(c)b=b&&b.scrollTop(),c.lastScroll=b<a.mobile.minScrollBack?a.mobile.defaultHomeScroll:b}};B=function(){setTimeout(C,100,a(this))};q.bind(a.support.pushState?"popstate":"hashchange",function(){D=false});q.one(a.support.pushState?"popstate":"hashchange",function(){D=true});q.one("pagecontainercreate",function(){a.mobile.pageContainer.bind("pagechange",function(){var a=y();D=true;a.unbind("scrollstop",B); | |
a.bind("scrollstop",B)})});y().bind("scrollstop",B);a.mobile.getScreenHeight=g;a.fn.animationComplete=function(b){return a.support.cssTransitions?a(this).one("webkitAnimationEnd",b):(setTimeout(b,0),a(this))};a.mobile.path=j;a.mobile.base=u;a.mobile.urlHistory=n;a.mobile.dialogHashKey=t;a.mobile.noneTransitionHandler=function(b,c,d,f){f&&f.removeClass(a.mobile.activePageClass);d.addClass(a.mobile.activePageClass);return a.Deferred().resolve(b,c,d,f).promise()};a.mobile.defaultTransitionHandler=a.mobile.noneTransitionHandler; | |
a.mobile.transitionHandlers={none:a.mobile.defaultTransitionHandler};a.mobile.allowCrossDomainPages=false;a.mobile.getDocumentUrl=function(b){return b?a.extend({},x):x.href};a.mobile.getDocumentBase=function(b){return b?a.extend({},r):r.href};a.mobile._bindPageRemove=function(){var b=a(this);!b.data("page").options.domCache&&b.is(":jqmData(external-page='true')")&&b.bind("pagehide.remove",function(){var b=a(this),c=new a.Event("pageremove");b.trigger(c);c.isDefaultPrevented()||b.removeWithDependents()})}; | |
a.mobile.loadPage=function(b,c){var d=a.Deferred(),f=a.extend({},a.mobile.loadPage.defaults,c),g=null,h=null,l=j.makeUrlAbsolute(b,a.mobile.activePage&&m(a.mobile.activePage)||r.hrefNoHash);if(f.data&&f.type==="get")l=j.addSearchParams(l,f.data),f.data=e;if(f.data&&f.type==="post")f.reloadPage=true;var t=j.getFilePath(l),o=j.convertUrlToDataUrl(l);f.pageContainer=f.pageContainer||a.mobile.pageContainer;g=f.pageContainer.children(":jqmData(url='"+o+"')");g.length===0&&o&&!j.isPath(o)&&(g=f.pageContainer.children("#"+ | |
o).attr("data-"+a.mobile.ns+"url",o));if(g.length===0)if(a.mobile.firstPage&&j.isFirstPageUrl(t))a.mobile.firstPage.parent().length&&(g=a(a.mobile.firstPage));else if(j.isEmbeddedPage(t))return d.reject(l,c),d.promise();u&&u.reset();if(g.length){if(!f.reloadPage)return i(g,f.role),d.resolve(l,c,g),d.promise();h=g}var n=f.pageContainer,k=new a.Event("pagebeforeload"),p={url:b,absUrl:l,dataUrl:o,deferred:d,options:f};n.trigger(k,p);if(k.isDefaultPrevented())return d.promise();if(f.showLoadMsg)var v= | |
setTimeout(function(){a.mobile.showPageLoadingMsg()},f.loadMsgDelay);!a.mobile.allowCrossDomainPages&&!j.isSameDomain(x,l)?d.reject(l,c):a.ajax({url:t,type:f.type,data:f.data,dataType:"html",success:function(e,n,k){var m=a("<div></div>"),r=e.match(/<title[^>]*>([^<]*)/)&&RegExp.$1,q=RegExp("\\bdata-"+a.mobile.ns+"url=[\"']?([^\"'>]*)[\"']?");RegExp("(<[^>]+\\bdata-"+a.mobile.ns+"role=[\"']?page[\"']?[^>]*>)").test(e)&&RegExp.$1&&q.test(RegExp.$1)&&RegExp.$1&&(b=t=j.getFilePath(RegExp.$1));u&&u.set(t); | |
m.get(0).innerHTML=e;g=m.find(":jqmData(role='page'), :jqmData(role='dialog')").first();g.length||(g=a("<div data-"+a.mobile.ns+"role='page'>"+e.split(/<\/?body[^>]*>/gmi)[1]+"</div>"));r&&!g.jqmData("title")&&(~r.indexOf("&")&&(r=a("<div>"+r+"</div>").text()),g.jqmData("title",r));if(!a.support.dynamicBaseTag){var x=j.get(t);g.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function(){var b=a(this).is("[href]")?"href":a(this).is("[src]")?"src":"action",c=a(this).attr(b), | |
c=c.replace(location.protocol+"//"+location.host+location.pathname,"");/^(\w+:|#|\/)/.test(c)||a(this).attr(b,x+c)})}g.attr("data-"+a.mobile.ns+"url",j.convertUrlToDataUrl(t)).attr("data-"+a.mobile.ns+"external-page",true).appendTo(f.pageContainer);g.one("pagecreate",a.mobile._bindPageRemove);i(g,f.role);l.indexOf("&"+a.mobile.subPageUrlKey)>-1&&(g=f.pageContainer.children(":jqmData(url='"+o+"')"));f.showLoadMsg&&(clearTimeout(v),a.mobile.hidePageLoadingMsg());p.xhr=k;p.textStatus=n;p.page=g;f.pageContainer.trigger("pageload", | |
p);d.resolve(l,c,g,h)},error:function(b,e,g){u&&u.set(j.get());p.xhr=b;p.textStatus=e;p.errorThrown=g;b=new a.Event("pageloadfailed");f.pageContainer.trigger(b,p);b.isDefaultPrevented()||(f.showLoadMsg&&(clearTimeout(v),a.mobile.hidePageLoadingMsg(),a("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+a.mobile.pageLoadErrorMessage+"</h1></div>").css({display:"block",opacity:0.96,top:q.scrollTop()+100}).appendTo(f.pageContainer).delay(800).fadeOut(400,function(){a(this).remove()})), | |
d.reject(l,c))}});return d.promise()};a.mobile.loadPage.defaults={type:"get",data:e,reloadPage:false,role:e,showLoadMsg:false,pageContainer:e,loadMsgDelay:50};a.mobile.changePage=function(b,g){if(z)A.unshift(arguments);else{var h=a.extend({},a.mobile.changePage.defaults,g);h.pageContainer=h.pageContainer||a.mobile.pageContainer;h.fromPage=h.fromPage||a.mobile.activePage;var l=h.pageContainer,k=new a.Event("pagebeforechange"),p={toPage:b,options:h};l.trigger(k,p);if(!k.isDefaultPrevented())if(b=p.toPage, | |
z=true,typeof b=="string")a.mobile.loadPage(b,h).done(function(b,c,d,f){z=false;c.duplicateCachedPage=f;a.mobile.changePage(d,c)}).fail(function(){z=false;c(true);f();h.pageContainer.trigger("pagechangefailed",p)});else{if(b[0]===a.mobile.firstPage[0]&&!h.dataUrl)h.dataUrl=x.hrefNoHash;var k=h.fromPage,m=h.dataUrl&&j.convertUrlToDataUrl(h.dataUrl)||b.jqmData("url"),v=m;j.getFilePath(m);var r=n.getActive(),q=n.activeIndex===0,w=0,u=document.title,y=h.role==="dialog"||b.jqmData("role")==="dialog";if(k&& | |
k[0]===b[0]&&!h.allowSamePageTransition)z=false,l.trigger("pagechange",p);else{i(b,h.role);h.fromHashChange&&n.directHashChange({currentUrl:m,isBack:function(){w=-1},isForward:function(){w=1}});try{a(document.activeElement||"").add("input:focus, textarea:focus, select:focus").blur()}catch(B){}y&&r&&(m=(r.url||"")+t);if(h.changeHash!==false&&m)n.ignoreNextHashChange=true,j.set(m);var C=!r?u:b.jqmData("title")||b.children(":jqmData(role='header')").find(".ui-title").getEncodedText();C&&u==document.title&& | |
(u=C);b.jqmData("title")||b.jqmData("title",u);h.transition=h.transition||(w&&!q?r.transition:e)||(y?a.mobile.defaultDialogTransition:a.mobile.defaultPageTransition);w||n.addNew(m,h.transition,u,v,h.role);document.title=n.getActive().title;a.mobile.activePage=b;h.reverse=h.reverse||w<0;d(b,k,h.transition,h.reverse).done(function(){c();h.duplicateCachedPage&&h.duplicateCachedPage.remove();o.removeClass("ui-mobile-rendering");f();l.trigger("pagechange",p)})}}}};a.mobile.changePage.defaults={transition:e, | |
reverse:false,changeHash:true,fromHashChange:false,role:e,duplicateCachedPage:e,pageContainer:e,showLoadMsg:true,dataUrl:e,fromPage:e,allowSamePageTransition:false};a.mobile._registerInternalEvents=function(){a("form").live("submit",function(b){var c=a(this);if(a.mobile.ajaxEnabled&&!c.is(":jqmData(ajax='false')")){var d=c.attr("method"),f=c.attr("target"),e=c.attr("action");if(!e&&(e=m(c),e===r.hrefNoHash))e=x.hrefNoSearch;e=j.makeUrlAbsolute(e,m(c));!j.isExternal(e)&&!f&&(a.mobile.changePage(e, | |
{type:d&&d.length&&d.toLowerCase()||"get",data:c.serialize(),transition:c.jqmData("transition"),direction:c.jqmData("direction"),reloadPage:true}),b.preventDefault())}});a(document).bind("vclick",function(b){if(!(b.which>1)&&a.mobile.linkBindingEnabled&&(b=k(b.target))&&j.parseUrl(b.getAttribute("href")||"#").hash!=="#")c(true),p=a(b).closest(".ui-btn").not(".ui-disabled"),p.addClass(a.mobile.activeBtnClass),a("."+a.mobile.activePageClass+" .ui-btn").not(b).blur()});a(document).bind("click",function(b){if(a.mobile.linkBindingEnabled){var d= | |
k(b.target);if(d&&!(b.which>1)){var f=a(d),g=function(){window.setTimeout(function(){c(true)},200)};if(f.is(":jqmData(rel='back')"))return window.history.back(),false;var h=m(f),d=j.makeUrlAbsolute(f.attr("href")||"#",h);if(!a.mobile.ajaxEnabled&&!j.isEmbeddedPage(d))g();else{if(d.search("#")!=-1)if(d=d.replace(/[^#]*#/,""))d=j.isPath(d)?j.makeUrlAbsolute(d,h):j.makeUrlAbsolute("#"+d,x.hrefNoHash);else{b.preventDefault();return}var h=f.is("[rel='external']")||f.is(":jqmData(ajax='false')")||f.is("[target]"), | |
i=a.mobile.allowCrossDomainPages&&x.protocol==="file:"&&d.search(/^https?:/)!=-1;h||j.isExternal(d)&&!i?g():(g=f.jqmData("transition"),h=(h=f.jqmData("direction"))&&h==="reverse"||f.jqmData("back"),f=f.attr("data-"+a.mobile.ns+"rel")||e,a.mobile.changePage(d,{transition:g,reverse:h,role:f}),b.preventDefault())}}}});a(".ui-page").live("pageshow.prefetch",function(){var b=[];a(this).find("a:jqmData(prefetch)").each(function(){var c=a(this),d=c.attr("href");d&&a.inArray(d,b)===-1&&(b.push(d),a.mobile.loadPage(d, | |
{role:c.attr("data-"+a.mobile.ns+"rel")}))})});a.mobile._handleHashChange=function(b){var c=j.stripHash(b),d={transition:a.mobile.urlHistory.stack.length===0?"none":e,changeHash:false,fromHashChange:true};if(!a.mobile.hashListeningEnabled||n.ignoreNextHashChange)n.ignoreNextHashChange=false;else{if(n.stack.length>1&&c.indexOf(t)>-1)if(a.mobile.activePage.is(".ui-dialog"))n.directHashChange({currentUrl:c,either:function(b){var f=a.mobile.urlHistory.getActive();c=f.pageUrl;a.extend(d,{role:f.role,transition:f.transition, | |
reverse:b})}});else{n.directHashChange({currentUrl:c,isBack:function(){window.history.back()},isForward:function(){window.history.forward()}});return}c?(c=typeof c==="string"&&!j.isPath(c)?j.makeUrlAbsolute("#"+c,r):c,a.mobile.changePage(c,d)):a.mobile.changePage(a.mobile.firstPage,d)}};q.bind("hashchange",function(){a.mobile._handleHashChange(location.hash)});a(document).bind("pageshow",h);a(window).bind("throttledresize",h)}})(jQuery); | |
(function(a,e){var b={},c=a(e),f=a.mobile.path.parseUrl(location.href);a.extend(b,{initialFilePath:f.pathname+f.search,initialHref:f.hrefNoHash,hashchangeFired:false,state:function(){return{hash:location.hash||"#"+b.initialFilePath,title:document.title,initialHref:b.initialHref}},resetUIKeys:function(b){var c="&"+a.mobile.subPageUrlKey,f=b.indexOf(a.mobile.dialogHashKey);f>-1?b=b.slice(0,f)+"#"+b.slice(f):b.indexOf(c)>-1&&(b=b.split(c).join("#"+c));return b},nextHashChangePrevented:function(c){a.mobile.urlHistory.ignoreNextHashChange= | |
c;b.onHashChangeDisabled=c},onHashChange:function(){if(!b.onHashChangeDisabled){var c,f;c=location.hash;var e=a.mobile.path.isPath(c),i=e?location.href:a.mobile.getDocumentUrl();c=e?c.replace("#",""):c;f=b.state();c=a.mobile.path.makeUrlAbsolute(c,i);e&&(c=b.resetUIKeys(c));history.replaceState(f,document.title,c)}},onPopState:function(c){var f=c.originalEvent.state;f&&(b.nextHashChangePrevented(true),setTimeout(function(){b.nextHashChangePrevented(false);a.mobile._handleHashChange(f.hash)},100))}, | |
init:function(){c.bind("hashchange",b.onHashChange);c.bind("popstate",b.onPopState);location.hash===""&&history.replaceState(b.state(),document.title,location.href)}});a(function(){a.mobile.pushStateEnabled&&a.support.pushState&&b.init()})})(jQuery,this); | |
(function(a){function e(b,c,f,d){var e=new a.Deferred,h=c?" reverse":"",i="ui-mobile-viewport-transitioning viewport-"+b;f.animationComplete(function(){f.add(d).removeClass("out in reverse "+b);d&&d[0]!==f[0]&&d.removeClass(a.mobile.activePageClass);f.parent().removeClass(i);e.resolve(b,c,f,d)});f.parent().addClass(i);d&&d.addClass(b+" out"+h);f.addClass(a.mobile.activePageClass+" "+b+" in"+h);return e.promise()}a.mobile.css3TransitionHandler=e;if(a.mobile.defaultTransitionHandler===a.mobile.noneTransitionHandler)a.mobile.defaultTransitionHandler= | |
e})(jQuery,this); | |
(function(a){a.mobile.page.prototype.options.degradeInputs={color:false,date:false,datetime:false,"datetime-local":false,email:false,month:false,number:false,range:"number",search:"text",tel:false,time:false,url:false,week:false};a(document).bind("pagecreate create",function(e){var b=a(e.target).closest(':jqmData(role="page")').data("page"),c;if(b)c=b.options,a(e.target).find("input").not(b.keepNativeSelector()).each(function(){var b=a(this),d=this.getAttribute("type"),e=c.degradeInputs[d]||"text"; | |
if(c.degradeInputs[d]){var h=a("<div>").html(b.clone()).html(),i=h.indexOf(" type=")>-1;b.replaceWith(h.replace(i?/\s+type=["']?\w+['"]?/:/\/?>/,' type="'+e+'" data-'+a.mobile.ns+'type="'+d+'"'+(i?"":">")))}})})})(jQuery); | |
(function(a,e){a.widget("mobile.dialog",a.mobile.widget,{options:{closeBtnText:"Close",overlayTheme:"a",initSelector:":jqmData(role='dialog')"},_create:function(){var b=this,c=this.element,f=a("<a href='#' data-"+a.mobile.ns+"icon='delete' data-"+a.mobile.ns+"iconpos='notext'>"+this.options.closeBtnText+"</a>");c.addClass("ui-overlay-"+this.options.overlayTheme);c.attr("role","dialog").addClass("ui-dialog").find(":jqmData(role='header')").addClass("ui-corner-top ui-overlay-shadow").prepend(f).end().find(":jqmData(role='content'),:jqmData(role='footer')").addClass("ui-overlay-shadow").last().addClass("ui-corner-bottom"); | |
f.bind("vclick",function(){b.close()});c.bind("vclick submit",function(b){var b=a(b.target).closest(b.type==="vclick"?"a":"form"),c;b.length&&!b.jqmData("transition")&&(c=a.mobile.urlHistory.getActive()||{},b.attr("data-"+a.mobile.ns+"transition",c.transition||a.mobile.defaultDialogTransition).attr("data-"+a.mobile.ns+"direction","reverse"))}).bind("pagehide",function(){a(this).find("."+a.mobile.activeBtnClass).removeClass(a.mobile.activeBtnClass)})},close:function(){e.history.back()}});a(a.mobile.dialog.prototype.options.initSelector).live("pagecreate", | |
function(){a(this).dialog()})})(jQuery,this); | |
(function(a){a.mobile.page.prototype.options.backBtnText="Back";a.mobile.page.prototype.options.addBackBtn=false;a.mobile.page.prototype.options.backBtnTheme=null;a.mobile.page.prototype.options.headerTheme="a";a.mobile.page.prototype.options.footerTheme="a";a.mobile.page.prototype.options.contentTheme=null;a(":jqmData(role='page'), :jqmData(role='dialog')").live("pagecreate",function(){var e=a(this).data("page").options,b=e.theme;a(":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')",this).each(function(){var c= | |
a(this),f=c.jqmData("role"),d=c.jqmData("theme"),g=d||e.contentTheme||b,h;c.addClass("ui-"+f);if(f==="header"||f==="footer"){var i=d||(f==="header"?e.headerTheme:e.footerTheme)||b;c.addClass("ui-bar-"+i).attr("role",f==="header"?"banner":"contentinfo");d=c.children("a");g=d.hasClass("ui-btn-left");h=d.hasClass("ui-btn-right");g=g||d.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length;h||d.eq(1).addClass("ui-btn-right");e.addBackBtn&&f==="header"&&a(".ui-page").length>1&&c.jqmData("url")!==a.mobile.path.stripHash(location.hash)&& | |
!g&&a("<a href='#' class='ui-btn-left' data-"+a.mobile.ns+"rel='back' data-"+a.mobile.ns+"icon='arrow-l'>"+e.backBtnText+"</a>").attr("data-"+a.mobile.ns+"theme",e.backBtnTheme||i).prependTo(c);c.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({tabindex:"0",role:"heading","aria-level":"1"})}else f==="content"&&(g&&c.addClass("ui-body-"+g),c.attr("role","main"))})})})(jQuery); | |
(function(a){a.widget("mobile.collapsible",a.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:true,heading:"h1,h2,h3,h4,h5,h6,legend",theme:null,contentTheme:null,iconTheme:"d",initSelector:":jqmData(role='collapsible')"},_create:function(){var e=this.element,b=this.options,c=e.addClass("ui-collapsible"),f=e.children(b.heading).first(),d=c.wrapInner("<div class='ui-collapsible-content'></div>").find(".ui-collapsible-content"), | |
g=e.closest(":jqmData(role='collapsible-set')").addClass("ui-collapsible-set"),e=g.children(":jqmData(role='collapsible')");f.is("legend")&&(f=a("<div role='heading'>"+f.html()+"</div>").insertBefore(f),f.next().remove());if(g.length){if(!b.theme)b.theme=g.jqmData("theme");if(!b.contentTheme)b.contentTheme=g.jqmData("content-theme")}d.addClass(b.contentTheme?"ui-body-"+b.contentTheme:"");f.insertBefore(d).addClass("ui-collapsible-heading").append("<span class='ui-collapsible-heading-status'></span>").wrapInner("<a href='#' class='ui-collapsible-heading-toggle'></a>").find("a").first().buttonMarkup({shadow:false, | |
corners:false,iconPos:"left",icon:"plus",theme:b.theme});g.length?(g.jqmData("collapsiblebound")||g.jqmData("collapsiblebound",true).bind("expand",function(b){a(b.target).closest(".ui-collapsible").siblings(".ui-collapsible").trigger("collapse")}),e.first().find("a").first().addClass("ui-corner-top").find(".ui-btn-inner").addClass("ui-corner-top"),e.last().jqmData("collapsible-last",true).find("a").first().addClass("ui-corner-bottom").find(".ui-btn-inner").addClass("ui-corner-bottom"),c.jqmData("collapsible-last")&& | |
f.find("a").first().add(f.find(".ui-btn-inner")).addClass("ui-corner-bottom")):f.find("a").first().add(f.find(".ui-btn-inner")).addClass("ui-corner-top ui-corner-bottom");c.bind("expand collapse",function(e){if(!e.isDefaultPrevented()){e.preventDefault();var i=a(this),e=e.type==="collapse",k=b.contentTheme;f.toggleClass("ui-collapsible-heading-collapsed",e).find(".ui-collapsible-heading-status").text(e?b.expandCueText:b.collapseCueText).end().find(".ui-icon").toggleClass("ui-icon-minus",!e).toggleClass("ui-icon-plus", | |
e);i.toggleClass("ui-collapsible-collapsed",e);d.toggleClass("ui-collapsible-content-collapsed",e).attr("aria-hidden",e);if(k&&(!g.length||c.jqmData("collapsible-last")))f.find("a").first().add(f.find(".ui-btn-inner")).toggleClass("ui-corner-bottom",e),d.toggleClass("ui-corner-bottom",!e);d.trigger("updatelayout")}}).trigger(b.collapsed?"collapse":"expand");f.bind("click",function(a){var b=f.is(".ui-collapsible-heading-collapsed")?"expand":"collapse";c.trigger(b);a.preventDefault()})}});a(document).bind("pagecreate create", | |
function(e){a(a.mobile.collapsible.prototype.options.initSelector,e.target).collapsible()})})(jQuery);(function(a){a.fn.fieldcontain=function(){return this.addClass("ui-field-contain ui-body ui-br")};a(document).bind("pagecreate create",function(e){a(":jqmData(role='fieldcontain')",e.target).fieldcontain()})})(jQuery); | |
(function(a){a.fn.grid=function(e){return this.each(function(){var b=a(this),c=a.extend({grid:null},e),f=b.children(),d={solo:1,a:2,b:3,c:4,d:5},c=c.grid;if(!c)if(f.length<=5)for(var g in d)d[g]===f.length&&(c=g);else c="a";d=d[c];b.addClass("ui-grid-"+c);f.filter(":nth-child("+d+"n+1)").addClass("ui-block-a");d>1&&f.filter(":nth-child("+d+"n+2)").addClass("ui-block-b");d>2&&f.filter(":nth-child(3n+3)").addClass("ui-block-c");d>3&&f.filter(":nth-child(4n+4)").addClass("ui-block-d");d>4&&f.filter(":nth-child(5n+5)").addClass("ui-block-e")})}})(jQuery); | |
(function(a,e){a.widget("mobile.navbar",a.mobile.widget,{options:{iconpos:"top",grid:null,initSelector:":jqmData(role='navbar')"},_create:function(){var b=this.element,c=b.find("a"),f=c.filter(":jqmData(icon)").length?this.options.iconpos:e;b.addClass("ui-navbar").attr("role","navigation").find("ul").grid({grid:this.options.grid});f||b.addClass("ui-navbar-noicons");c.buttonMarkup({corners:false,shadow:false,iconpos:f});b.delegate("a","vclick",function(){c.not(".ui-state-persist").removeClass(a.mobile.activeBtnClass); | |
a(this).addClass(a.mobile.activeBtnClass)})}});a(document).bind("pagecreate create",function(b){a(a.mobile.navbar.prototype.options.initSelector,b.target).navbar()})})(jQuery); | |
(function(a){var e={};a.widget("mobile.listview",a.mobile.widget,{options:{theme:"c",countTheme:"c",headerTheme:"b",dividerTheme:"b",splitIcon:"arrow-r",splitTheme:"b",inset:false,initSelector:":jqmData(role='listview')"},_create:function(){var a=this;a.element.addClass(function(c,f){return f+" ui-listview "+(a.options.inset?" ui-listview-inset ui-corner-all ui-shadow ":"")});a.refresh(true)},_removeCorners:function(a,c){a=a.add(a.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb"));c==="top"?a.removeClass("ui-corner-top ui-corner-tr ui-corner-tl"): | |
c==="bottom"?a.removeClass("ui-corner-bottom ui-corner-br ui-corner-bl"):a.removeClass("ui-corner-top ui-corner-tr ui-corner-tl ui-corner-bottom ui-corner-br ui-corner-bl")},_refreshCorners:function(a){var c,f;this.options.inset&&(c=this.element.children("li"),f=a?c.not(".ui-screen-hidden"):c.filter(":visible"),this._removeCorners(c),c=f.first().addClass("ui-corner-top"),c.add(c.find(".ui-btn-inner").not(".ui-li-link-alt span:first-child")).addClass("ui-corner-top").end().find(".ui-li-link-alt, .ui-li-link-alt span:first-child").addClass("ui-corner-tr").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-tl"), | |
f=f.last().addClass("ui-corner-bottom"),f.add(f.find(".ui-btn-inner")).find(".ui-li-link-alt").addClass("ui-corner-br").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-bl"));a||this.element.trigger("updatelayout")},_findFirstElementByTagName:function(a,c,f,d){var e={};for(e[f]=e[d]=true;a;){if(e[a.nodeName])return a;a=a[c]}return null},_addThumbClasses:function(b){var c,f,d=b.length;for(c=0;c<d;c++)f=a(this._findFirstElementByTagName(b[c].firstChild,"nextSibling","img","IMG")),f.length&& | |
(f.addClass("ui-li-thumb"),a(this._findFirstElementByTagName(f[0].parentNode,"parentNode","li","LI")).addClass(f.is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb"))},refresh:function(b){this.parentPage=this.element.closest(".ui-page");this._createSubPages();var c=this.options,f=this.element,d=f.jqmData("dividertheme")||c.dividerTheme,e=f.jqmData("splittheme"),h=f.jqmData("spliticon"),i=f.children("li"),k=a.support.cssPseudoElement||!a.nodeName(f[0],"ol")?0:1,m,q,o,l,j;k&&f.find(".ui-li-dec").remove(); | |
for(var p=0,n=i.length;p<n;p++){m=i.eq(p);q="ui-li";if(b||!m.hasClass("ui-li"))o=m.jqmData("theme")||c.theme,l=m.children("a"),l.length?(j=m.jqmData("icon"),m.buttonMarkup({wrapperEls:"div",shadow:false,corners:false,iconpos:"right",icon:l.length>1||j===false?false:j||"arrow-r",theme:o}),j!=false&&l.length==1&&m.addClass("ui-li-has-arrow"),l.first().addClass("ui-link-inherit"),l.length>1&&(q+=" ui-li-has-alt",l=l.last(),j=e||l.jqmData("theme")||c.splitTheme,l.appendTo(m).attr("title",l.getEncodedText()).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:false, | |
corners:false,theme:o,icon:false,iconpos:false}).find(".ui-btn-inner").append(a(document.createElement("span")).buttonMarkup({shadow:true,corners:true,theme:j,iconpos:"notext",icon:h||l.jqmData("icon")||c.splitIcon})))):m.jqmData("role")==="list-divider"?(q+=" ui-li-divider ui-btn ui-bar-"+d,m.attr("role","heading"),k&&(k=1)):q+=" ui-li-static ui-body-"+o;k&&q.indexOf("ui-li-divider")<0&&(o=m.is(".ui-li-static:first")?m:m.find(".ui-link-inherit"),o.addClass("ui-li-jsnumbering").prepend("<span class='ui-li-dec'>"+ | |
k++ +". </span>"));m.addClass(q).children(".ui-btn-inner").addClass(q)}f.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading").end().find("p, dl").addClass("ui-li-desc").end().find(".ui-li-aside").each(function(){var b=a(this);b.prependTo(b.parent())}).end().find(".ui-li-count").each(function(){a(this).closest("li").addClass("ui-li-has-count")}).addClass("ui-btn-up-"+(f.jqmData("counttheme")||this.options.countTheme)+" ui-btn-corner-all");this._addThumbClasses(i);this._addThumbClasses(f.find(".ui-link-inherit")); | |
this._refreshCorners(b)},_idStringEscape:function(a){return a.replace(/[^a-zA-Z0-9]/g,"-")},_createSubPages:function(){var b=this.element,c=b.closest(".ui-page"),f=c.jqmData("url"),d=f||c[0][a.expando],g=b.attr("id"),h=this.options,i="data-"+a.mobile.ns,k=this,m=c.find(":jqmData(role='footer')").jqmData("id"),q;typeof e[d]==="undefined"&&(e[d]=-1);g=g||++e[d];a(b.find("li>ul, li>ol").toArray().reverse()).each(function(c){var d=a(this),e=d.attr("id")||g+"-"+c,c=d.parent(),k=a(d.prevAll().toArray().reverse()), | |
k=k.length?k:a("<span>"+a.trim(c.contents()[0].nodeValue)+"</span>"),n=k.first().getEncodedText(),e=(f||"")+"&"+a.mobile.subPageUrlKey+"="+e,A=d.jqmData("theme")||h.theme,z=d.jqmData("counttheme")||b.jqmData("counttheme")||h.countTheme;q=true;d.detach().wrap("<div "+i+"role='page' "+i+"url='"+e+"' "+i+"theme='"+A+"' "+i+"count-theme='"+z+"'><div "+i+"role='content'></div></div>").parent().before("<div "+i+"role='header' "+i+"theme='"+h.headerTheme+"'><div class='ui-title'>"+n+"</div></div>").after(m? | |
a("<div "+i+"role='footer' "+i+"id='"+m+"'>"):"").parent().appendTo(a.mobile.pageContainer).page();d=c.find("a:first");d.length||(d=a("<a/>").html(k||n).prependTo(c.empty()));d.attr("href","#"+e)}).listview();q&&c.is(":jqmData(external-page='true')")&&c.data("page").options.domCache===false&&c.unbind("pagehide.remove").bind("pagehide.remove",function(b,d){var e=d.nextPage;d.nextPage&&(e=e.jqmData("url"),e.indexOf(f+"&"+a.mobile.subPageUrlKey)!==0&&(k.childPages().remove(),c.remove()))})},childPages:function(){var b= | |
this.parentPage.jqmData("url");return a(":jqmData(url^='"+b+"&"+a.mobile.subPageUrlKey+"')")}});a(document).bind("pagecreate create",function(b){a(a.mobile.listview.prototype.options.initSelector,b.target).listview()})})(jQuery); | |
(function(a){a.mobile.listview.prototype.options.filter=false;a.mobile.listview.prototype.options.filterPlaceholder="Filter items...";a.mobile.listview.prototype.options.filterTheme="c";a.mobile.listview.prototype.options.filterCallback=function(a,b){return a.toLowerCase().indexOf(b)===-1};a(":jqmData(role='listview')").live("listviewcreate",function(){var e=a(this),b=e.data("listview");if(b.options.filter){var c=a("<form>",{"class":"ui-listview-filter ui-bar-"+b.options.filterTheme,role:"search"}); | |
a("<input>",{placeholder:b.options.filterPlaceholder}).attr("data-"+a.mobile.ns+"type","search").jqmData("lastval","").bind("keyup change",function(){var c=a(this),d=this.value.toLowerCase(),g=null,g=c.jqmData("lastval")+"",h=false,i="";c.jqmData("lastval",d);i=d.substr(0,g.length-1).replace(g,"");g=d.length<g.length||i.length!=d.length-g.length?e.children():e.children(":not(.ui-screen-hidden)");if(d){for(var k=g.length-1;k>=0;k--)c=a(g[k]),i=c.jqmData("filtertext")||c.text(),c.is("li:jqmData(role=list-divider)")? | |
(c.toggleClass("ui-filter-hidequeue",!h),h=false):b.options.filterCallback(i,d)?c.toggleClass("ui-filter-hidequeue",true):h=true;g.filter(":not(.ui-filter-hidequeue)").toggleClass("ui-screen-hidden",false);g.filter(".ui-filter-hidequeue").toggleClass("ui-screen-hidden",true).toggleClass("ui-filter-hidequeue",false)}else g.toggleClass("ui-screen-hidden",false);b._refreshCorners()}).appendTo(c).textinput();a(this).jqmData("inset")&&c.addClass("ui-listview-filter-inset");c.bind("submit",function(){return false}).insertBefore(e)}})})(jQuery); | |
(function(a){a(document).bind("pagecreate create",function(e){a(":jqmData(role='nojs')",e.target).addClass("ui-nojs")})})(jQuery); | |
(function(a,e){a.widget("mobile.checkboxradio",a.mobile.widget,{options:{theme:null,initSelector:"input[type='checkbox'],input[type='radio']"},_create:function(){var b=this,c=this.element,f=c.closest("form,fieldset,:jqmData(role='page')").find("label").filter("[for='"+c[0].id+"']"),d=c.attr("type"),g=d+"-on",h=d+"-off",i=c.parents(":jqmData(type='horizontal')").length?e:h;if(!(d!=="checkbox"&&d!=="radio")){a.extend(this,{label:f,inputtype:d,checkedClass:"ui-"+g+(i?"":" "+a.mobile.activeBtnClass), | |
uncheckedClass:"ui-"+h,checkedicon:"ui-icon-"+g,uncheckedicon:"ui-icon-"+h});if(!this.options.theme)this.options.theme=this.element.jqmData("theme");f.buttonMarkup({theme:this.options.theme,icon:i,shadow:false});c.add(f).wrapAll("<div class='ui-"+d+"'></div>");f.bind({vmouseover:function(b){a(this).parent().is(".ui-disabled")&&b.stopPropagation()},vclick:function(a){if(c.is(":disabled"))a.preventDefault();else return b._cacheVals(),c.prop("checked",d==="radio"&&true||!c.prop("checked")),c.triggerHandler("click"), | |
b._getInputSet().not(c).prop("checked",false),b._updateAll(),false}});c.bind({vmousedown:function(){b._cacheVals()},vclick:function(){var c=a(this);c.is(":checked")?(c.prop("checked",true),b._getInputSet().not(c).prop("checked",false)):c.prop("checked",false);b._updateAll()},focus:function(){f.addClass("ui-focus")},blur:function(){f.removeClass("ui-focus")}});this.refresh()}},_cacheVals:function(){this._getInputSet().each(function(){var b=a(this);b.jqmData("cacheVal",b.is(":checked"))})},_getInputSet:function(){return this.inputtype== | |
"checkbox"?this.element:this.element.closest("form,fieldset,:jqmData(role='page')").find("input[name='"+this.element.attr("name")+"'][type='"+this.inputtype+"']")},_updateAll:function(){var b=this;this._getInputSet().each(function(){var c=a(this);(c.is(":checked")||b.inputtype==="checkbox")&&c.trigger("change")}).checkboxradio("refresh")},refresh:function(){var b=this.element,c=this.label,f=c.find(".ui-icon");a(b[0]).prop("checked")?(c.addClass(this.checkedClass).removeClass(this.uncheckedClass), | |
f.addClass(this.checkedicon).removeClass(this.uncheckedicon)):(c.removeClass(this.checkedClass).addClass(this.uncheckedClass),f.removeClass(this.checkedicon).addClass(this.uncheckedicon));b.is(":disabled")?this.disable():this.enable()},disable:function(){this.element.prop("disabled",true).parent().addClass("ui-disabled")},enable:function(){this.element.prop("disabled",false).parent().removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(b){a.mobile.checkboxradio.prototype.enhanceWithin(b.target)})})(jQuery); | |
(function(a,e){a.widget("mobile.button",a.mobile.widget,{options:{theme:null,icon:null,iconpos:null,inline:null,corners:true,shadow:true,iconshadow:true,initSelector:"button, [type='button'], [type='submit'], [type='reset'], [type='image']"},_create:function(){var b=this.element,c=this.options,f,d;this.button=a("<div></div>").text(b.text()||b.val()).insertBefore(b).buttonMarkup({theme:c.theme,icon:c.icon,iconpos:c.iconpos,inline:c.inline,corners:c.corners,shadow:c.shadow,iconshadow:c.iconshadow}).append(b.addClass("ui-btn-hidden")); | |
c=b.attr("type");f=b.attr("name");c!=="button"&&c!=="reset"&&f&&b.bind("vclick",function(){d===e&&(d=a("<input>",{type:"hidden",name:b.attr("name"),value:b.attr("value")}).insertBefore(b),a(document).submit(function(){d.remove()}))});this.refresh()},enable:function(){this.element.attr("disabled",false);this.button.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)},disable:function(){this.element.attr("disabled",true);this.button.addClass("ui-disabled").attr("aria-disabled", | |
true);return this._setOption("disabled",true)},refresh:function(){var a=this.element;a.prop("disabled")?this.disable():this.enable();this.button.data("textWrapper").text(a.text()||a.val())}});a(document).bind("pagecreate create",function(b){a.mobile.button.prototype.enhanceWithin(b.target)})})(jQuery); | |
(function(a,e){a.widget("mobile.slider",a.mobile.widget,{options:{theme:null,trackTheme:null,disabled:false,initSelector:"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')"},_create:function(){var b=this,c=this.element,f=a.mobile.getInheritedTheme(c,"c"),d=this.options.theme||f,g=this.options.trackTheme||f,h=c[0].nodeName.toLowerCase(),f=h=="select"?"ui-slider-switch":"",i=c.attr("id"),k=i+"-label",i=a("[for='"+i+"']").attr("id",k),m=function(){return h=="input"?parseFloat(c.val()): | |
c[0].selectedIndex},q=h=="input"?parseFloat(c.attr("min")):0,o=h=="input"?parseFloat(c.attr("max")):c.find("option").length-1,l=window.parseFloat(c.attr("step")||1),j=a("<div class='ui-slider "+f+" ui-btn-down-"+g+" ui-btn-corner-all' role='application'></div>"),p=a("<a href='#' class='ui-slider-handle'></a>").appendTo(j).buttonMarkup({corners:true,theme:d,shadow:true}).attr({role:"slider","aria-valuemin":q,"aria-valuemax":o,"aria-valuenow":m(),"aria-valuetext":m(),title:m(),"aria-labelledby":k}); | |
a.extend(this,{slider:j,handle:p,dragging:false,beforeStart:null,userModified:false,mouseMoved:false});h=="select"&&(j.wrapInner("<div class='ui-slider-inneroffset'></div>"),p.addClass("ui-slider-handle-snapping"),c.find("option"),c.find("option").each(function(b){var c=!b?"b":"a",d=!b?"right":"left",b=!b?" ui-btn-down-"+g:" "+a.mobile.activeBtnClass;a("<div class='ui-slider-labelbg ui-slider-labelbg-"+c+b+" ui-btn-corner-"+d+"'></div>").prependTo(j);a("<span class='ui-slider-label ui-slider-label-"+ | |
c+b+" ui-btn-corner-"+d+"' role='img'>"+a(this).getEncodedText()+"</span>").prependTo(p)}));i.addClass("ui-slider");c.addClass(h==="input"?"ui-slider-input":"ui-slider-switch").change(function(){b.mouseMoved||b.refresh(m(),true)}).keyup(function(){b.refresh(m(),true,true)}).blur(function(){b.refresh(m(),true)});a(document).bind("vmousemove",function(a){if(b.dragging)return b.mouseMoved=true,h==="select"&&p.removeClass("ui-slider-handle-snapping"),b.refresh(a),b.userModified=b.beforeStart!==c[0].selectedIndex, | |
false});j.bind("vmousedown",function(a){b.dragging=true;b.userModified=false;b.mouseMoved=false;if(h==="select")b.beforeStart=c[0].selectedIndex;b.refresh(a);return false});j.add(document).bind("vmouseup",function(){if(b.dragging)return b.dragging=false,h==="select"&&(p.addClass("ui-slider-handle-snapping"),b.mouseMoved?b.userModified?b.refresh(b.beforeStart==0?1:0):b.refresh(b.beforeStart):b.refresh(b.beforeStart==0?1:0)),b.mouseMoved=false});j.insertAfter(c);this.handle.bind("vmousedown",function(){a(this).focus()}).bind("vclick", | |
false);this.handle.bind("keydown",function(c){var d=m();if(!b.options.disabled){switch(c.keyCode){case a.mobile.keyCode.HOME:case a.mobile.keyCode.END:case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:if(c.preventDefault(),!b._keySliding)b._keySliding=true,a(this).addClass("ui-state-active")}switch(c.keyCode){case a.mobile.keyCode.HOME:b.refresh(q);break;case a.mobile.keyCode.END:b.refresh(o); | |
break;case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:b.refresh(d+l);break;case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:b.refresh(d-l)}}}).keyup(function(){if(b._keySliding)b._keySliding=false,a(this).removeClass("ui-state-active")});this.refresh(e,e,true)},refresh:function(a,c,f){(this.options.disabled||this.element.attr("disabled"))&&this.disable();var d=this.element,e,h=d[0].nodeName.toLowerCase(),i=h==="input"?parseFloat(d.attr("min")): | |
0,k=h==="input"?parseFloat(d.attr("max")):d.find("option").length-1;if(typeof a==="object"){if(!this.dragging||a.pageX<this.slider.offset().left-8||a.pageX>this.slider.offset().left+this.slider.width()+8)return;e=Math.round((a.pageX-this.slider.offset().left)/this.slider.width()*100)}else a==null&&(a=h==="input"?parseFloat(d.val()):d[0].selectedIndex),e=(parseFloat(a)-i)/(k-i)*100;if(!isNaN(e)&&(e<0&&(e=0),e>100&&(e=100),a=Math.round(e/100*(k-i))+i,a<i&&(a=i),a>k&&(a=k),this.handle.css("left",e+"%"), | |
this.handle.attr({"aria-valuenow":h==="input"?a:d.find("option").eq(a).attr("value"),"aria-valuetext":h==="input"?a:d.find("option").eq(a).getEncodedText(),title:a}),h==="select"&&(a===0?this.slider.addClass("ui-slider-switch-a").removeClass("ui-slider-switch-b"):this.slider.addClass("ui-slider-switch-b").removeClass("ui-slider-switch-a")),!f))f=false,h==="input"?(f=d.val()!==a,d.val(a)):(f=d[0].selectedIndex!==a,d[0].selectedIndex=a),!c&&f&&d.trigger("change")},enable:function(){this.element.attr("disabled", | |
false);this.slider.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)},disable:function(){this.element.attr("disabled",true);this.slider.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)}});a(document).bind("pagecreate create",function(b){a.mobile.slider.prototype.enhanceWithin(b.target)})})(jQuery); | |
(function(a){a.widget("mobile.textinput",a.mobile.widget,{options:{theme:null,initSelector:"input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])"},_create:function(){var e=this.element, | |
b=this.options.theme||a.mobile.getInheritedTheme(this.element,"c"),c=" ui-body-"+b,f,d;a("label[for='"+e.attr("id")+"']").addClass("ui-input-text");f=e.addClass("ui-input-text ui-body-"+b);typeof e[0].autocorrect!=="undefined"&&!a.support.touchOverflow&&(e[0].setAttribute("autocorrect","off"),e[0].setAttribute("autocomplete","off"));e.is("[type='search'],:jqmData(type='search')")?(f=e.wrap("<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield"+c+"'></div>").parent(), | |
d=a("<a href='#' class='ui-input-clear' title='clear text'>clear text</a>").tap(function(a){e.val("").focus();e.trigger("change");d.addClass("ui-input-clear-hidden");a.preventDefault()}).appendTo(f).buttonMarkup({icon:"delete",iconpos:"notext",corners:true,shadow:true}),b=function(){setTimeout(function(){d.toggleClass("ui-input-clear-hidden",!e.val())},0)},b(),e.bind("paste cut keyup focus change blur",b)):e.addClass("ui-corner-all ui-shadow-inset"+c);e.focus(function(){f.addClass("ui-focus")}).blur(function(){f.removeClass("ui-focus")}); | |
if(e.is("textarea")){var g=function(){var a=e[0].scrollHeight;e[0].clientHeight<a&&e.height(a+15)},h;e.keyup(function(){clearTimeout(h);h=setTimeout(g,100)});a.trim(e.val())&&(a(window).load(g),a(document).one("pagechange",g))}},disable:function(){(this.element.attr("disabled",true).is("[type='search'],:jqmData(type='search')")?this.element.parent():this.element).addClass("ui-disabled")},enable:function(){(this.element.attr("disabled",false).is("[type='search'],:jqmData(type='search')")?this.element.parent(): | |
this.element).removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(e){a.mobile.textinput.prototype.enhanceWithin(e.target)})})(jQuery); | |
(function(a){var e=function(b){var c=b.selectID,f=b.label,d=b.select.closest(".ui-page"),e=a("<div>",{"class":"ui-selectmenu-screen ui-screen-hidden"}).appendTo(d),h=b._selectOptions(),i=b.isMultiple=b.select[0].multiple,k=c+"-button",m=c+"-menu",q=a("<div data-"+a.mobile.ns+"role='dialog' data-"+a.mobile.ns+"theme='"+b.options.theme+"' data-"+a.mobile.ns+"overlay-theme='"+b.options.overlayTheme+"'><div data-"+a.mobile.ns+"role='header'><div class='ui-title'>"+f.getEncodedText()+"</div></div><div data-"+ | |
a.mobile.ns+"role='content'></div></div>").appendTo(a.mobile.pageContainer).page(),o=a("<div>",{"class":"ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-"+b.options.overlayTheme+" "+a.mobile.defaultDialogTransition}).insertAfter(e),l=a("<ul>",{"class":"ui-selectmenu-list",id:m,role:"listbox","aria-labelledby":k}).attr("data-"+a.mobile.ns+"theme",b.options.theme).appendTo(o),j=a("<div>",{"class":"ui-header ui-bar-"+b.options.theme}).prependTo(o),p=a("<h1>",{"class":"ui-title"}).appendTo(j), | |
n=a("<a>",{text:b.options.closeText,href:"#","class":"ui-btn-left"}).attr("data-"+a.mobile.ns+"iconpos","notext").attr("data-"+a.mobile.ns+"icon","delete").appendTo(j).buttonMarkup(),A=q.find(".ui-content"),z=q.find(".ui-header a");a.extend(b,{select:b.select,selectID:c,buttonId:k,menuId:m,thisPage:d,menuPage:q,label:f,screen:e,selectOptions:h,isMultiple:i,theme:b.options.theme,listbox:o,list:l,header:j,headerTitle:p,headerClose:n,menuPageContent:A,menuPageClose:z,placeholder:"",build:function(){var b= | |
this;b.refresh();b.select.attr("tabindex","-1").focus(function(){a(this).blur();b.button.focus()});b.button.bind("vclick keydown",function(c){if(c.type=="vclick"||c.keyCode&&(c.keyCode===a.mobile.keyCode.ENTER||c.keyCode===a.mobile.keyCode.SPACE))b.open(),c.preventDefault()});b.list.attr("role","listbox").delegate(".ui-li>a","focusin",function(){a(this).attr("tabindex","0")}).delegate(".ui-li>a","focusout",function(){a(this).attr("tabindex","-1")}).delegate("li:not(.ui-disabled, .ui-li-divider)", | |
"click",function(c){var d=b.select[0].selectedIndex,f=b.list.find("li:not(.ui-li-divider)").index(this),e=b._selectOptions().eq(f)[0];e.selected=b.isMultiple?!e.selected:true;b.isMultiple&&a(this).find(".ui-icon").toggleClass("ui-icon-checkbox-on",e.selected).toggleClass("ui-icon-checkbox-off",!e.selected);(b.isMultiple||d!==f)&&b.select.trigger("change");b.isMultiple||b.close();c.preventDefault()}).keydown(function(b){var c=a(b.target),d=c.closest("li");switch(b.keyCode){case 38:return b=d.prev(), | |
b.length&&(c.blur().attr("tabindex","-1"),b.find("a").first().focus()),false;case 40:return b=d.next(),b.length&&(c.blur().attr("tabindex","-1"),b.find("a").first().focus()),false;case 13:case 32:return c.trigger("click"),false}});b.menuPage.bind("pagehide",function(){b.list.appendTo(b.listbox);b._focusButton();a.mobile._bindPageRemove.call(b.thisPage)});b.screen.bind("vclick",function(){b.close()});b.headerClose.click(function(){if(b.menuType=="overlay")return b.close(),false});b.thisPage.addDependents(this.menuPage)}, | |
_isRebuildRequired:function(){var a=this.list.find("li");return this._selectOptions().text()!==a.text()},refresh:function(b){var c=this;this._selectOptions();this.selected();var d=this.selectedIndices();(b||this._isRebuildRequired())&&c._buildList();c.setButtonText();c.setButtonCount();c.list.find("li:not(.ui-li-divider)").removeClass(a.mobile.activeBtnClass).attr("aria-selected",false).each(function(b){a.inArray(b,d)>-1&&(b=a(this),b.attr("aria-selected",true),c.isMultiple?b.find(".ui-icon").removeClass("ui-icon-checkbox-off").addClass("ui-icon-checkbox-on"): | |
b.addClass(a.mobile.activeBtnClass))})},close:function(){if(!this.options.disabled&&this.isOpen)this.menuType=="page"?window.history.back():(this.screen.addClass("ui-screen-hidden"),this.listbox.addClass("ui-selectmenu-hidden").removeAttr("style").removeClass("in"),this.list.appendTo(this.listbox),this._focusButton()),this.isOpen=false},open:function(){if(!this.options.disabled){var b=this,c=b.list.parent().outerHeight(),d=b.list.parent().outerWidth(),f=a(".ui-page-active"),e=a.support.touchOverflow&& | |
a.mobile.touchOverflowEnabled,f=f.is(".ui-native-fixed")?f.find(".ui-content"):f;scrollTop=e?f.scrollTop():a(window).scrollTop();btnOffset=b.button.offset().top;screenHeight=window.innerHeight;screenWidth=window.innerWidth;b.button.addClass(a.mobile.activeBtnClass);setTimeout(function(){b.button.removeClass(a.mobile.activeBtnClass)},300);if(c>screenHeight-80||!a.support.scrollTop){b.thisPage.unbind("pagehide.remove");if(scrollTop==0&&btnOffset>screenHeight)b.thisPage.one("pagehide",function(){a(this).jqmData("lastScroll", | |
btnOffset)});b.menuPage.one("pageshow",function(){a(window).one("silentscroll",function(){b.list.find(a.mobile.activeBtnClass).focus()});b.isOpen=true});b.menuType="page";b.menuPageContent.append(b.list);b.menuPage.find("div .ui-title").text(b.label.text());a.mobile.changePage(b.menuPage,{transition:a.mobile.defaultDialogTransition})}else{b.menuType="overlay";b.screen.height(a(document).height()).removeClass("ui-screen-hidden");var f=btnOffset-scrollTop,g=scrollTop+screenHeight-btnOffset,h=c/2,e= | |
parseFloat(b.list.parent().css("max-width")),c=f>c/2&&g>c/2?btnOffset+b.button.outerHeight()/2-h:f>g?scrollTop+screenHeight-c-30:scrollTop+30;d<e?e=(screenWidth-d)/2:(e=b.button.offset().left+b.button.outerWidth()/2-d/2,e<30?e=30:e+d>screenWidth&&(e=screenWidth-d-30));b.listbox.append(b.list).removeClass("ui-selectmenu-hidden").css({top:c,left:e}).addClass("in");b.list.find(a.mobile.activeBtnClass).focus();b.isOpen=true}}},_buildList:function(){var b=this,c=this.options,d=this.placeholder,f=[],e= | |
[],g=b.isMultiple?"checkbox-off":"false";b.list.empty().filter(".ui-listview").listview("destroy");b.select.find("option").each(function(h){var j=a(this),i=j.parent(),l=j.getEncodedText(),o="<a href='#'>"+l+"</a>",k=[],n=[];i.is("optgroup")&&(i=i.attr("label"),a.inArray(i,f)===-1&&(e.push("<li data-"+a.mobile.ns+"role='list-divider'>"+i+"</li>"),f.push(i)));if(!this.getAttribute("value")||l.length==0||j.jqmData("placeholder"))c.hidePlaceholderMenuItems&&k.push("ui-selectmenu-placeholder"),d=b.placeholder= | |
l;this.disabled&&(k.push("ui-disabled"),n.push("aria-disabled='true'"));e.push("<li data-"+a.mobile.ns+"option-index='"+h+"' data-"+a.mobile.ns+"icon='"+g+"' class='"+k.join(" ")+"' "+n.join(" ")+">"+o+"</li>")});b.list.html(e.join(" "));b.list.find("li").attr({role:"option",tabindex:"-1"}).first().attr("tabindex","0");this.isMultiple||this.headerClose.hide();!this.isMultiple&&!d.length?this.header.hide():this.headerTitle.text(this.placeholder);b.list.listview()},_button:function(){return a("<a>", | |
{href:"#",role:"button",id:this.buttonId,"aria-haspopup":"true","aria-owns":this.menuId})}})};a("select").live("selectmenubeforecreate",function(){var b=a(this).data("selectmenu");b.options.nativeMenu||e(b)})})(jQuery); | |
(function(a){a.widget("mobile.selectmenu",a.mobile.widget,{options:{theme:null,disabled:false,icon:"arrow-d",iconpos:"right",inline:null,corners:true,shadow:true,iconshadow:true,menuPageTheme:"b",overlayTheme:"a",hidePlaceholderMenuItems:true,closeText:"Close",nativeMenu:true,initSelector:"select:not(:jqmData(role='slider'))"},_button:function(){return a("<div/>")},_setDisabled:function(a){this.element.attr("disabled",a);this.button.attr("aria-disabled",a);return this._setOption("disabled",a)},_focusButton:function(){var a= | |
this;setTimeout(function(){a.button.focus()},40)},_selectOptions:function(){return this.select.find("option")},_preExtension:function(){this.select=this.element.wrap("<div class='ui-select'>");this.selectID=this.select.attr("id");this.label=a("label[for='"+this.selectID+"']").addClass("ui-select");this.isMultiple=this.select[0].multiple;if(!this.options.theme)this.options.theme=a.mobile.getInheritedTheme(this.select,"c")},_create:function(){this._preExtension();this._trigger("beforeCreate");this.button= | |
this._button();var e=this,b=this.options,c=this.button.text(a(this.select[0].options.item(this.select[0].selectedIndex==-1?0:this.select[0].selectedIndex)).text()).insertBefore(this.select).buttonMarkup({theme:b.theme,icon:b.icon,iconpos:b.iconpos,inline:b.inline,corners:b.corners,shadow:b.shadow,iconshadow:b.iconshadow});b.nativeMenu&&window.opera&&window.opera.version&&this.select.addClass("ui-select-nativeonly");if(this.isMultiple)this.buttonCount=a("<span>").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(c.addClass("ui-li-has-count")); | |
(b.disabled||this.element.attr("disabled"))&&this.disable();this.select.change(function(){e.refresh()});this.build()},build:function(){var e=this;this.select.appendTo(e.button).bind("vmousedown",function(){e.button.addClass(a.mobile.activeBtnClass)}).bind("focus vmouseover",function(){e.button.trigger("vmouseover")}).bind("vmousemove",function(){e.button.removeClass(a.mobile.activeBtnClass)}).bind("change blur vmouseout",function(){e.button.trigger("vmouseout").removeClass(a.mobile.activeBtnClass)}).bind("change blur", | |
function(){e.button.removeClass("ui-btn-down-"+e.options.theme)})},selected:function(){return this._selectOptions().filter(":selected")},selectedIndices:function(){var a=this;return this.selected().map(function(){return a._selectOptions().index(this)}).get()},setButtonText:function(){var e=this,b=this.selected();this.button.find(".ui-btn-text").text(function(){return!e.isMultiple?b.text():b.length?b.map(function(){return a(this).text()}).get().join(", "):e.placeholder})},setButtonCount:function(){var a= | |
this.selected();this.isMultiple&&this.buttonCount[a.length>1?"show":"hide"]().text(a.length)},refresh:function(){this.setButtonText();this.setButtonCount()},open:a.noop,close:a.noop,disable:function(){this._setDisabled(true);this.button.addClass("ui-disabled")},enable:function(){this._setDisabled(false);this.button.removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(e){a.mobile.selectmenu.prototype.enhanceWithin(e.target)})})(jQuery); | |
(function(a,e){function b(b){for(var c;b;){if((c=b.className&&b.className.split(" "))&&a.inArray("ui-btn",c)>-1&&a.inArray("ui-disabled",c)<0)break;b=b.parentNode}return b}a.fn.buttonMarkup=function(b){for(var b=b||{},d=0;d<this.length;d++){var g=this.eq(d),h=g[0],i=a.extend({},a.fn.buttonMarkup.defaults,{icon:b.icon!==e?b.icon:g.jqmData("icon"),iconpos:b.iconpos!==e?b.iconpos:g.jqmData("iconpos"),theme:b.theme!==e?b.theme:g.jqmData("theme"),inline:b.inline!==e?b.inline:g.jqmData("inline"),shadow:b.shadow!== | |
e?b.shadow:g.jqmData("shadow"),corners:b.corners!==e?b.corners:g.jqmData("corners"),iconshadow:b.iconshadow!==e?b.iconshadow:g.jqmData("iconshadow")},b),k="ui-btn-inner",m,q,o=document.createElement(i.wrapperEls),l=document.createElement(i.wrapperEls),j=i.icon?document.createElement("span"):null;c&&c();if(!i.theme)i.theme=a.mobile.getInheritedTheme(g,"c");m="ui-btn ui-btn-up-"+i.theme;i.inline&&(m+=" ui-btn-inline");if(i.icon)i.icon="ui-icon-"+i.icon,i.iconpos=i.iconpos||"left",q="ui-icon "+i.icon, | |
i.iconshadow&&(q+=" ui-icon-shadow");i.iconpos&&(m+=" ui-btn-icon-"+i.iconpos,i.iconpos=="notext"&&!g.attr("title")&&g.attr("title",g.getEncodedText()));i.corners&&(m+=" ui-btn-corner-all",k+=" ui-btn-corner-all");i.shadow&&(m+=" ui-shadow");g.attr("data-"+a.mobile.ns+"theme",i.theme).addClass(m);o.className=k;o.setAttribute("aria-hidden","true");l.className="ui-btn-text";o.appendChild(l);if(j)j.className=q,o.appendChild(j);for(;h.firstChild;)l.appendChild(h.firstChild);h.appendChild(o);g.data("textWrapper", | |
a(l))}return this};a.fn.buttonMarkup.defaults={corners:true,shadow:true,iconshadow:true,inline:false,wrapperEls:"span"};var c=function(){a(document).bind({vmousedown:function(c){var c=b(c.target),d;c&&(c=a(c),d=c.attr("data-"+a.mobile.ns+"theme"),c.removeClass("ui-btn-up-"+d).addClass("ui-btn-down-"+d))},"vmousecancel vmouseup":function(c){var c=b(c.target),d;c&&(c=a(c),d=c.attr("data-"+a.mobile.ns+"theme"),c.removeClass("ui-btn-down-"+d).addClass("ui-btn-up-"+d))},"vmouseover focus":function(c){var c= | |
b(c.target),d;c&&(c=a(c),d=c.attr("data-"+a.mobile.ns+"theme"),c.removeClass("ui-btn-up-"+d).addClass("ui-btn-hover-"+d))},"vmouseout blur":function(c){var c=b(c.target),d;c&&(c=a(c),d=c.attr("data-"+a.mobile.ns+"theme"),c.removeClass("ui-btn-hover-"+d+" ui-btn-down-"+d).addClass("ui-btn-up-"+d))}});c=null};a(document).bind("pagecreate create",function(b){a(":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a",b.target).not(".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')").buttonMarkup()})})(jQuery); | |
(function(a){a.fn.controlgroup=function(e){return this.each(function(){function b(a){a.removeClass("ui-btn-corner-all ui-shadow").eq(0).addClass(g[0]).end().filter(":last").addClass(g[1]).addClass("ui-controlgroup-last")}var c=a(this),f=a.extend({direction:c.jqmData("type")||"vertical",shadow:false,excludeInvisible:true},e),d=c.find(">legend"),g=f.direction=="horizontal"?["ui-corner-left","ui-corner-right"]:["ui-corner-top","ui-corner-bottom"];c.find("input:eq(0)").attr("type");d.length&&(c.wrapInner("<div class='ui-controlgroup-controls'></div>"), | |
a("<div role='heading' class='ui-controlgroup-label'>"+d.html()+"</div>").insertBefore(c.children(0)),d.remove());c.addClass("ui-corner-all ui-controlgroup ui-controlgroup-"+f.direction);b(c.find(".ui-btn"+(f.excludeInvisible?":visible":"")));b(c.find(".ui-btn-inner"));f.shadow&&c.addClass("ui-shadow")})};a(document).bind("pagecreate create",function(e){a(":jqmData(role='controlgroup')",e.target).controlgroup({excludeInvisible:false})})})(jQuery); | |
(function(a){a(document).bind("pagecreate create",function(e){a(e.target).find("a").not(".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')").addClass("ui-link")})})(jQuery); | |
(function(a,e){a.fn.fixHeaderFooter=function(){return!a.support.scrollTop||a.support.touchOverflow&&a.mobile.touchOverflowEnabled?this:this.each(function(){var b=a(this);b.jqmData("fullscreen")&&b.addClass("ui-page-fullscreen");b.find(".ui-header:jqmData(position='fixed')").addClass("ui-header-fixed ui-fixed-inline fade");b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixed-inline fade")})};a.mobile.fixedToolbars=function(){function b(){!i&&h==="overlay"&&(g||a.mobile.fixedToolbars.hide(true), | |
a.mobile.fixedToolbars.startShowTimer())}function c(a){var b=0,c,d;if(a){d=document.body;c=a.offsetParent;for(b=a.offsetTop;a&&a!=d;){b+=a.scrollTop||0;if(a==c)b+=c.offsetTop,c=a.offsetParent;a=a.parentNode}}return b}function f(b){var d=a(window).scrollTop(),e=c(b[0]),f=b.css("top")=="auto"?0:parseFloat(b.css("top")),g=window.innerHeight,h=b.outerHeight(),i=b.parents(".ui-page:not(.ui-page-fullscreen)").length;return b.is(".ui-header-fixed")?(f=d-e+f,f<e&&(f=0),b.css("top",i?f:d)):b.css("top",i?d+ | |
g-h-(e-f):d+g-h)}if(a.support.scrollTop&&(!a.support.touchOverflow||!a.mobile.touchOverflowEnabled)){var d,g,h="inline",i=false,k=null,m=false,q=true;a(function(){var c=a(document),d=a(window);c.bind("vmousedown",function(){q&&(k=h)}).bind("vclick",function(b){q&&!a(b.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length&&!m&&(a.mobile.fixedToolbars.toggle(k),k=null)}).bind("silentscroll",b);(c.scrollTop()===0?d:c).bind("scrollstart",function(){m=true;k=== | |
null&&(k=h);var b=k=="overlay";if(i=b||!!g)a.mobile.fixedToolbars.clearShowTimer(),b&&a.mobile.fixedToolbars.hide(true)}).bind("scrollstop",function(b){a(b.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length||(m=false,i&&(a.mobile.fixedToolbars.startShowTimer(),i=false),k=null)});d.bind("resize updatelayout",b)});a(".ui-page").live("pagebeforeshow",function(b,c){var e=a(b.target).find(":jqmData(role='footer')"),g=e.data("id"),h=c.prevPage,h=h&&h.find(":jqmData(role='footer')"), | |
h=h.length&&h.jqmData("id")===g;g&&h&&(d=e,f(d.removeClass("fade in out").appendTo(a.mobile.pageContainer)))}).live("pageshow",function(){var b=a(this);d&&d.length&&setTimeout(function(){f(d.appendTo(b).addClass("fade"));d=null},500);a.mobile.fixedToolbars.show(true,this)});a(".ui-collapsible-contain").live("collapse expand",b);return{show:function(b,d){a.mobile.fixedToolbars.clearShowTimer();h="overlay";return(d?a(d):a.mobile.activePage?a.mobile.activePage:a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var d= | |
a(this),e=a(window).scrollTop(),g=c(d[0]),h=window.innerHeight,i=d.outerHeight(),e=d.is(".ui-header-fixed")&&e<=g+i||d.is(".ui-footer-fixed")&&g<=e+h;d.addClass("ui-fixed-overlay").removeClass("ui-fixed-inline");!e&&!b&&d.animationComplete(function(){d.removeClass("in")}).addClass("in");f(d)})},hide:function(b){h="inline";return(a.mobile.activePage?a.mobile.activePage:a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var c=a(this), | |
d=c.css("top"),d=d=="auto"?0:parseFloat(d);c.addClass("ui-fixed-inline").removeClass("ui-fixed-overlay");if(d<0||c.is(".ui-header-fixed")&&d!==0)b?c.css("top",0):c.css("top")!=="auto"&&parseFloat(c.css("top"))!==0&&c.animationComplete(function(){c.removeClass("out reverse").css("top",0)}).addClass("out reverse")})},startShowTimer:function(){a.mobile.fixedToolbars.clearShowTimer();var b=[].slice.call(arguments);g=setTimeout(function(){g=e;a.mobile.fixedToolbars.show.apply(null,b)},100)},clearShowTimer:function(){g&& | |
clearTimeout(g);g=e},toggle:function(b){b&&(h=b);return h==="overlay"?a.mobile.fixedToolbars.hide():a.mobile.fixedToolbars.show()},setTouchToggleEnabled:function(a){q=a}}}}();a(document).bind("pagecreate create",function(b){a(":jqmData(position='fixed')",b.target).length&&a(b.target).each(function(){if(!a.support.scrollTop||a.support.touchOverflow&&a.mobile.touchOverflowEnabled)return this;var b=a(this);b.jqmData("fullscreen")&&b.addClass("ui-page-fullscreen");b.find(".ui-header:jqmData(position='fixed')").addClass("ui-header-fixed ui-fixed-inline fade"); | |
b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixed-inline fade")})})})(jQuery); | |
(function(a){a.mobile.touchOverflowEnabled=false;a.mobile.touchOverflowZoomEnabled=false;a(document).bind("pagecreate",function(e){a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&(e=a(e.target),e.is(":jqmData(role='page')")&&e.each(function(){var b=a(this),c=b.find(":jqmData(role='header'), :jqmData(role='footer')").filter(":jqmData(position='fixed')"),e=b.jqmData("fullscreen"),d=c.length?b.find(".ui-content"):b;b.addClass("ui-mobile-touch-overflow");d.bind("scrollstop",function(){d.scrollTop()> | |
0&&window.scrollTo(0,a.mobile.defaultHomeScroll)});c.length&&(b.addClass("ui-native-fixed"),e&&(b.addClass("ui-native-fullscreen"),c.addClass("fade in"),a(document).bind("vclick",function(){c.removeClass("ui-native-bars-hidden").toggleClass("in out").animationComplete(function(){a(this).not(".in").addClass("ui-native-bars-hidden")})})))}))})})(jQuery); | |
(function(a,e){function b(){var b=a("meta[name='viewport']");b.length?b.attr("content",b.attr("content")+", user-scalable=no"):a("head").prepend("<meta>",{name:"viewport",content:"user-scalable=no"})}var c=a("html");a("head");var f=a(e);a(e.document).trigger("mobileinit");if(a.mobile.gradeA()){if(a.mobile.ajaxBlacklist)a.mobile.ajaxEnabled=false;c.addClass("ui-mobile ui-mobile-rendering");var d=a("<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>"); | |
a.extend(a.mobile,{showPageLoadingMsg:function(){if(a.mobile.loadingMessage){var b=a("."+a.mobile.activeBtnClass).first();d.find("h1").text(a.mobile.loadingMessage).end().appendTo(a.mobile.pageContainer).css({top:a.support.scrollTop&&f.scrollTop()+f.height()/2||b.length&&b.offset().top||100})}c.addClass("ui-loading")},hidePageLoadingMsg:function(){c.removeClass("ui-loading")},initializePage:function(){var b=a(":jqmData(role='page')");b.length||(b=a("body").wrapInner("<div data-"+a.mobile.ns+"role='page'></div>").children(0)); | |
b.add(":jqmData(role='dialog')").each(function(){var b=a(this);b.jqmData("url")||b.attr("data-"+a.mobile.ns+"url",b.attr("id")||location.pathname+location.search)});a.mobile.firstPage=b.first();a.mobile.pageContainer=b.first().parent().addClass("ui-mobile-viewport");f.trigger("pagecontainercreate");a.mobile.showPageLoadingMsg();!a.mobile.hashListeningEnabled||!a.mobile.path.stripHash(location.hash)?a.mobile.changePage(a.mobile.firstPage,{transition:"none",reverse:true,changeHash:false,fromHashChange:true}): | |
f.trigger("hashchange",[true])}});a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&!a.mobile.touchOverflowZoomEnabled&&b();a.mobile._registerInternalEvents();a(function(){e.scrollTo(0,1);a.mobile.defaultHomeScroll=!a.support.scrollTop||a(e).scrollTop()===1?0:1;a.mobile.autoInitializePage&&a.mobile.initializePage();f.load(a.mobile.silentScroll)})}})(jQuery,this); | |