      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 // $Author$
     23 // $Date$
     24 // $URL$
     25
     26 /**
     27  * @fileOverview Defines the Images prototype
     28  */
     29
     30 markgettext("Images");
     31 markgettext("images");
     32
     33 /**
     34  * @name Images
     35  * @constructor
     36  * @property {Image} _children
     37  * @property {Tag[]} alphabeticalGalleries
     38  * @property {Tag[]} galleries
     39  * @property {Tag[]} otherGalleries
     40  * @extends HopObject
     41  */
     42
     43 /**
     44  *
     45  * @param {String} action
     46  * @returns {Boolean}
     47  */
     48 Images.prototype.getPermission = function(action) {
     49    if (!this._parent.getPermission("main")) {
     50       return false;
     51    }
     52    switch (action) {
     53       case ".":
     54       case "main":
     55       case "create":
     56       // FIXME: case "tags":
     57       return Site.require(Site.OPEN) && session.user ||
     58             Membership.require(Membership.CONTRIBUTOR) ||
     59             User.require(User.PRIVILEGED);
     60       case "all":
     61       return this._parent.constructor !== Layout &&
     62             (Membership.require(Membership.MANAGER) ||
     63             User.require(User.PRIVILEGED));
     64    }
     65    return false;
     66 }
     67
     68 Images.prototype.main_action = function() {
     69    var images, skin;
     70    switch (this._parent.constructor) {
     71       case Root:
     72       case Site:
     73       images = User.getMembership().images;
     74       skin = "$Images#main";
     75       res.data.title = gettext("Member Images");
     76       break;
     77
     78       case Layout:
     79       images = res.handlers.layout.images;
     80       skin = "$Images#layout";
     81       res.data.title = gettext("Layout Images");
     82       break;
     83    }
     84    res.data.list = renderList(images, "$Image#listItem",
     85          10, req.queryParams.page);
     86    res.data.pager = renderPager(images,
     87          this.href(req.action), 10, req.queryParams.page);
     88    res.data.body = this.renderSkinAsString(skin);
     89    res.handlers.site.renderSkin("Site#page");
     90    return;
     91 }
     92
     93 Images.prototype.create_action = function() {
     94    File.redirectOnUploadError(this.href(req.action));
     95    File.redirectOnExceededQuota(this.href());
     96
     97    if (req.data.save) {
     98       try {
     99          var image = Image.add(req.params, this._parent);
    100          image.notify(req.action);
    101          JSON.sendPaddedResponse(image._id);
    102          res.message = gettext('The image was successfully added.');
    103          res.redirect(image.href());
    104       } catch (ex) {
    105          JSON.sendPaddedResponse(null);
    106          res.status = 400;
    107          res.message = ex.toString();
    108          app.log(ex);
    109       }
    110    }
    111
    112    res.data.action = this.href(req.action);
    113    res.data.title = gettext("Add Image");
    114    res.data.body = (new Image).renderSkinAsString("$Image#edit");
    115    res.handlers.site.renderSkin("Site#page");
    116    return;
    117 }
    118
    119 Images.prototype.all_action = function() {
    120    res.data.pager = renderPager(this, this.href(req.action),
    121          10, req.queryParams.page);
    122    res.data.list = renderList(this, "$Image#listItem",
    123          10, req.queryParams.page);
    124    res.data.title = gettext("All Images");
    125    res.data.body = this.renderSkinAsString("$Images#main");
    126    res.handlers.site.renderSkin("Site#page");
    127    return;
    128 }
    129
    130 /**
    131  * @namespace
    132  * @field
    133  */
    134 Images.Default = new function() {
    135    var Image = function(name, description) {
    136       var dir = new helma.File(app.appsProperties['static'], "www");
    137       var image = new helma.Image(new helma.File(dir, name));
    138       this.name = name;
    139       this.description = description;
    140       this.width = image.width;
    141       this.height = image.height;
    142       this.getUrl = function() {
    143          return app.appsProperties.staticMountpoint + "/www/" + name;
    144       }
    145       this.render_macro = global.Image.prototype.render_macro;
    146       this.thumbnail_macro = global.Image.prototype.thumbnail_macro;
    147       return this;
    148    }
    149
    150    var images = {};
    151    var add = function(name, description) {
    152       images[name] = new Image(name, description);
    153       return;
    154    }
    155    add("ant.png", "Ant");
    156    add("ant-icon.png", "Tiny Ant");
    157    add("big.gif", String.EMPTY);
    158    add("bullet.gif", "*");
    159    add("dot.gif", String.EMPTY);
    160    add("headbg.gif", String.EMPTY);
    161    add("helma.png", "Helma Object Publisher");
    162    add("hop.gif", "Helma Object Publisher");
    163    add("manage.gif", "manage");
    164    add("marquee.gif", String.EMPTY);
    165    add("menu.gif", "menu");
    166    add("pixel.gif", String.EMPTY);
    167    add("recent.gif", "recent");
    168    add("rss.png", "RSS feed");
    169    add("smallanim.gif", "Made with Antville");
    170    add("smallchaos.gif", "Made with Antville");
    171    add("smallstraight.gif", "Made with Antville");
    172    add("smalltrans.gif", "Made with Antville");
    173    add("status.gif", "status");
    174    add("webloghead.gif", "Antville");
    175    add("xmlbutton.gif", "XML version of this page");
    176    return images;
    177 }
    178
    179 /**
    180  * @returns {Image[]}
    181  */
    182 Images.prototype.mergeImages = function() {
    183    var images = [];
    184    var layout = this._parent;
    185    while (layout) {
    186       layout.images.forEach(function() {
    187          if (images.indexOf(this) < 0) {
    188             images.push(this);
    189          }
    190          return;
    191       });
    192       layout = layout.parent;
    193    }
    194    return images.sort(Number.Sorter("created", Number.Sorter.DESC));
    195 }
    196
    197 /**
    198  *
    199  * @param {String} group
    200  * @returns {Tag[]}
    201  * @see Site#getTags
    202  */
    203 Images.prototype.getTags = function(group) {
    204    return this._parent.getTags("galleries", group);
    205 }
    206