      1 // The Antville Project
      2 // http://code.google.com/p/antville
      3 //
      4 // Copyright 2007-2011 by Tobi Schäfer.
      5 //
      6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer,
      7 // Matthias & Michael Platzer, Christoph Lincke.
      8 //
      9 // Licensed under the Apache License, Version 2.0 (the ``License'');
     10 // you may not use this file except in compliance with the License.
     11 // You may obtain a copy of the License at
     12 //
     13 //    http://www.apache.org/licenses/LICENSE-2.0
     14 //
     15 // Unless required by applicable law or agreed to in writing, software
     16 // distributed under the License is distributed on an ``AS IS'' BASIS,
     17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18 // See the License for the specific language governing permissions and
     19 // limitations under the License.
     20 //
     21 // $Revision$
     22 // $LastChangedBy$
     23 // $LastChangedDate$
     24 // $URL$
     25
     26 /**
     27  * @fileOverview Defines the Skins prototype.
     28  */
     29
     30 markgettext("Skins");
     31 markgettext("skins");
     32
     33 /**
     34  * @name Skins
     35  * @constructor
     36  * @param {String} name
     37  * @param {Skins} parent
     38  * @property {Skin[]} _children
     39  * @property {Skin[]} custom
     40  * @property {Skin[]} modified
     41  * @property {String} name
     42  * @property {Skins} parent
     43  * @extends HopObject
     44  */
     45 Skins.prototype.constructor = function(name, parent) {
     46   this.name = name;
     47   this.parent = parent;
     48   return this;
     49 }
     50
     51 /**
     52  *
     53  * @param {String} action
     54  * @returns {Boolean}
     55  */
     56 Skins.prototype.getPermission = function(action) {
     57    return res.handlers.layout.getPermission("main");
     58 }
     59
     60 /**
     61  *
     62  * @param {String} name
     63  * @returns {Skins|Skin}
     64  */
     65 Skins.prototype.getChildElement = function(name) {
     66    if (this.parent) {
     67       var group = path[path.length - 1].name;
     68       var skin = this.getSkin(group, name);
     69       if (skin) {
     70          return skin;
     71       }
     72       if (global[group] || group === "Global") {
     73          return this.getSkin(group, name);
     74       }
     75    }
     76    return new Skins(name, this);
     77 }
     78
     79 Skins.prototype.onRequest = function() {
     80    if (this.parent) {
     81       res.redirect(res.handlers.layout.skins.href(req.action));
     82    }
     83    return HopObject.prototype.onRequest.call(this);
     84 }
     85
     86 Skins.prototype.main_action = function() {
     87    res.data.title = gettext("Basic Skins");
     88    res.data.body = this.renderSkinAsString("$Skins#main");
     89    res.handlers.site.renderSkin("Site#page");
     90    return;
     91 }
     92
     93 Skins.prototype.create_action = function() {
     94    if (req.postParams.save) {
     95       try {
     96          var prototype = req.postParams.prototype;
     97          var name = stripTags(req.postParams.name);
     98          if (!prototype || !req.postParams.name) {
     99             throw Error(gettext("Please choose a prototype and enter a skin name"));
    100          } else if (name !== req.postParams.name || /\s/.test(name) || NAMEPATTERN.test(name)) {
    101             throw Error(gettext("Please avoid special characters or HTML code in the name field."));
    102          } else if (Skin.getByName(prototype, name)) {
    103             throw Error("Sorry, there is already a skin with that name. Please enter a different one.");
    104          }
    105          var skin = this.getSkin(prototype, name);
    106          skin.update(req.postParams);
    107          res.message = gettext("The changes were saved successfully.");
    108          if (req.postParams.save == 1) {
    109             res.redirect(skin.href("edit"));
    110          } else {
    111             res.redirect(res.handlers.layout.skins.href("modified"));
    112          }
    113       } catch (ex) {
    114          res.message = ex;
    115          app.log(ex);
    116       }
    117    }
    118    res.data.title = gettext('Add Skin');
    119    res.data.action = this.href(req.action);
    120    HopObject.confirmConstructor(Skin);
    121    res.data.body = (new Skin).renderSkinAsString("$Skin#edit");
    122    this.renderSkin("$Skins#page");
    123    return;
    124 }
    125
    126 Skins.prototype.modified_action = function() {
    127    res.data.title = gettext("Modified Skins");
    128    res.push();
    129    this.renderSkin("$Skins#header");
    130    this.modified.forEach(function() {
    131       this.renderSkin("$Skin#listItem");
    132    });
    133    res.data.body = res.pop();
    134    res.handlers.site.renderSkin("Site#page");
    135    return;
    136 }
    137
    138 Skins.prototype.all_action = function() {
    139    if (this.parent) {
    140       res.redirect(res.handlers.layout.skins.href(req.action));
    141    }
    142    res.data.list = this.getOutline();
    143    res.data.title = gettext("All Skins");
    144    res.data.body = this.renderSkinAsString("$Skins#all");
    145    res.handlers.site.renderSkin("Site#page");
    146    return;
    147 }
    148
    149 Skins.prototype.safe_action = function() {
    150    res.data.title = gettext("Modified Skins");
    151    res.push();
    152    this.modified.forEach(function() {
    153       this.renderSkin("$Skin#listItem");
    154    });
    155    res.data.title = "Modified Skins";
    156    res.data.body = res.pop();
    157    this.renderSkin("$Skins#page");
    158    return;
    159 }
    160
    161 /**
    162  *
    163  * @param {String} group
    164  * @param {String} name
    165  * @returns {Skin}
    166  */
    167 Skins.prototype.getSkin = function(group, name) {
    168    return Skin.getByName(group, name) || new Skin(group, name);
    169 }
    170
    171 /**
    172  *
    173  * @returns {String}
    174  */
    175 Skins.prototype.getOutline = function() {
    176    var skinfiles, prototype, skin, subskins, names, skins = [];
    177    var options = Skin.getPrototypeOptions();
    178
    179    for each (var option in options) {
    180       names = [];
    181       prototype = option.value;
    182       skinfiles = app.getSkinfilesInPath(res.skinpath);
    183       skin = createSkin(skinfiles[prototype][prototype]);
    184       subskins = skin.getSubskinNames();
    185       for each (var subskin in subskins) {
    186          names.push(subskin);
    187       }
    188       names.sort();
    189       skins.push([prototype, names]);
    190    }
    191
    192    res.push();
    193    for each (var item in skins) {
    194       prototype = item[0];
    195       skin = item[1];
    196       if (skin && skin.length > 0) {
    197          html.openTag("li");
    198          html.openTag("a", {href: "#" + prototype});
    199          res.write(prototype);
    200          html.closeTag("a");
    201          html.openTag("ul");
    202          for each (var name in skin) {
    203             subskin = this.getSkin(prototype, name);
    204             html.openTag("li");
    205             html.link({href: subskin.href("edit")},
    206                   subskin.prototype + "." + subskin.name);
    207             html.closeTag("li");
    208          }
    209          html.closeTag("ul");
    210          html.closeTag("li");
    211       }
    212    }
    213    return res.pop();
    214 }
    215