239 lines
8 KiB
Perl
239 lines
8 KiB
Perl
# This code was forked from the LiveJournal project owned and operated
|
|
# by Live Journal, Inc. The code has been modified and expanded by
|
|
# Dreamwidth Studios, LLC. These files were originally licensed under
|
|
# the terms of the license supplied by Live Journal, Inc, which can
|
|
# currently be found at:
|
|
#
|
|
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
|
|
#
|
|
# In accordance with the original license, this code and all its
|
|
# modifications are provided under the GNU General Public License.
|
|
# A copy of that license can be found in the LICENSE file included as
|
|
# part of this distribution.
|
|
|
|
package LJ::Widget::CustomizeTheme;
|
|
|
|
use strict;
|
|
use base qw(LJ::Widget);
|
|
use Carp qw(croak);
|
|
use LJ::Customize;
|
|
|
|
sub authas { 1 }
|
|
sub need_res { qw( stc/widgets/customizetheme.css ) }
|
|
|
|
sub render_body {
|
|
my $class = shift;
|
|
my %opts = @_;
|
|
|
|
my $u = $class->get_effective_remote();
|
|
die "Invalid user." unless LJ::isu($u);
|
|
|
|
my $remote = LJ::get_remote();
|
|
my $getextra = $u->user ne $remote->user ? "?authas=" . $u->user : "";
|
|
my $getsep = $getextra ? "&" : "?";
|
|
|
|
my $headextra = $opts{headextra};
|
|
my $group = $opts{group} ? $opts{group} : "display";
|
|
|
|
my $style = LJ::S2::load_style( $u->prop('s2_style') );
|
|
die "Style not found." unless $style && $style->{userid} == $u->id;
|
|
|
|
my $nav_class = sub {
|
|
my $g = shift;
|
|
my $classes = "";
|
|
|
|
if ( $g eq $group ) {
|
|
$classes .= " class='on";
|
|
$classes .= "'";
|
|
}
|
|
|
|
return $classes;
|
|
};
|
|
|
|
my $propgroup_name = sub {
|
|
my $prop = shift;
|
|
return LJ::Customize->propgroup_name( $prop, $u, $style );
|
|
};
|
|
|
|
my %groups = LJ::Customize->get_propgroups( $u, $style );
|
|
my $group_names = $groups{groups};
|
|
my %has_group = map { $_ => 1 } @$group_names;
|
|
|
|
my $vars = {
|
|
style => $style,
|
|
u => $u,
|
|
groups => \%groups,
|
|
has_group => \%has_group,
|
|
propgroup_name => $propgroup_name,
|
|
nav_class => $nav_class,
|
|
group_names => $group_names,
|
|
group => $group,
|
|
};
|
|
|
|
# Display Group
|
|
if ( $group eq "display" ) {
|
|
my $mood_theme_chooser = LJ::Widget::MoodThemeChooser->new;
|
|
$$headextra .= $mood_theme_chooser->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
my $nav_strip_chooser = LJ::Widget::NavStripChooser->new;
|
|
$$headextra .= $nav_strip_chooser->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{mood_theme_chooser} = $mood_theme_chooser->render;
|
|
$vars->{nav_strip_chooser} = $nav_strip_chooser->render;
|
|
}
|
|
|
|
# Presentation Group
|
|
elsif ( $group eq "presentation" ) {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} = $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => "presentation",
|
|
groupprops => $groups{groupprops}->{presentation},
|
|
show_lang_chooser => 0,
|
|
);
|
|
}
|
|
|
|
# Colors Group
|
|
elsif ( $group eq "colors" ) {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} = $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => "colors",
|
|
groupprops => $groups{groupprops}->{colors},
|
|
);
|
|
}
|
|
|
|
# Fonts Group
|
|
elsif ( $group eq "fonts" ) {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} = $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => "fonts",
|
|
groupprops => $groups{groupprops}->{fonts},
|
|
);
|
|
|
|
}
|
|
|
|
# Images Group
|
|
elsif ( $group eq "images" ) {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} .= $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => "images",
|
|
groupprops => $groups{groupprops}->{images},
|
|
);
|
|
}
|
|
|
|
# Text Group
|
|
elsif ( $group eq "text" ) {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} = $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => "text",
|
|
groupprops => $groups{groupprops}->{text},
|
|
);
|
|
}
|
|
|
|
# Links List Group
|
|
elsif ( $group eq "linkslist" ) {
|
|
$vars->{linkslist} = LJ::Widget::LinksList->render( post => $opts{post} );
|
|
}
|
|
|
|
# Custom CSS Group
|
|
elsif ( $group eq "customcss" ) {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} = $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => "customcss",
|
|
groupprops => $groups{groupprops}->{customcss},
|
|
);
|
|
}
|
|
|
|
# Other Groups
|
|
else {
|
|
my $s2_propgroup = LJ::Widget::S2PropGroup->new;
|
|
$$headextra .= $s2_propgroup->wrapped_js( page_js_obj => "Customize" );
|
|
|
|
$vars->{s2_propgroup} = $s2_propgroup->render(
|
|
props => $groups{props},
|
|
propgroup => $group,
|
|
groupprops => $groups{groupprops}->{$group},
|
|
);
|
|
}
|
|
|
|
return DW::Template->template_string( 'widget/customizetheme.tt', $vars );
|
|
}
|
|
|
|
sub js {
|
|
q [
|
|
initWidget: function () {
|
|
var self = this;
|
|
|
|
// confirmation when reseting the form
|
|
DOM.addEventListener($('reset_btn_top'), "click", function (evt) { self.confirmReset(evt) });
|
|
DOM.addEventListener($('reset_btn_bottom'), "click", function (evt) { self.confirmReset(evt) });
|
|
|
|
self.form_changed = false;
|
|
|
|
// capture onclicks on the nav links to confirm form saving
|
|
var links = $('customize_theme_nav_links').getElementsByTagName('a');
|
|
for (var i = 0; i < links.length; i++) {
|
|
if (links[i].href != "") {
|
|
DOM.addEventListener(links[i], "click", function (evt) { self.navclick_save(evt) })
|
|
}
|
|
}
|
|
|
|
// register all form changes to confirm them later
|
|
var selects = $('customize-form').getElementsByTagName('select');
|
|
for (var i = 0; i < selects.length; i++) {
|
|
DOM.addEventListener(selects[i], "change", function (evt) { self.form_change() });
|
|
}
|
|
var inputs = $('customize-form').getElementsByTagName('input');
|
|
for (var i = 0; i < inputs.length; i++) {
|
|
DOM.addEventListener(inputs[i], "change", function (evt) { self.form_change() });
|
|
}
|
|
var textareas = $('customize-form').getElementsByTagName('textarea');
|
|
for (var i = 0; i < textareas.length; i++) {
|
|
DOM.addEventListener(textareas[i], "change", function (evt) { self.form_change() });
|
|
}
|
|
},
|
|
confirmReset: function (evt) {
|
|
if (! confirm("Are you sure you want to reset all changes on this page to their defaults?")) {
|
|
Event.stop(evt);
|
|
}
|
|
},
|
|
navclick_save: function (evt) {
|
|
var confirmed = false;
|
|
if (this.form_changed == false) {
|
|
return true;
|
|
} else {
|
|
confirmed = confirm("Save your changes?");
|
|
}
|
|
|
|
if (confirmed) {
|
|
$('customize-form').submit();
|
|
}
|
|
},
|
|
form_change: function () {
|
|
if (this.form_changed == true) { return; }
|
|
this.form_changed = true;
|
|
},
|
|
onRefresh: function (data) {
|
|
this.initWidget();
|
|
}
|
|
];
|
|
}
|
|
|
|
1;
|