rhymix/modules/admin/tpl/js/theme.js
2011-08-03 08:33:57 +00:00

165 lines
4.6 KiB
JavaScript

jQuery(function($){
$('#theme,#skin')
// 'show all' button
.find('button.showAll')
.text('Show All')
.click(function(){
var $this = $(this), $thumbarea = $('#skin').find('>.thumbPreview');
if($this.toggleClass('hideAll').hasClass('hideAll')) {
$this.text('Hide All');
$thumbarea.children('li')
.addClass('active')
.removeClass('highlight')
.eq(0).addClass('highlight').end()
.find('>ul.a:not(.selected)').show();
} else {
$this.text('Show All');
$thumbarea.children('li')
.removeClass('active highlight')
.find('>ul.a:not(.selected)').hide();
}
})
.end()
// all thumbnail area
.find('>.thumbPreview')
.removeClass('jx')
// thumbnail list
.find('ul.a')
.hide()
.before('<ul class="a selected"></ul>')
.prev('ul.a')
.each(function(){
var $this = $(this);
$this
.delegate('span.thumb', 'click', function(){
$(this).closest('.a').nextAll('a.prevToggle:first').trigger('toggle.tp');
return false;
})
.append($this.next('.a').find('>li.noDirection:first'));
})
.end()
.after('<a href="#toggle-tp" class="prevToggle">Show</a>')
.next('a.prevToggle')
.bind('toggle.tp', function(){
var $list = $(this).prev('.a'), $items, duration = 100;
$items = $list.closest('.thumbPreview').children('li').removeClass('highlight').end();
if($list.parent().toggleClass('active').hasClass('active')) {
$list.slideDown(duration).closest('li').addClass('highlight');
} else {
$list.slideUp(duration);
}
})
.click(function(){ $(this).trigger('toggle.tp'); return false; })
.end()
// thumbnail act as a label for a radio button
.find('span.thumb')
.attr('role', 'radio') // WAI-ARIA role
.click(function(){
$(this).next('input:radio').prop('checked', true).change();
})
.end()
.find('> .i > label').attr('title', function(){ return $(this).text() }).end()
.find('input:radio')
.bind('redraw', function(){
var $this = $(this), $big = $this.closest('.a').prev('.a'), val = $this.val();
// skip following actions if this checkbox was selected just before
if(val == $big.find('>li:eq(1)').data('value')) return;
$big.find('>li:not(.noDirection)').remove();
if(!val) { // select none
$big.children('li.noDirection').show();
} else {
$this.closest('li').clone()
.find('input:radio').remove().end()
.find('label')
.wrapInner('<strong>')
.find('>strong')
.text(function(){ return $(this).attr('title') })
.unwrap()
.end()
.end()
.appendTo($big);
$big.find('>li.noDirection').hide();
}
})
.change(function(){
var $this = $(this);
$this.trigger('redraw');
// reselect theme
if($this.attr('name') != 'themeItem') {
$('#theme').trigger('select-theme');
}
})
.filter(':checked').change().end()
.filter('[name="themeItem"]')
.change(function(){
var $this = $(this), themes, thm, $radios, name;
themes = $('#theme').data('themes') || {};
thm = themes[$this.val()];
if(!thm) return;
$radios = $('#skin').find('.i > input:radio').filter('[value=""]').prop('checked', true).end();
for(var x in thm) {
if(!thm.hasOwnProperty(x)) continue;
name = (x == 'layout')?x:x+'-skin';
if(thm[x]) $radios.filter('[name="'+name+'"][value="'+thm[x]+'"]').prop('checked', true);
}
$radios.filter(':checked').trigger('redraw');
})
.end()
$('#theme')
.bind('select-theme', function(){
var $this = $(this), themes, $radios, form, selection, sel_obj={}, sel_str, name;
themes = $this.data('themes') || {};
$radios = $('#skin').find('.i > input:radio');
selection = $radios.filter(':checked[value!=""]').get();
form = $radios.get(0).form;
for(var i=0,c=selection.length; i < c; i++) {
name = selection[i].name.match(/^layout|(\w+)-skin$/);
sel_obj[name[1]||name[0]] = selection[i].value;
}
function obj2str(obj){
var s = '';
for(var x in obj) {
if(!obj.hasOwnProperty(x)) continue;
if(x != 'layout' && !form.elements[x+'-skin']) continue;
s += x+'\t'+obj[x]+'\n';
}
return s;
}
sel_str = obj2str(sel_obj);
// no matched theme => this theme is user-defined
for(var thm in themes) {
if(!themes.hasOwnProperty(thm)) continue;
if(sel_str == obj2str(themes[thm])) {
$this.find('input:radio[name="themeItem"][value="'+thm+'"]').prop('checked', true).change();
return;
}
}
$this.find('input:radio[name="themeItem"][value="user_define"]').prop('checked', true).change();
});
});