Added JQTouch and Zepto libraries
JQTouch and Zepto are tentatively used for the mobile version of Clipperz. No final commitment has been made, though.
This commit is contained in:
159
frontend/gamma/js/JQTouch/extensions/jqt.actionsheet.js
Normal file
159
frontend/gamma/js/JQTouch/extensions/jqt.actionsheet.js
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
|
||||
|
||||
(c) 2012 by jQTouch project members.
|
||||
See LICENSE.txt for license.
|
||||
|
||||
Author: Thomas Yip
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
|
||||
|
||||
(c) 2012 by jQTouch project members.
|
||||
See LICENSE.txt for license.
|
||||
|
||||
Author: Thomas Yip
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
var src = $("head script").last().attr("src") || '';
|
||||
var scriptpath = src.split('?')[0].split('/').slice(0, -1).join('/')+'/';
|
||||
var csspath = scriptpath + 'jqt.actionsheet.css';
|
||||
var link = $('<link href="' + csspath + '" rel="stylesheet">');
|
||||
$('head').append($(link));
|
||||
|
||||
function hide(callback) {
|
||||
var $target = $(this);
|
||||
var data = $(this).data('actionsheet');
|
||||
var $source = data.source;
|
||||
|
||||
var timeout;
|
||||
|
||||
function cleanup() {
|
||||
clearTimeout(timeout);
|
||||
|
||||
$source.removeClass('transition');
|
||||
$target.removeClass('inmotion transition');
|
||||
!callback || callback.apply(this, arguments);
|
||||
};
|
||||
timeout = setTimeout(cleanup, 500);
|
||||
|
||||
if (data.shown) {
|
||||
$(this).data('actionsheet', {});
|
||||
$target.one('webkitTransitionEnd', cleanup);
|
||||
|
||||
$source.addClass('transition');
|
||||
$target.removeClass('current').addClass('inmotion transition');
|
||||
$('#jqt').removeClass('actionopened');
|
||||
}
|
||||
return $target;
|
||||
}
|
||||
|
||||
function show(callback) {
|
||||
var $target = $(this);
|
||||
var data = $(this).data('actionsheet') || {};
|
||||
if (!data.shown) {
|
||||
var $source = $('#jqt .current:not(.actionsheet)');
|
||||
|
||||
$target.one('webkitTransitionEnd', function() {
|
||||
$source.removeClass('transition');
|
||||
$target.removeClass('inmotion transition');
|
||||
!callback || callback.apply(this, arguments);
|
||||
});
|
||||
|
||||
data.shown = true;
|
||||
data.source = $source;
|
||||
$(this).data('actionsheet', data);
|
||||
|
||||
$source.addClass('transition');
|
||||
$target.addClass('inmotion transition');
|
||||
$('#jqt').addClass('actionopened');
|
||||
setTimeout(function() {
|
||||
$target.addClass('current');
|
||||
}, 50);
|
||||
}
|
||||
return $target;
|
||||
}
|
||||
|
||||
var methods = {
|
||||
init: function(options) {
|
||||
$(this).addClass('actionsheet');
|
||||
$(this).data({shown: false});
|
||||
},
|
||||
show: show,
|
||||
hide: hide
|
||||
};
|
||||
|
||||
$.fn.actionsheet = function(method) {
|
||||
if (methods[method]) {
|
||||
if ($(this).is('.actionsheet')) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
} else {
|
||||
var msg = 'Target is not a `actionsheet`. Action `' + method + '` is ignored.';
|
||||
console.warn(msg);
|
||||
}
|
||||
} else if ( typeof method === 'object' || ! method ) {
|
||||
return methods.init.apply(this, arguments);
|
||||
} else {
|
||||
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
|
||||
}
|
||||
};
|
||||
|
||||
if ($.jQTouch) {
|
||||
$.jQTouch.addTapHandler({
|
||||
name: 'open-actionsheet',
|
||||
isSupported: function(e, params) {
|
||||
return params.$el.is('.action');
|
||||
},
|
||||
fn: function(e, params) {
|
||||
params.$el.removeClass('active');
|
||||
|
||||
var $target = $(params.hash);
|
||||
$target.actionsheet('show');
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$.jQTouch.addTapHandler({
|
||||
name: 'follow-actionlink',
|
||||
isSupported: function(e, params) {
|
||||
if ($('#jqt').hasClass('actionopened')) {
|
||||
return params.$el.is('.actionsheet a');
|
||||
}
|
||||
return false;
|
||||
},
|
||||
fn: function(e, params) {
|
||||
params.$el.removeClass('active');
|
||||
|
||||
var $target = params.$el.closest('.actionsheet');
|
||||
$target.actionsheet('hide', function() {
|
||||
if (!params.$el.is('.dismiss')) {
|
||||
params.$el.trigger('tap');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.error('Extension `jqt.actionsheet` failed to load. jQT not found');
|
||||
}
|
||||
})($);
|
||||
52
frontend/gamma/js/JQTouch/extensions/jqt.autotitles.js
Normal file
52
frontend/gamma/js/JQTouch/extensions/jqt.autotitles.js
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Created by David Kaneda <http://www.davidkaneda.com>
|
||||
Maintained by Thomas Yip <http://beedesk.com/>
|
||||
Sponsored by Sencha Labs <http://www.sencha.com/>
|
||||
Special thanks to Jonathan Stark <http://www.jonathanstark.com/>
|
||||
|
||||
Documentation and issue tracking on GitHub <http://github.com/senchalabs/jQTouch/>
|
||||
|
||||
(c) 2009-2011 Sencha Labs
|
||||
jQTouch may be freely distributed under the MIT license.
|
||||
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
if ($.jQTouch)
|
||||
{
|
||||
$.jQTouch.addExtension(function AutoTitles(jQT){
|
||||
|
||||
var titleSelector='.toolbar h1';
|
||||
|
||||
$(function(){
|
||||
$('#jqt').bind('pageAnimationStart', function(e, data){
|
||||
if (data.direction === 'in'){
|
||||
var $title = $(titleSelector, $(e.target));
|
||||
var $ref = $(e.target).data('referrer');
|
||||
if ($title.length && $ref && $title.text() === ''){
|
||||
$title.html($ref.text());
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function setTitleSelector(ts){
|
||||
titleSelector=ts;
|
||||
}
|
||||
|
||||
return {
|
||||
setTitleSelector: setTitleSelector
|
||||
};
|
||||
|
||||
});
|
||||
}
|
||||
})($);
|
||||
96
frontend/gamma/js/JQTouch/extensions/jqt.floaty.js
Normal file
96
frontend/gamma/js/JQTouch/extensions/jqt.floaty.js
Normal file
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Created by David Kaneda <http://www.davidkaneda.com>
|
||||
Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
|
||||
|
||||
Special thanks to Jonathan Stark <http://jonathanstark.com/>
|
||||
and pinch/zoom <http://www.pinchzoom.com/>
|
||||
|
||||
(c) 2009 by jQTouch project members.
|
||||
See LICENSE.txt for license.
|
||||
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
if ($.jQTouch)
|
||||
{
|
||||
$.jQTouch.addExtension(function Floaty(jQT){
|
||||
|
||||
$.fn.makeFloaty = function(options){
|
||||
var defaults = {
|
||||
align: 'top',
|
||||
spacing: 20,
|
||||
time: '.3s'
|
||||
};
|
||||
|
||||
var settings = $.extend({}, defaults, options);
|
||||
|
||||
settings.align = (settings.align == 'top') ? 'top' : 'bottom';
|
||||
|
||||
return this.each(function(){
|
||||
var $el = $(this);
|
||||
|
||||
$el.css({
|
||||
'-webkit-transition': 'top ' + settings.time + ' ease-in-out',
|
||||
'display': 'block',
|
||||
'min-height': '0 !important'
|
||||
}).data('settings', settings);
|
||||
|
||||
$(document).scroll(function(){
|
||||
if ($el.data('floatyVisible') === 'true')
|
||||
{
|
||||
$el.scrollFloaty();
|
||||
}
|
||||
});
|
||||
$el.scrollFloaty();
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.scrollFloaty = function(){
|
||||
|
||||
|
||||
return this.each(function(){
|
||||
var $el = $(this);
|
||||
var settings = $el.data('settings'); // Settings not being set as object w/Zepto
|
||||
var wHeight = $('html').attr('clientHeight'); // WRONG
|
||||
|
||||
var newY = window.pageYOffset +
|
||||
((settings.align == 'top') ?
|
||||
settings.spacing : wHeight - settings.spacing - $el.get(0).offsetHeight);
|
||||
|
||||
$el.css('top', newY).data('floatyVisible', true);
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.hideFloaty = function(){
|
||||
return this.each(function(){
|
||||
var $el = $(this);
|
||||
var oh = $el.get(0).offsetHeight;
|
||||
|
||||
$el.css('top', -oh-10).data('floatyVisible', false);
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.toggleFloaty = function(){
|
||||
return this.each(function(){
|
||||
var $el = $(this);
|
||||
if ($el.data('floatyVisible') === 'true'){
|
||||
$el.hideFloaty();
|
||||
}
|
||||
else
|
||||
{
|
||||
$el.scrollFloaty();
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
})($);
|
||||
51
frontend/gamma/js/JQTouch/extensions/jqt.location.js
Normal file
51
frontend/gamma/js/JQTouch/extensions/jqt.location.js
Normal file
@@ -0,0 +1,51 @@
|
||||
(function($) {
|
||||
if ($.jQTouch)
|
||||
{
|
||||
$.jQTouch.addExtension(function Location(){
|
||||
|
||||
var latitude, longitude, callback, callback2;
|
||||
|
||||
function updateLocation(fn, fn2) {
|
||||
if (navigator.geolocation)
|
||||
{
|
||||
callback = fn;
|
||||
callback2 = fn2;
|
||||
navigator.geolocation.getCurrentPosition(savePosition, failResponse);
|
||||
return true;
|
||||
} else {
|
||||
console.log('Device not capable of geo-location.');
|
||||
fn(false);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function failResponse(error){
|
||||
if (callback2) {
|
||||
callback2(error);
|
||||
}
|
||||
}
|
||||
function savePosition(position) {
|
||||
latitude = position.coords.latitude;
|
||||
longitude = position.coords.longitude;
|
||||
if (callback) {
|
||||
callback(getLocation());
|
||||
}
|
||||
}
|
||||
function getLocation() {
|
||||
if (latitude && longitude) {
|
||||
return {
|
||||
latitude: latitude,
|
||||
longitude: longitude
|
||||
};
|
||||
|
||||
} else {
|
||||
console.log('No location available. Try calling updateLocation() first.');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return {
|
||||
updateLocation: updateLocation,
|
||||
getLocation: getLocation
|
||||
};
|
||||
});
|
||||
}
|
||||
})($);
|
||||
137
frontend/gamma/js/JQTouch/extensions/jqt.menusheet.js
Normal file
137
frontend/gamma/js/JQTouch/extensions/jqt.menusheet.js
Normal file
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
|
||||
|
||||
(c) 2012 by jQTouch project members.
|
||||
See LICENSE.txt for license.
|
||||
|
||||
Author: Thomas Yip
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
var src = $("head script").last().attr("src") || '';
|
||||
var scriptpath = src.split('?')[0].split('/').slice(0, -1).join('/')+'/';
|
||||
var csspath = scriptpath + 'jqt.menusheet.css';
|
||||
var link = $('<link href="' + csspath + '" rel="stylesheet">');
|
||||
$('head').append($(link));
|
||||
|
||||
function hide(callback) {
|
||||
var $target = $(this);
|
||||
var data = $(this).data('menusheet');
|
||||
if (data.shown) {
|
||||
$(this).data('menusheet', {});
|
||||
var $source = data.source;
|
||||
$source.unbind('touchstart mousedown', data.closehandler);
|
||||
$source.one('webkitTransitionEnd', function() {
|
||||
$source.removeClass('inmotion transition in');
|
||||
$target.removeClass('inmotion out');
|
||||
!callback || callback.apply(this, arguments);
|
||||
});
|
||||
|
||||
$source.addClass('inmotion transition in');
|
||||
$target.addClass('inmotion out').removeClass('current');
|
||||
$('#jqt').removeClass('menuopened');
|
||||
}
|
||||
return $target;
|
||||
}
|
||||
|
||||
function show(callback) {
|
||||
var $target = $(this);
|
||||
var data = $(this).data('menusheet') || {};
|
||||
if (!data.shown) {
|
||||
var $source = $('#jqt .current:not(.menusheet)');
|
||||
var closehandler = function() {
|
||||
$target.menusheet('hide');
|
||||
return false;
|
||||
};
|
||||
|
||||
$source.one('webkitTransitionEnd', function() {
|
||||
$source.one('touchstart mousedown', closehandler);
|
||||
$source.removeClass('inmotion transition out');
|
||||
$target.removeClass('inmotion in');
|
||||
!callback || callback.apply(this, arguments);
|
||||
});
|
||||
|
||||
data.shown = true;
|
||||
data.closehandler = closehandler;
|
||||
data.source = $source;
|
||||
$(this).data('menusheet', data);
|
||||
|
||||
$source.addClass('inmotion transition out');
|
||||
$target.addClass('current in');
|
||||
$('#jqt').addClass('menuopened');
|
||||
}
|
||||
return $target;
|
||||
}
|
||||
|
||||
var methods = {
|
||||
init: function(options) {
|
||||
$(this).addClass('menusheet');
|
||||
$(this).data({shown: false});
|
||||
},
|
||||
show: show,
|
||||
hide: hide
|
||||
};
|
||||
|
||||
$.fn.menusheet = function(method) {
|
||||
if (methods[method]) {
|
||||
if ($(this).is('.menusheet')) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
} else {
|
||||
var msg = 'Target is not a `menusheet`. Action `' + method + '` is ignored.';
|
||||
console.warn(msg);
|
||||
}
|
||||
} else if ( typeof method === 'object' || ! method ) {
|
||||
return methods.init.apply(this, arguments);
|
||||
} else {
|
||||
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
|
||||
}
|
||||
};
|
||||
|
||||
if ($.jQTouch) {
|
||||
$.jQTouch.addTapHandler({
|
||||
name: 'open-menusheet',
|
||||
isSupported: function(e, params) {
|
||||
return params.$el.is('.menu');
|
||||
},
|
||||
fn: function(e, params) {
|
||||
params.$el.removeClass('active');
|
||||
|
||||
var $target = $(params.hash);
|
||||
$target.menusheet('show');
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
$.jQTouch.addTapHandler({
|
||||
name: 'follow-menulink',
|
||||
isSupported: function(e, params) {
|
||||
if ($('#jqt').hasClass('menuopened')) {
|
||||
return params.$el.is('.menusheet a');
|
||||
}
|
||||
return false;
|
||||
},
|
||||
fn: function(e, params) {
|
||||
params.$el.removeClass('active');
|
||||
|
||||
var $target = params.$el.closest('.menusheet');
|
||||
$target.menusheet('hide', function() {
|
||||
if (!params.$el.is('.dismiss')) {
|
||||
params.$el.trigger('tap');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.error('Extension `jqt.menusheet` failed to load. jQT not found');
|
||||
}
|
||||
})($);
|
||||
97
frontend/gamma/js/JQTouch/extensions/jqt.offline.js
Normal file
97
frontend/gamma/js/JQTouch/extensions/jqt.offline.js
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Created by David Kaneda <http://www.davidkaneda.com>
|
||||
Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
|
||||
|
||||
Special thanks to Jonathan Stark <http://jonathanstark.com/>
|
||||
|
||||
Lots of this code is specifically derived from Jonathan's book,
|
||||
"Building iPhone Apps with HTML, CSS, and JavaScript"
|
||||
|
||||
(c) 2009 by jQTouch project members.
|
||||
See LICENSE.txt for license.
|
||||
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
if ($.jQTouch)
|
||||
{
|
||||
$.jQTouch.addExtension(function Offline(){
|
||||
|
||||
// Convenience array of status values
|
||||
var cacheStatusValues = [];
|
||||
cacheStatusValues[0] = 'uncached';
|
||||
cacheStatusValues[1] = 'idle';
|
||||
cacheStatusValues[2] = 'checking';
|
||||
cacheStatusValues[3] = 'downloading';
|
||||
cacheStatusValues[4] = 'updateready';
|
||||
cacheStatusValues[5] = 'obsolete';
|
||||
|
||||
// Listeners for all possible events
|
||||
var cache = window.applicationCache;
|
||||
cache.addEventListener('cached', logEvent, false);
|
||||
cache.addEventListener('checking', logEvent, false);
|
||||
cache.addEventListener('downloading', logEvent, false);
|
||||
cache.addEventListener('error', logEvent, false);
|
||||
cache.addEventListener('noupdate', logEvent, false);
|
||||
cache.addEventListener('obsolete', logEvent, false);
|
||||
cache.addEventListener('progress', logEvent, false);
|
||||
cache.addEventListener('updateready', logEvent, false);
|
||||
|
||||
// Log every event to the console
|
||||
function logEvent(e) {
|
||||
var online, status, type, message;
|
||||
online = (isOnline()) ? 'yes' : 'no';
|
||||
status = cacheStatusValues[cache.status];
|
||||
type = e.type;
|
||||
message = 'online: ' + online;
|
||||
message+= ', event: ' + type;
|
||||
message+= ', status: ' + status;
|
||||
if (type == 'error' && navigator.onLine) {
|
||||
message+= ' There was an unknown error, check your Cache Manifest.';
|
||||
}
|
||||
console.log(message);
|
||||
}
|
||||
|
||||
function isOnline() {
|
||||
return navigator.onLine;
|
||||
}
|
||||
|
||||
if (!$('html').attr('manifest')) {
|
||||
console.log('No Cache Manifest listed on the <html> tag.')
|
||||
}
|
||||
|
||||
// Swap in newly download files when update is ready
|
||||
cache.addEventListener('updateready', function(e){
|
||||
// Don't perform "swap" if this is the first cache
|
||||
if (cacheStatusValues[cache.status] != 'idle') {
|
||||
cache.swapCache();
|
||||
console.log('Swapped/updated the Cache Manifest.');
|
||||
}
|
||||
}
|
||||
, false);
|
||||
|
||||
// These two functions check for updates to the manifest file
|
||||
function checkForUpdates(){
|
||||
cache.update();
|
||||
}
|
||||
function autoCheckForUpdates(){
|
||||
setInterval(function(){cache.update()}, 10000);
|
||||
}
|
||||
|
||||
return {
|
||||
isOnline: isOnline,
|
||||
checkForUpdates: checkForUpdates,
|
||||
autoCheckForUpdates: autoCheckForUpdates
|
||||
}
|
||||
});
|
||||
}
|
||||
})(jQuery);
|
||||
123
frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js
Executable file
123
frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js
Executable file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
|
||||
_/ _/_/ _/_/_/_/_/ _/
|
||||
_/ _/ _/ _/_/ _/ _/ _/_/_/ _/_/_/
|
||||
_/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/
|
||||
_/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ _/ _/
|
||||
_/
|
||||
_/
|
||||
|
||||
Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
|
||||
|
||||
(c) 2011 by jQTouch project members.
|
||||
See LICENSE.txt for license.
|
||||
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
if ($.jQTouch) {
|
||||
|
||||
var scriptpath = $("script").last().attr("src").split('?')[0].split('/').slice(0, -1).join('/')+'/';
|
||||
|
||||
$.jQTouch.addExtension(function ThemeSwitcher(jQT) {
|
||||
|
||||
var current,
|
||||
link,
|
||||
titles = {},
|
||||
defaults = {
|
||||
themeStyleSelector: 'link[rel="stylesheet"][title]',
|
||||
themeIncluded: [
|
||||
{title: 'jQTouch', href: scriptpath + '../themes/css/jqtouch.css'},
|
||||
{title: 'Apple', href: scriptpath + '../themes/css/apple.css'},
|
||||
{title: 'Vanilla', href: scriptpath + '../themes/css/vanilla.css'}
|
||||
|
||||
]
|
||||
},
|
||||
options = $.extend({}, defaults, jQT.settings);
|
||||
|
||||
function setStyleState(item, title) {
|
||||
var $item = $(item);
|
||||
|
||||
if ($item.attr('title') === title) {
|
||||
item.disabled = false; // workaround for Firefox on Zepto
|
||||
$item.removeAttr('disabled');
|
||||
} else {
|
||||
item.disabled = true; // workaround for Firefox on Zepto
|
||||
$item.attr('disabled', true);
|
||||
}
|
||||
}
|
||||
|
||||
function initializeStyleState(item, title) {
|
||||
// and, workaround for WebKit by initializing the 'disabled' attribute
|
||||
if (!current) {
|
||||
current = title;
|
||||
}
|
||||
setStyleState(item, current);
|
||||
}
|
||||
|
||||
// public
|
||||
function switchStyle(title) {
|
||||
current = title;
|
||||
$(options.themeStyleSelector).each(function(i, item) {
|
||||
setStyleState(item, title);
|
||||
});
|
||||
}
|
||||
|
||||
// collect title names, from <head>
|
||||
$(options.themeStyleSelector).each(function(i, item) {
|
||||
var $item = $(item);
|
||||
var title = $item.attr('title');
|
||||
|
||||
titles[title] = true;
|
||||
|
||||
initializeStyleState(item, title);
|
||||
});
|
||||
|
||||
// add included theme
|
||||
for (var i=0; i < options.themeIncluded.length; i++) {
|
||||
var hash = options.themeIncluded[i];
|
||||
if (!(hash.title in titles)) {
|
||||
link = $('<link title="' + hash.title + '" href="' + hash.href + '" rel="stylesheet">');
|
||||
$('head').append($(link));
|
||||
|
||||
titles[hash.title] = true;
|
||||
|
||||
initializeStyleState(link, hash.title);
|
||||
}
|
||||
}
|
||||
|
||||
if (options.themeSelectionSelector) {
|
||||
// create UI items
|
||||
for (var title in titles) {
|
||||
var $item = $('<li><a href="#" data-title="' + title + '">' + title + '</a></li>');
|
||||
$(options.themeSelectionSelector).append($item);
|
||||
}
|
||||
|
||||
// bind to UI items
|
||||
$(options.themeSelectionSelector).delegate('* > a', 'tap', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
var $a = $(this).closest('a');
|
||||
$a.removeClass('active');
|
||||
switchStyle($a.attr('data-title'));
|
||||
|
||||
// poor-man simulation of radio button behaviour
|
||||
$(options.themeSelectionSelector).find('a').removeClass('selected');
|
||||
$a.addClass('selected');
|
||||
});
|
||||
|
||||
// poor-man simulation of radio button behaviour
|
||||
$(options.themeSelectionSelector).closest('#jqt > *').bind('pageAnimationEnd', function(e, data){
|
||||
if (data.direction === 'in') {
|
||||
$(options.themeSelectionSelector).find('a[data-title="' + current + '"]').addClass('selected');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {switchStyle: switchStyle};
|
||||
|
||||
});
|
||||
}
|
||||
})($);
|
||||
Reference in New Issue
Block a user