Diffstat (limited to 'frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js') (more/less context) (ignore whitespace changes)
-rwxr-xr-x | frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js b/frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js new file mode 100755 index 0000000..ef3a75d --- a/dev/null +++ b/frontend/gamma/js/JQTouch/extensions/jqt.themeswitcher.js @@ -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}; + + }); + } +})($); |