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    HopObject.confirmConstructor(Story);
107    res.data.body = (new Story).renderSkinAsString("Story#edit");
108    this._parent.renderSkin("Site#page");
109    return;
110 }
111 
112 Stories.prototype.closed_action = function() {
113    res.data.list = renderList(this.closed, 
114          "$Story#listItem", 10, req.queryParams.page);
115    res.data.pager = renderPager(this.closed, 
116          this.href(req.action), 10, req.queryParams.page);
117    res.data.title = gettext("Closed Stories");
118    res.data.body = this.renderSkinAsString("$Stories#main");
119    this._parent.renderSkin("Site#page");
120    return;
121 }
122 
123 Stories.prototype.all_action = function() {
124    res.data.list = renderList(this, "$Story#listItem", 10, req.queryParams.page);
125    res.data.pager = renderPager(this, 
126          this.href(req.action), 10, req.queryParams.page);
127    res.data.title = gettext("All Stories");
128    res.data.body = this.renderSkinAsString("$Stories#main");
129    this._parent.renderSkin("Site#page");
130    return;
131 }
132 
133 Stories.prototype.top_action = function() {
134    res.data.title = gettext("Top Stories");
135    res.data.body = this.renderSkinAsString("$Stories#top");
136    this._parent.renderSkin("Site#page");
137    return;
138 }
139 
140 /**
141  * 
142  * @param {Object} param
143  * @param {String} type
144  */
145 Stories.prototype.list_macro = function(param, type) {
146    switch (type) {
147       case "top":
148       var counter = 1;
149       this.top.forEach(function() {
150          this.renderSkin("$Story#top", {
151             position: counter
152          });
153          counter += 1;
154       }); 
155       break;
156    }
157    return;
158 }
159 
160 /**
161  * 
162  * @param {String} group
163  * @returns {Tag[]}
164  * @see Site#getTags
165  */
166 Stories.prototype.getTags = function(group) {
167    return this._parent.getTags("tags", group);
168 }
169 
170 /**
171  * 
172  * @param {String} name
173  * @returns {String[]}
174  */
175 Stories.prototype.getAdminHeader = function(name) {
176    return ["#", "Tag", "Items"];
177 }
178