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 var skin = new Skin; 95 if (req.postParams.save) { 96 try { 97 var prototype = req.postParams.prototype; 98 var name = stripTags(req.postParams.name); 99 if (!prototype || !req.postParams.name) { 100 throw Error(gettext("Please choose a prototype and enter a skin name")); 101 } else if (name !== req.postParams.name || /\s/.test(name) || NAMEPATTERN.test(name)) { 102 throw Error(gettext("Please avoid special characters or HTML code in the name field.")); 103 } else if (Skin.getByName(prototype, name)) { 104 throw Error("Sorry, there is already a skin with that name. Please enter a different one."); 105 } 106 skin = this.getSkin(prototype, name); 107 skin.update(req.postParams); 108 res.message = gettext("The changes were saved successfully."); 109 if (req.postParams.save == 1) { 110 res.redirect(skin.href("edit")); 111 } else { 112 res.redirect(res.handlers.layout.skins.href("modified")); 113 } 114 } catch (ex) { 115 res.message = ex; 116 app.log(ex); 117 } 118 } 119 res.data.title = gettext('Add Skin'); 120 res.data.action = this.href(req.action); 121 res.data.body = 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: "#", name: prototype, id: 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