Changeset 13551 for extensions/simple_themes
- Timestamp:
- Mar 14, 2012, 2:37:30 PM (12 years ago)
- Location:
- extensions/simple_themes/simple
- Files:
-
- 6 deleted
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/simple_themes/simple/README.md
r13549 r13551 40 40 extract it in ``your-gallery/template/``. 41 41 42 Notes for developpers43 ---------------------44 45 * `js/compress.sh` is a script which allows to compress and minify the46 different javascript files, using `yuicompressor`.47 48 42 Changelog 49 43 --------- 44 45 ### version 2.4 (05/04/2011) 46 47 compatibility with piwigo 2.2: 48 * update template, language strings + misc things 49 * use rating and core.scripts from default theme 50 * cleanup useless javascript stuff 51 * use new combined_css feature - thanks to P@t 52 * replace known_script with combine_script 50 53 51 54 ### version 2.3 (07/01/2011) -
extensions/simple_themes/simple/index.php
r13546 r13551 1 1 <?php 2 2 // +-----------------------------------------------------------------------+ 3 // | Piwigo - a PHP based p icture gallery|3 // | Piwigo - a PHP based photo gallery | 4 4 // +-----------------------------------------------------------------------+ 5 // | Copyright(C) 2008 5 // | Copyright(C) 2008-2011 Piwigo Team http://piwigo.org | 6 6 // | Copyright(C) 2003-2008 PhpWebGallery Team http://phpwebgallery.net | 7 7 // | Copyright(C) 2002-2003 Pierrick LE GALL http://le-gall.net/pierrick | -
extensions/simple_themes/simple/js/scripts.js
r13549 r13551 30 30 }; 31 31 }); 32 function SelectAll( formulaire )33 {34 var elts = formulaire.elements;35 for(var i=0; i <elts.length; i++)36 {37 if (elts[i].type=='checkbox')38 elts[i].checked = true;39 }40 }41 42 function DeselectAll( formulaire )43 {44 var elts = formulaire.elements;45 for(var i=0; i <elts.length; i++)46 {47 if (elts[i].type=='checkbox')48 elts[i].checked = false;49 }50 }51 52 function Inverser( formulaire )53 {54 var elts = formulaire.elements;55 for(var i=0; i <elts.length; i++)56 {57 if (elts[i].type=='checkbox')58 elts[i].checked = !elts[i].checked;59 }60 }61 62 function phpWGOpenWindow(theURL,winName,features)63 {64 img = new Image();65 img.src = theURL;66 if (img.complete)67 {68 var width=img.width+40, height=img.height+40;69 }70 else71 {72 var width=640, height=480;73 img.onload = function () { newWin.resizeTo( img.width+50, img.height+100); };74 }75 newWin = window.open(theURL,winName,features+',left=2,top=1,width=' + width + ',height=' + height);76 }77 78 function popuphelp(url)79 {80 window.open( url, 'dc_popup',81 'alwaysRaised=yes,dependent=yes,toolbar=no,height=420,width=500,menubar=no,resizable=yes,scrollbars=yes,status=no'82 );83 }84 85 Function.prototype.pwgBind = function() {86 var __method = this, object = arguments[0], args = Array.prototype.slice.call(arguments,1);87 return function() {88 return __method.apply(object, args.concat(arguments) );89 }90 }91 function PwgWS(urlRoot)92 {93 this.urlRoot = urlRoot;94 this.options = {95 method: "GET",96 async: true,97 onFailure: null,98 onSuccess: null99 };100 };101 102 PwgWS.prototype = {103 104 callService : function(method, parameters, options)105 {106 if (options)107 {108 for (var property in options)109 this.options[property] = options[property];110 }111 try { this.transport = new XMLHttpRequest();}112 catch(e) {113 try { this.transport = new ActiveXObject('Msxml2.XMLHTTP'); }114 catch(e) {115 try { this.transport = new ActiveXObject('Microsoft.XMLHTTP'); }116 catch (e){117 dispatchError(0, "Cannot create request object");118 }119 }120 }121 this.transport.onreadystatechange = this.onStateChange.pwgBind(this);122 123 var url = this.urlRoot+"ws.php?format=json";124 125 var body = "method="+method;126 if (parameters)127 {128 for (var property in parameters)129 {130 if ( typeof parameters[property] == 'object' && parameters[property])131 {132 for (var i=0; i<parameters[property].length; i++)133 body += "&"+property+"[]="+encodeURIComponent(parameters[property][i]);134 }135 else136 body += "&"+property+"="+encodeURIComponent(parameters[property]);137 }138 }139 140 if (this.options.method == "POST" )141 {142 this.transport.open(this.options.method, url, this.options.async);143 this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");144 this.transport.send(body);145 }146 else147 {148 url += "&"+body;149 this.transport.open(this.options.method, url, this.options.async);150 this.transport.send(null);151 }152 },153 154 onStateChange: function() {155 var readyState = this.transport.readyState;156 if (readyState==4)157 this.respondToReadyState(readyState);158 },159 160 dispatchError: function( httpCode, text )161 {162 !this.options.onFailure || this.options.onFailure( httpCode, text);163 },164 165 respondToReadyState: function(readyState)166 {167 var transport = this.transport;168 if (readyState==4 && transport.status == 200)169 {170 var resp;171 try {172 eval('resp = ' + transport.responseText);173 }174 catch (e) {175 this.dispatchError( 200, e.message + '\n' + transport.responseText.substr(0,512) );176 }177 if (resp!=null)178 {179 if (resp.stat==null)180 this.dispatchError( 200, "Invalid response" );181 else if (resp.stat=='ok')182 {183 if (this.options.onSuccess) this.options.onSuccess( resp.result );184 }185 else186 this.dispatchError( 200, resp.err + " " + resp.message);187 }188 }189 if (readyState==4 && transport.status != 200)190 this.dispatchError( transport.status, transport.statusText );191 },192 193 194 transport: null,195 urlRoot: null,196 options: {}197 }198 199 function pwgAddEventListener(elem, evt, fn)200 {201 if (window.attachEvent)202 elem.attachEvent('on'+evt, fn);203 else204 elem.addEventListener(evt, fn, false);205 }var gRatingOptions, gRatingButtons, gUserRating;206 207 function makeNiceRatingForm(options)208 {209 gRatingOptions = options || {};210 var form = document.getElementById('rateForm');211 if (!form) return; //? template changed212 213 gRatingButtons = form.getElementsByTagName('input');214 gUserRating = "";215 for (var i=0; i<gRatingButtons.length; i++)216 {217 if ( gRatingButtons[i].type=="button" )218 {219 gUserRating = gRatingButtons[i].value;220 break;221 }222 }223 224 for (var i=0; i<gRatingButtons.length; i++)225 {226 var rateButton = gRatingButtons[i];227 rateButton.initialRateValue = rateButton.value; // save it as a property228 try { rateButton.type = "button"; } catch (e){}// avoid normal submit (use ajax); not working in IE6229 230 if (navigator.userAgent.indexOf('AppleWebKit/')==-1 && navigator.userAgent.indexOf('MSIE 8')==-1) rateButton.value = ""; //hide the text IE<8/Opera - breaks safari231 with (rateButton.style)232 {233 textIndent = "-50px"; //hide the text FF234 marginLeft = marginRight = 0;235 }236 237 if (i!=gRatingButtons.length-1 && rateButton.nextSibling.nodeType == 3 /*TEXT_NODE*/)238 rateButton.parentNode.removeChild(rateButton.nextSibling);239 if (i>0 && rateButton.previousSibling.nodeType == 3 /*TEXT_NODE*/)240 rateButton.parentNode.removeChild(rateButton.previousSibling);241 242 pwgAddEventListener(rateButton, "click", updateRating);243 pwgAddEventListener(rateButton, "mouseout", resetRatingStarDisplay);244 pwgAddEventListener(rateButton, "mouseover", updateRatingStarDisplayEvt);245 }246 resetRatingStarDisplay();247 }248 249 function resetRatingStarDisplay()250 {251 updateRatingStarDisplay( gUserRating );252 }253 254 function updateRatingStarDisplay(userRating)255 {256 for (var i=0; i<gRatingButtons.length; i++)257 gRatingButtons[i].className = (userRating!=="" && userRating>=gRatingButtons[i].initialRateValue ) ? "rateButtonStarFull" : "rateButtonStarEmpty";258 }259 260 function updateRatingStarDisplayEvt(e)261 {262 updateRatingStarDisplay(263 e.target ? e.target.initialRateValue : e.srcElement.initialRateValue);264 }265 266 function updateRating(e)267 {268 var rateButton = e.target || e.srcElement;269 if (rateButton.initialRateValue == gUserRating)270 return false; //nothing to do271 272 for (var i=0; i<gRatingButtons.length; i++) gRatingButtons[i].disabled=true;273 var y = new PwgWS(gRatingOptions.rootUrl);274 y.callService(275 "pwg.images.rate", {image_id: gRatingOptions.image_id, rate: rateButton.initialRateValue } ,276 {277 onFailure: function(num, text) {278 alert(num + " " + text);279 document.location = rateButton.form.action + "&rate="+rateButton.initialRateValue;280 },281 onSuccess: function(result) {282 gUserRating = rateButton.initialRateValue;283 for (var i=0; i<gRatingButtons.length; i++) gRatingButtons[i].disabled=false;284 if (gRatingOptions.updateRateElement) gRatingOptions.updateRateElement.innerHTML = gRatingOptions.updateRateText;285 if (gRatingOptions.ratingSummaryElement)286 {287 var t = gRatingOptions.ratingSummaryText;288 var args =[result.average, result.count], idx = 0, rexp = new RegExp( /%\.?\d*[sdf]/ );289 //_xxx = t.match( rexp );290 while (idx<args.length) t=t.replace(rexp, args[idx++]);291 gRatingOptions.ratingSummaryElement.innerHTML = t;292 }293 }294 }295 );296 return false;297 }/**298 * Cookie plugin299 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)300 * Dual licensed under the MIT and GPL licenses:301 */302 jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options=$.extend({},options);options.expires=-1;}303 var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}304 expires='; expires='+date.toUTCString();}305 var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}306 return cookieValue;}}; -
extensions/simple_themes/simple/template/about.tpl
r13546 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a href="{$U_HOME}" title="{' return to homepage'|@translate}">{'Home'|@translate}</a></li>3 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'About'|@translate}</h2> … … 12 12 </ul> 13 13 {/if} 14 {if not empty($about_msgs)} 15 {foreach from=$about_msgs item=elt} 16 {$elt} 17 {/foreach} 18 {/if} 14 19 </div> -
extensions/simple_themes/simple/template/comments.tpl
r13549 r13551 11 11 <label>{'Keyword'|@translate} : <input type="text" name="keyword" value="{$F_KEYWORD}"></label> 12 12 <label>{'Author'|@translate} : <input type="text" name="author" value="{$F_AUTHOR}"></label> 13 <label>{' Category'|@translate} :13 <label>{'Album'|@translate} : 14 14 <select name="cat"> 15 15 <option value="0">------------</option> -
extensions/simple_themes/simple/template/header.tpl
r13550 r13551 6 6 {if isset($meta_ref) } 7 7 {if isset($INFO_AUTHOR)} 8 <meta name="author" content="{$INFO_AUTHOR|@ replace:'"':' '}">8 <meta name="author" content="{$INFO_AUTHOR|@strip_tags:false|@replace:'"':' '}"> 9 9 {/if} 10 10 {if isset($related_tags)} … … 54 54 <link rel="alternate" type="application/rss+xml" title="{'Complete RSS feed (images, comments)'|@translate}" href="{$U_FEED}"> 55 55 {/if} 56 56 57 {get_combined_scripts load='header'} 57 {combine_script id="simplescripts" require="jquery" path="themes/simple/js/scripts.min.js"} 58 {combine_script id='jquery' path='themes/default/js/jquery.min.js'} 59 {combine_script id='jquery.cookie' path='themes/simple/js/jquery.cookie.min.js'} 60 {combine_script id='rating' path='themes/default/js/rating.js'} 61 {combine_script id='core.scripts' path='themes/default/js/scripts.js'} 62 {combine_script id='simple.scripts' path='themes/simple/js/scripts.js'} 58 63 59 64 {if not empty($head_elements)} -
extensions/simple_themes/simple/template/identification.tpl
r13549 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a href="{$U_HOME}" title="{' Go through the gallery as a visitor'|@translate}">{'Home'|@translate}</a></li>3 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'Identification'|@translate}</h2> -
extensions/simple_themes/simple/template/mainpage_categories.tpl
r13549 r13551 4 4 <div class="illustration"> 5 5 <a href="{$cat.URL}"> 6 <img src="{$cat.TN_SRC}" alt="{$cat.TN_ALT}" title="{ 'shows images at the root of this category'|@translate}">6 <img src="{$cat.TN_SRC}" alt="{$cat.TN_ALT}" title="{$cat.NAME|@replace:'"':' '} - {'display this album'|@translate}"> 7 7 </a> 8 8 </div> -
extensions/simple_themes/simple/template/menubar.tpl
r13546 r13551 2 2 <div id="menubar"> 3 3 {foreach from=$blocks key=id item=block} 4 {if ( not empty($block->template) or not empty($block->raw_content) )}5 4 <div id="{$id}"> 6 5 {if not empty($block->template)} … … 10 9 {/if} 11 10 </div> 12 {/if}13 11 {/foreach} 14 12 </div> -
extensions/simple_themes/simple/template/menubar_categories.tpl
r13549 r13551 1 <h3><a href="{$block->data.U_CATEGORIES}">{' Categories'|@translate}</a></h3>1 <h3><a href="{$block->data.U_CATEGORIES}">{'Albums'|@translate}</a></h3> 2 2 3 3 {assign var='ref_level' value=0} … … 21 21 {'</li></ul>'|@str_repeat:$ref_level} 22 22 23 {if isset($block->data.U_UPLOAD)} 24 <ul> 25 <li> 26 <a href="{$block->data.U_UPLOAD}">{'Upload a picture'|@translate}</a> 27 </li> 28 </ul> 29 {/if} 30 <p class="totalImages">{$pwg->l10n_dec('%d image', '%d images', $block->data.NB_PICTURE)}</p> 23 <p class="totalImages">{$pwg->l10n_dec('%d photo', '%d photos', $block->data.NB_PICTURE)}</p> -
extensions/simple_themes/simple/template/menubar_tags.tpl
r13549 r13551 6 6 {if isset($tag.U_ADD)} 7 7 href="{$tag.U_ADD}" 8 title="{$pwg->l10n_dec('%d image is also linked to current tags', '%d imagesare also linked to current tags', $tag.counter)}"8 title="{$pwg->l10n_dec('%d photo is also linked to current tags', '%d photo are also linked to current tags', $tag.counter)}" 9 9 rel="nofollow">+ 10 10 {else} 11 11 href="{$tag.URL}" 12 title="{' See images linked to this tag only'|@translate}">12 title="{'display photos linked to this tag'|@translate}"> 13 13 {/if} 14 14 {$tag.name}</a> -
extensions/simple_themes/simple/template/nbm.tpl
r13546 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a href="{$U_HOME}" title="{' Go through the gallery as a visitor'|@translate}">{'Home'|@translate}</a></li>3 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'Notification'|@translate}</h2> -
extensions/simple_themes/simple/template/notification.tpl
r13546 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a href="{$U_HOME}" title="{' return to homepage'|@translate}">{'Home'|@translate}</a></li>3 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'Notification'|@translate}</h2> … … 8 8 <p>{'The RSS notification feed provides notification on news from this website : new pictures, updated categories, new comments. Use a RSS feed reader.'|@translate}</p> 9 9 <ul> 10 <li><a href="{$U_FEED_IMAGE_ONLY}">{' Imageonly RSS feed'|@translate}</a></li>11 <li><a href="{$U_FEED}">{'Complete RSS feed ( images, comments)'|@translate}</a></li>10 <li><a href="{$U_FEED_IMAGE_ONLY}">{'Photos only RSS feed'|@translate}</a></li> 11 <li><a href="{$U_FEED}">{'Complete RSS feed (photos, comments)'|@translate}</a></li> 12 12 </ul> 13 13 </div> -
extensions/simple_themes/simple/template/password.tpl
r13546 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a class="button" href="{$U_HOME}" title="{' Go through the gallery as a visitor'|@translate}">{'Home'|@translate}</a></li>3 <li><a class="button" href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'Password forgotten'|@translate}</h2> -
extensions/simple_themes/simple/template/picture.tpl
r13549 r13551 101 101 {/if} 102 102 {if $display_info.categories and isset($related_categories)} 103 <dt>{' Categories'|@translate}</dt>103 <dt>{'Albums'|@translate}</dt> 104 104 <dd> 105 105 {foreach from=$related_categories item=cat name=tag_loop} -
extensions/simple_themes/simple/template/picture_content.tpl
r13546 r13551 1 {if isset($high) 1 {if isset($high)} 2 2 <a href="javascript:phpWGOpenWindow('{$high.U_HIGH}','{$high.UUID}','scrollbars=yes,toolbar=no,status=no,resizable=yes')"> 3 3 {/if} 4 4 <img src="{$SRC_IMG}" style="width:{$WIDTH_IMG}px;height:{$HEIGHT_IMG}px;" alt="{$ALT_IMG}" 5 5 {if isset($COMMENT_IMG)} 6 6 title="{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}" {else} title="{$current.TITLE|@replace:'"':' '} - {$ALT_IMG}" … … 8 8 {if isset($high) } 9 9 </a> 10 <p>{'Click on the pictureto see it in high definition'|@translate}</p>10 <p>{'Click on the photo to see it in high definition'|@translate}</p> 11 11 {/if} -
extensions/simple_themes/simple/template/profile.tpl
r13547 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a href="{$U_HOME}" title="{' return to homepage'|@translate}">{'Home'|@translate}</a></li>3 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'Profile'|@translate}</h2> -
extensions/simple_themes/simple/template/register.tpl
r13546 r13551 39 39 <li> 40 40 <span class="property"> 41 <label for="mail_address">{' Mail address'|@translate}</label>41 <label for="mail_address">{'Email address'|@translate}</label> 42 42 </span> 43 43 <input type="text" name="mail_address" id="mail_address" value="{$F_EMAIL}" > … … 47 47 </fieldset> 48 48 <p class="bottomButtons"> 49 <input type="hidden" name="key" value="{$F_KEY}" > 49 50 <input class="submit" type="submit" name="submit" value="{'Register'|@translate}"> 50 51 <input class="submit" type="reset" value="{'Reset'|@translate}"> -
extensions/simple_themes/simple/template/search.tpl
r13546 r13551 93 93 <fieldset> 94 94 <legend>{'Search Options'|@translate}</legend> 95 <label>{'Search in Categories'|@translate}95 <label>{'Search in albums'|@translate} 96 96 <select class="categoryList" name="cat[]" multiple="multiple" > 97 97 {html_options options=$category_options selected=$category_options_selected} … … 99 99 </label> 100 100 <ul> 101 <li><label>{'Search in sub categories'|@translate}</label></li>101 <li><label>{'Search in sub-albums'|@translate}</label></li> 102 102 <li><label> 103 103 <input type="radio" name="subcats-included" value="1" checked="checked" />{'Yes'|@translate} -
extensions/simple_themes/simple/template/search_rules.tpl
r13546 r13551 33 33 {if isset($search_categories) } 34 34 <li> 35 <p>{' Categories'|@translate}</p>35 <p>{'Albums'|@translate}</p> 36 36 <ul> 37 37 {foreach from=$search_categories item=v} -
extensions/simple_themes/simple/template/tags.tpl
r13546 r13551 2 2 <ul class="categoryActions"> 3 3 {if $display_mode == 'letters'} 4 <li><a href="{$U_CLOUD}" title="{'show tag cloud'|@translate}">{'show tag cloud'|@translate}</a></li> « 4 <li><a href="{$U_CLOUD}" title="{'show tag cloud'|@translate}">{'show tag cloud'|@translate}</a></li> « 5 5 {/if} 6 6 {if $display_mode == 'cloud'} 7 <li><a href="{$U_LETTERS}" title="{'group by letters'|@translate}">{'group by letters'|@translate}</a></li> « 7 <li><a href="{$U_LETTERS}" title="{'group by letters'|@translate}">{'group by letters'|@translate}</a></li> « 8 8 {/if} 9 9 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> … … 16 16 <div id="fullTagCloud"> 17 17 {foreach from=$tags item=tag} 18 <span><a href="{$tag.URL}" class="tagLevel{$tag.level}" title="{$pwg->l10n_dec('%d image', '%d images', $tag.counter)}">{$tag.name}</a></span>18 <span><a href="{$tag.URL}" class="tagLevel{$tag.level}" title="{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}">{$tag.name}</a></span> 19 19 {/foreach} 20 20 </div> … … 31 31 <tr class="tagLine"> 32 32 <td><a href="{$tag.URL}">{$tag.name}</a></td> 33 <td class="nbEntries">{$pwg->l10n_dec('%d image', '%d images', $tag.counter)}</td>33 <td class="nbEntries">{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}</td> 34 34 </tr> 35 35 {/foreach} -
extensions/simple_themes/simple/template/upload.tpl
r13546 r13551 1 1 <div class="titrePage"> 2 2 <ul class="categoryActions"> 3 <li><a href="{$U_HOME}" title="{' return to homepage'|@translate}">{'Home'|@translate}</a></li>3 <li><a href="{$U_HOME}" title="{'Home'|@translate}">{'Home'|@translate}</a></li> 4 4 </ul> 5 5 <h2>{'Upload a picture'|@translate}</h2> … … 33 33 <!-- category --> 34 34 <li> 35 <div class="property">{' Category'|@translate}</div>35 <div class="property">{'Album'|@translate}</div> 36 36 {html_options name="category" options=$categories selected=$categories_selected} 37 37 </li> -
extensions/simple_themes/simple/themeconf.inc.php
r13550 r13551 2 2 /* 3 3 Theme Name: Simple Grey 4 Version: 2.3 .14 Version: 2.3 5 5 Description: Simple Grey 6 6 Theme URI: http://piwigo.org/ext/extension_view.php?eid=308
Note: See TracChangeset
for help on using the changeset viewer.