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 Tags prototype.
 28  */
 29 
 30 markgettext("Tags");
 31 markgettext("tags");
 32 
 33 /** @constant */
 34 Tags.ALL = "all";
 35 /** @constant */
 36 Tags.OTHER = "other";
 37 /** @constant */
 38 Tags.ALPHABETICAL = "alphabetical";
 39 
 40 /**
 41  * @name Tags
 42  * @constructor
 43  * @extends HopObject
 44  */
 45 
 46 /**
 47  * 
 48  * @param {String} action
 49  * @returns {Boolean}
 50  */
 51 Tags.prototype.getPermission = function(action) {
 52    return res.handlers.site.getPermission("main");
 53 }
 54 
 55 Tags.prototype.main_action = function() {
 56    var action = this.getAction();
 57    if (req.data.group) {
 58       this.setGroup(req.data.group)
 59       res.redirect(this.href(action));
 60    }
 61    if (req.data.page) {
 62       this.setPage(req.data.page);
 63       res.redirect(this.href(action));
 64    }
 65    res.data.title = this.getTitle();
 66    res.data.body = this.renderSkinAsString("$Tags#" + req.action);
 67    res.handlers.site.renderSkin("Site#page");
 68    return;
 69 }
 70 
 71 Tags.prototype.admin_action = function() {
 72    return this.main_action();
 73 }
 74 
 75 /**
 76  * 
 77  * @param {Number} id
 78  * @returns {HopObject}
 79  */
 80 Tags.prototype.getChildElement = function(id) {
 81    var child = this[id] || this.get(Tags.ALL).get(id);
 82    return child;
 83 }
 84 
 85 /**
 86  * 
 87  */
 88 Tags.prototype.alphabet_macro = function() {
 89    if (this.get(Tags.ALL).size() < 50) {
 90       return;
 91    }
 92 
 93    var self = this;
 94    var collection = this.get(Tags.ALPHABETICAL);
 95    var prefix = "?group=";
 96    var group = this.getGroup();
 97 
 98    var add = function(text, id) {
 99       if (group === id) {
100          res.write(text);
101       } else {
102          html.link({href: self.href(self.getAction()) + prefix + id}, text);      
103       }
104       res.write(" ");
105       return;
106    };
107 
108    add("*", Tags.ALL);
109    collection.forEach(function() {
110       add(this._id, this._id);
111    });
112    if (this.get(Tags.OTHER).size() > 0) {
113       add("?", Tags.OTHER);
114    }
115    return;
116 }
117 
118 /**
119  * 
120  */
121 Tags.prototype.pager_macro = function() {
122    var page = this.getPage();
123    var max = this.get(this.getGroup()).size();
124    var size = this.getPageSize();
125    var total = Math.ceil(max / size);
126    if (total < 2) {
127       return;
128    }
129    var prefix = "?page=";
130    for (var i=1; i<=total; i+=1) {
131       if (i == page) {
132          res.write(i);
133       } else {
134          html.link({href: this.href(this.getAction()) + prefix + i}, i);      
135       }
136       res.write(" ");
137    }
138    return;
139 }
140 
141 /**
142  * 
143  * @param {Object} param
144  */
145 Tags.prototype.header_macro = function(param) {
146    var header = this.getHeader();
147    for each (var title in header) {
148       this.renderSkin("Tags#header", {title: title});
149    }
150    return;
151 }
152 
153 /**
154  * 
155  */
156 Tags.prototype.list_macro = function(param, skin) {
157    var page = this.getPage();
158    var size = param.limit ? Math.min(param.limit, 100) : this.getPageSize();
159    var start = (page - 1) * size;
160    var collection = this.get(this.getGroup()).list(start, size);
161    // FIXME: ListRenderer should do this
162    //var list = new jala.ListRenderer(collection);
163    //list.render(skin || mgrlistitem);
164    var index = start + 1;
165    for each (var item in collection) {
166       // FIXME: Is there a more elegant solution?
167       if (item.constructor !== Tag) {
168          item = item.get(0);
169       }
170       item.renderSkin(skin || "$Tag#listItem", {index: index});
171       index += 1;
172    }
173    return;
174 }
175 
176 /**
177  * 
178  * @param {String} group
179  * @returns {TagHub[]}
180  */
181 Tags.prototype.get = function(group) {
182    return this._parent.getTags(this._id, group || this.getGroup());
183 }
184 
185 /**
186  * @returns {String}
187  */
188 Tags.prototype.getGroup = function() {
189    return decodeURIComponent(session.data[this.href("group")] || Tags.ALL);
190 }
191 
192 /**
193  * 
194  * @param {String} group
195  */
196 Tags.prototype.setGroup = function(group) {
197    session.data[this.href("group")] = encodeURIComponent(group);
198    this.setPage(1);
199    return;
200 }
201 
202 /**
203  * @returns {Number}
204  */
205 Tags.prototype.getPage = function() {
206    return session.data[this.href("page")] || 1;
207 }
208 
209 /**
210  * 
211  * @param {Number} page
212  */
213 Tags.prototype.setPage = function(page) {
214    session.data[this.href("page")] = page;
215    return;
216 }
217 
218 /**
219  * @returns {Number}
220  */
221 Tags.prototype.getPageSize = function() {
222    return 25;
223 }
224 
225 /**
226  * @returns {String}
227  */
228 Tags.prototype.getAction = function() {
229    return (req.action === "main" ? String.EMPTY : req.action);
230 }
231 
232 /**
233  * @returns {String[]}
234  * @see Stories#getAdminHeader
235  * @see Images#getAdminHeader
236  */
237 Tags.prototype.getHeader = function() {
238    if (this._parent.getAdminHeader) {
239       return this._parent.getAdminHeader(this._id) || [];
240    }
241    return [];
242 }
243