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 Stories prototype
 28  */
 29 
 30 markgettext("Stories");
 31 markgettext("stories");
 32 
 33 /**
 34  * @name Stories
 35  * @constructor
 36  * @property {Story[]} _children
 37  * @property {Tag[]} alphabeticalTags
 38  * @property {Story[]} closed
 39  * @property {Comment[]} comments
 40  * @property {Story[]} featured
 41  * @property {Tag[]} otherTags
 42  * @property {Story[]} recent
 43  * @property {Tag[]} tags
 44  * @property {Story[]} top
 45  * @property {Story[]} union
 46  * @extends HopObject
 47  */
 48 
 49 /**
 50  * 
 51  * @param {String} action
 52  * @returns {Boolean}
 53  */
 54 Stories.prototype.getPermission = function(action) {
 55    if (!this._parent.getPermission("main")) {
 56       return false;
 57    }
 58    switch (action) {
 59       case ".":
 60       case "main":
 61       case "create":
 62       return Site.require(Site.OPEN) && session.user ||
 63             Membership.require(Membership.CONTRIBUTOR) || 
 64             User.require(User.PRIVILEGED); 
 65 
 66       case "all":
 67       case "top":
 68       case "closed":
 69       return Membership.require(Membership.MANAGER) ||
 70             User.require(User.PRIVILEGED);
 71    }
 72    return false;
 73 }
 74 
 75 Stories.prototype.main_action = function() {
 76    var stories = User.getMembership().stories;
 77    res.data.list = renderList(stories, "$Story#listItem", 
 78          10, req.queryParams.page);
 79    res.data.pager = renderPager(stories, 
 80          this.href(), 10, req.queryParams.page);
 81    res.data.title = gettext("Member Stories");
 82    res.data.body = this.renderSkinAsString("$Stories#main");
 83    this._parent.renderSkin("Site#page");
 84    return;
 85 }
 86 
 87 Stories.prototype.create_action = function() {
 88    if (req.data.save) {
 89       try {
 90          story = Story.add(req.params);
 91          story.notify(req.action);
 92          JSON.sendPaddedResponse(story._id);
 93          delete session.data.backup;
 94          res.message = gettext("The story was successfully created.");
 95          res.redirect(story.href());
 96       } catch (ex) {
 97          JSON.sendPaddedResponse(null);
 98          res.status = 400;
 99          res.message = ex;
100          app.log(ex);
101       }
102    }
103    
104    res.data.title = gettext("Add Story");
105    res.data.action = this.href(req.action);
106    res.data.body = (new Story).renderSkinAsString("Story#edit");
107    this._parent.renderSkin("Site#page");
108    return;
109 }
110 
111 Stories.prototype.closed_action = function() {
112    res.data.list = renderList(this.closed, 
113          "$Story#listItem", 10, req.queryParams.page);
114    res.data.pager = renderPager(this.closed, 
115          this.href(req.action), 10, req.queryParams.page);
116    res.data.title = gettext("Closed Stories");
117    res.data.body = this.renderSkinAsString("$Stories#main");
118    this._parent.renderSkin("Site#page");
119    return;
120 }
121 
122 Stories.prototype.all_action = function() {
123    res.data.list = renderList(this, "$Story#listItem", 10, req.queryParams.page);
124    res.data.pager = renderPager(this, 
125          this.href(req.action), 10, req.queryParams.page);
126    res.data.title = gettext("All Stories");
127    res.data.body = this.renderSkinAsString("$Stories#main");
128    this._parent.renderSkin("Site#page");
129    return;
130 }
131 
132 Stories.prototype.top_action = function() {
133    res.data.title = gettext("Top Stories");
134    res.data.body = this.renderSkinAsString("$Stories#top");
135    this._parent.renderSkin("Site#page");
136    return;
137 }
138 
139 /**
140  * 
141  * @param {Object} param
142  * @param {String} type
143  */
144 Stories.prototype.list_macro = function(param, type) {
145    switch (type) {
146       case "top":
147       var counter = 1;
148       this.top.forEach(function() {
149          this.renderSkin("$Story#top", {
150             position: counter
151          });
152          counter += 1;
153       }); 
154       break;
155    }
156    return;
157 }
158 
159 /**
160  * 
161  * @param {String} group
162  * @returns {Tag[]}
163  * @see Site#getTags
164  */
165 Stories.prototype.getTags = function(group) {
166    return this._parent.getTags("tags", group);
167 }
168 
169 /**
170  * 
171  * @param {String} name
172  * @returns {String[]}
173  */
174 Stories.prototype.getAdminHeader = function(name) {
175    return ["#", "Tag", "Items"];
176 }
177