Changeset 227
- Timestamp:
- 10/19/11 15:17:07 (13 years ago)
- Location:
- ether_megapoli/trunk/web
- Files:
-
- 39 added
- 3 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
ether_megapoli/trunk/web/index.jsp
r170 r227 1 <%@ page import="com.medias.Context" contentType="text/html; charset=UTF-8"%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8"%> 3 <%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles"%> 4 <%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html"%> 5 <%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean"%> 6 <%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic"%> 1 <%@ page contentType="text/html; charset=UTF-8" %> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" %> 3 <%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %> 4 <%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %> 5 <%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %> 6 <%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %> 7 <%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %> 7 8 8 <tiles:insert page="/resources/templates/ template.jsp" flush="true">9 <tiles:insert page="/resources/templates/appleTemplate.jsp" flush="true"> 9 10 10 <bean:define type="java.lang.String" id="relativePath" value="<%=Context.getRelativePath(request)%>"/>11 <bean:define type="java.lang.String" id="webmaster" value="<%=Context.getWebmaster(request)%>"/>11 <tiles:put name="insertCss" type="string"></tiles:put> 12 <tiles:put name="insertJsOrJsp" type="string"></tiles:put> 12 13 13 <tiles:put name="nav" type="string">14 <ul><li><html:link page="/index.jsp"><bean:message key="app.home"/></html:link></li></ul>15 </tiles:put>16 14 17 <tiles:put name="title" type="string"> 18 <bean:message key="app.title"/> - <bean:message key="data"/> 19 </tiles:put> 15 <tiles:put name="title" type="string"><bean:message key="app.title"/> - <bean:message key="data"/></tiles:put> 16 <tiles:put name="nav" type="string"><html:link page="/index.jsp"><bean:message key="app.home"/></html:link></tiles:put> 20 17 21 <tiles:put name="bodytitle" type="string">22 <bean:message key="data.title"/>23 </tiles:put>24 18 25 <tiles:put name="body" type="string"> 26 <html:errors/> 19 <tiles:put name="bodytitle" type="string"><bean:message key="data.title"/></tiles:put> 27 20 28 <bean:message key="data.intro0"/> 29 <bean:message key="data.intro1"/><html:link href="mailto:${webmaster}?subject=[MEGAPOLI]">webmaster</html:link>. 30 <bean:define id="upload" value="upload"/> 31 <bean:define id="access" value="access"/> 32 <ul> 33 <li> 34 <html:link page="/data/access/access.jsp"><bean:message key="data.access"/></html:link> 35 : <bean:message key="data.access.intro"/> 36 </li> 37 <li> 38 <logic:notPresent name="SES_USER" scope="session"> 39 <html:link page="/InitLogonAccess.do" paramName="access" paramId="source"><bean:message key="data.access.extract"/></html:link> 40 </logic:notPresent> 41 <logic:present name="SES_USER" scope="session"> 42 <html:link page="/DataAccess.do"><bean:message key="data.access.extract"/></html:link> 43 </logic:present> 44 : <bean:message key="data.access.intro2"/> 45 </li> 46 <li> 47 <logic:notPresent name="SES_USER" scope="session"> 48 <html:link page="/InitLogon.do" paramName="upload" paramId="source"><bean:message key="data.upload"/></html:link> 49 </logic:notPresent> 50 <logic:present name="SES_USER" scope="session"> 51 <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link> 52 </logic:present> 53 : <bean:message key="data.upload.intro"/> 54 </li> 55 </ul> 56 </tiles:put> 21 22 <tiles:put name="body" type="string"> 23 <div class="indexContent"> 24 25 <bean:message key="data.intro0"/> 26 <bean:message key="data.intro1"/><html:link href="mailto:${webmaster}?subject=[MEGAPOLI]">webmaster</html:link>. 27 <bean:define id="upload" value="upload"/> 28 <bean:define id="access" value="access"/> 29 <ul> 30 <li> 31 <html:link page="/data/access/access.jsp"><bean:message key="data.access"/></html:link>: <bean:message key="data.access.intro"/> 32 </li> 33 <li> 34 <logic:notPresent name="SES_USER" scope="session"> 35 <html:link page="/InitLogonAccess.do" paramName="access" paramId="source"><bean:message key="data.access.extract"/></html:link> 36 </logic:notPresent> 37 <logic:present name="SES_USER" scope="session"> 38 <html:link page="/DataAccess.do"><bean:message key="data.access.extract"/></html:link> 39 </logic:present> 40 : <bean:message key="data.access.intro2"/> 41 </li> 42 <li> 43 <logic:notPresent name="SES_USER" scope="session"> 44 <html:link page="/InitLogon.do" paramName="upload" paramId="source"><bean:message key="data.upload"/></html:link> 45 </logic:notPresent> 46 <logic:present name="SES_USER" scope="session"> 47 <html:link page="/PrepareTree.do"><bean:message key="data.upload"/></html:link> 48 </logic:present> 49 : <bean:message key="data.upload.intro"/> 50 </li> 51 </ul> 52 </div> 53 </tiles:put> 54 57 55 </tiles:insert> -
ether_megapoli/trunk/web/resources/css/complexButton.css
r226 r227 25 25 } 26 26 27 .complexButton_lonely_middle { 28 -moz-border-radius: 6px; 29 background-image: url("../images/elements/button_middle_3.png"); 30 background-repeat: repeat-x; 31 height: 40px; 32 float: left; 33 padding-left: 7px; 34 padding-right: 8px; 35 } 36 27 37 .complexButton_text { 28 38 position: relative; -
ether_megapoli/trunk/web/resources/css/etherApple.css
r226 r227 6 6 7 7 body { 8 font-size: 1 2px;8 font-size: 13px; 9 9 line-height: 1.7em; 10 10 color: #333333; -
ether_megapoli/trunk/web/resources/css/megapoliApple.css
r226 r227 41 41 .containerMegapoli { 42 42 -moz-border-radius: 4px 4px 4px 4px; 43 -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);43 -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); 44 44 width: 980px; 45 45 float: left; … … 68 68 .containerNav { 69 69 -moz-border-radius: 4px 4px 4px 4px; 70 -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);70 -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); 71 71 float: left; 72 72 position: relative; -
ether_megapoli/trunk/web/resources/js/classesForJQuery/ComplexButton.js
r226 r227 10 10 // str specificClass 11 11 // classNameToAdd : use to avoid button's style for button_left, button_right and button_middle when button.css is used with pagination.css 12 // useLonelyMidleImage : if true, we use image for parts left and right, otherwise, we only use an image for the middle 12 13 //******************************************************** 13 14 … … 20 21 this.parent = param.parent ? param.parent : false; 21 22 this.value = param.value ? param.value : ""; 22 this.specificClass = param.specificClass ? param.specificClass : "";23 this.specificClass = param.specificClass ? param.specificClass : false; 23 24 this.callbackOnClick = param.onClick ? param.onClick : false; 25 this.classNameToAdd = param.classNameToAdd ? param.classNameToAdd : false; 26 this.useLonelyMidleImage = param.useLonelyMidleImage ? param.useLonelyMidleImage : false; 24 27 this.boolDisabled = false; 25 28 this.boolSelected = false; … … 28 31 // Create button elements 29 32 this.divContainer = $( document.createElement( "div" ) ); 30 this.divContainer.addClass( "complexButton" ); 31 this.divContainer.atMe = this; 32 this.divContainer.id = this.id; 33 this.divContainer.addClass( this.specificClass ); 33 this.divContainer.attr( {id:this.id, class:"complexButton"} ); 34 if( this.specificClass ) 35 this.divContainer.addClass( this.specificClass ); 34 36 if( this.parent ) 35 {36 37 this.parent.append( this.divContainer ); 37 }38 38 39 39 this.divLeft = $( document.createElement( "div" ) ); 40 if( param.classNameToAdd )41 this.divLeft.addClass( "complexButton_left_" + param.classNameToAdd );42 else 40 if( this.classNameToAdd ) 41 this.divLeft.addClass( "complexButton_left_" + this.classNameToAdd ); 42 else if( !this.useLonelyMidleImage ) 43 43 this.divLeft.addClass( "complexButton_left" ); 44 44 this.divContainer.append( this.divLeft ); 45 45 46 46 this.divMiddle = $( document.createElement( "div" ) ); 47 if( param.classNameToAdd ) 48 this.divMiddle.addClass( "complexButton_middle_" + param.classNameToAdd ); 47 this.divMiddle.attr( {id:"button_middle"} ); 48 if( this.classNameToAdd ) 49 this.divMiddle.addClass( "complexButton_middle_" + this.classNameToAdd ); 50 else if( this.useLonelyMidleImage ) 51 this.divMiddle.addClass( "complexButton_lonely_middle" ); 49 52 else 50 53 this.divMiddle.addClass( "complexButton_middle" ); … … 57 60 58 61 this.divRight = $( document.createElement( "div" ) ); 59 if( param.classNameToAdd )60 this.divRight.addClass( "complexButton_right_" + param.classNameToAdd );61 else 62 if( this.classNameToAdd ) 63 this.divRight.addClass( "complexButton_right_" + this.classNameToAdd ); 64 else if( !this.useLonelyMidleImage ) 62 65 this.divRight.addClass( "complexButton_right" ); 63 66 this.divContainer.append( this.divRight ); … … 65 68 // Define button events 66 69 this.divContainer.bind( 'click', this, this.onClick ); 67 // Event.observe( this.divContainer, 'click', this.onClick.bindAsEventListener( this ) );68 // Event.observe( this.divContainer, 'mouseover', this.onHover.bindAsEventListener( this ) );69 70 }, 70 71 … … 80 81 { 81 82 if( value ) 82 {83 83 this.disable(); 84 }85 84 else 86 {87 85 this.enable(); 88 }89 86 }, 90 87 … … 105 102 this.boolSelected = value; 106 103 if( this.boolSelected ) 107 {108 104 this.divContainer.addClassName( "selected" ); 109 }110 105 else 111 {112 106 this.divContainer.removeClassName( "selected" ); 113 }114 107 }, 115 108 … … 158 151 onClick : function( event ) 159 152 { 160 if( !event.data.getDisable() && (undefined == event.detail || 1 == event.detail) && event.data.callbackOnClick ) 161 event.data.callbackOnClick(); 153 var contextButton = event.data; 154 if( !contextButton.getDisable() && (undefined == event.detail || 1 == event.detail) && contextButton.callbackOnClick ) 155 contextButton.callbackOnClick(); 162 156 } 163 157 } ); -
ether_megapoli/trunk/web/resources/jsp/apple_etherHead.jsp
r226 r227 1 <%@ page import="com.medias.Context" %> 1 2 <%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %> 2 3 … … 4 5 <ether:htmlCss cssFile="megapoliApple"/> 5 6 <ether:htmlCss cssFile="complexButton"/> 7 <ether:htmlCss cssFile="TwitterLogin/front"/> 6 8 7 <%--<ether:htmlJs jsFile="library/prototype"/>--%>8 9 <ether:htmlJs jsFile="library/jquery-1.4.2.min"/> 9 10 <ether:htmlJs jsFile="library/jquery.class"/> 10 11 <ether:htmlJs jsFile="library/jquery.protify-0.3"/> 12 <ether:htmlJs jsFile="TwitterLogin/javascripts/jquery.tipsy"/> 11 13 <ether:htmlJs jsFile="Request"/> 12 14 <ether:htmlJs jsFile="etherHelper"/> 13 <%--<ether:htmlJs jsFile="DomHelper"/>--%>14 15 <ether:htmlJs jsFile="etherClasses"/> 15 16 <ether:htmlJs jsFile="Loading"/> 16 17 <ether:htmlJs jsFile="classesForJQuery/ComplexButton"/> 17 18 18 19 19 <script type="text/javascript"> … … 26 26 this.containerTools = $( "#tools" ); 27 27 28 /** *********** LOADING *********** **/ 29 // Create loading object for plateforms 30 // var param = new Object(); 31 // param.id = "loadingForPlateforms"; 32 // param.parent = this.containerPlateforms; 33 // this.loadingPlateforms = new Loading( param ); 34 // this.loadingPlateforms.display(); 28 /** *********** VARIABLES *********** **/ 29 this.isLanguageFr = <%=Context.getLangue(request).equals( "fr" )%>; 30 this.path = "<%=request.getContextPath()%>"; 31 this.webmaster = "<%=Context.getWebmaster(request)%>"; 32 this.relativePageUri = "<%=Context.getRelativePath( request )%>?<%=request.getQueryString()%>"; 35 33 34 /** ************ CREATE ************ **/ 36 35 this.createTitleTools(); 37 36 }, … … 43 42 this.containerTitle.html( interfaceTexts["app.fulltitle"] ); 44 43 44 this.createLogin(); 45 var mailButton = new ComplexButton( {value:interfaceTexts["data.upload.metadata.contact.mail"], parent:this.containerTools, id:"button_mail", onClick:this.onClickMail} ); 46 47 var valueLanguage = interfaceTexts["app.fr"]; 48 if( this.isLanguageFr ) 49 valueLanguage = interfaceTexts["app.en"]; 50 51 var languageButton = new ComplexButton( {value:valueLanguage, parent:this.containerTools, id:"button_language", onClick:jQuery.proxy( this.onClickLanguage, this )} ); 45 52 var homeButton = new ComplexButton( {value:interfaceTexts["app.home"], parent:this.containerTools, id:"button_home", onClick:this.onClickHome} ); 46 var loginButton = new ComplexButton( {value:interfaceTexts["app.connexion"], parent:this.containerTools, id:"button_login", onClick:this.onClickHome} );47 48 <%--<logic:notEqual name="lang" value="en">--%>49 <%--<html:link page="/English.do" paramName="relativePageUri" paramId="requestUri" titleKey="app.en">--%>50 <%--<h4><bean:message key="app.en"/></h4></html:link>--%>51 <%--</logic:notEqual>--%>52 <%--<logic:equal name="lang" value="en">--%>53 <%--<html:link page="/French.do" paramName="relativePageUri" paramId="requestUri" titleKey="app.fr"><h4>--%>54 <%--<bean:message key="app.fr"/></h4></html:link>--%>55 <%--</logic:equal>--%>56 57 var languageButton = new ComplexButton( {value:interfaceTexts["app.home"], parent:this.containerTools, id:"button_language", onClick:this.onClickHome} );58 var homeButton = new ComplexButton( {value:interfaceTexts["app.home"], parent:this.containerTools, id:"button_mail", onClick:this.onClickHome} );59 53 }, 60 54 55 createLogin: function() 56 { 57 var loginButton = new ComplexButton( {value:interfaceTexts["app.connexion"], parent:this.containerTools, id:"button_login", onClick:this.onClickLogin} ); 58 59 var containerLoginButton = $( "#button_login" ); 60 var loginMiddle = $( "#button_login #button_middle" ); 61 loginMiddle.empty(); 62 loginMiddle.attr( {id:"topnav", class:"topnav complexButton_middle"} ); 63 var aLogin = $( document.createElement( "a" ) ); 64 aLogin.attr( {href:"login", class:"signin"} ); 65 aLogin.html( "<span>" + interfaceTexts["app.connexion"] + "</span>" ); 66 loginMiddle.append( aLogin ); 67 68 $( document ).ready( function() 69 { 70 $( ".signin" ).click( function( e ) 71 { 72 e.preventDefault(); 73 $( "fieldset#signin_menu" ).toggle(); 74 $( ".signin" ).toggleClass( "menu-open" ); 75 } ); 76 77 $( "fieldset#signin_menu" ).mouseup( function() 78 { 79 return false 80 } ); 81 82 $( document ).mouseup( function( e ) 83 { 84 if( $( e.target ).parent( "a.signin" ).length == 0 ) 85 { 86 $( ".signin" ).removeClass( "menu-open" ); 87 $( "fieldset#signin_menu" ).hide(); 88 } 89 } ); 90 } ); 91 92 $( function() 93 { 94 $( '#forgot_username_link' ).tipsy( {gravity: 'w'} ); 95 } ); 96 }, 61 97 62 98 // EVENTS ******************************************************** 63 99 onClickHome: function() 64 100 { 65 alert( "paf" ); 101 document.location.href = "index.jsp"; 102 }, 103 104 onClickLogin: function() 105 { 106 107 }, 108 109 onClickLanguage: function() 110 { 111 if( this.isLanguageFr ) 112 document.location.href = this.path + "/English.do?requestUri=" + this.relativePageUri; 113 else 114 document.location.href = this.path + "/French.do?requestUri=" + this.relativePageUri; 115 }, 116 117 onClickMail: function() 118 { 119 document.location.href = "mailto:${webmaster}?subject=[MEGAPOLI]"; 66 120 } 67 121 } ); -
ether_megapoli/trunk/web/resources/templates/appleTemplate.jsp
r226 r227 30 30 <%-- VARIABLES A NE PAS TOUCHER !!! --%> 31 31 <bean:define type="java.lang.String" id="lastModified" value="<%=Context.getLastModified(request, application)%>"/> 32 <bean:define type="java.lang.String" id="lang" value="<%=Context.getLangue(request)%>"/>33 <bean:define type="java.lang.String" id="webmaster" value="<%=Context.getWebmaster(request)%>"/>34 <bean:define type="java.lang.String" id="chemin" value="<%=request.getContextPath()%>"/>35 <bean:define type="java.lang.String" id="relativePageUri"><%=Context.getRelativePath( request )%>?<%=request.getQueryString()%></bean:define>36 32 37 33 <bean:define id="upload" value="upload"/> … … 42 38 <div id="title_tools" class="containerMegapoli"> 43 39 <div id="title"></div> 44 <div id="tools" align="right"></div> 40 <div id="tools" align="right"> 41 <fieldset id="signin_menu"> 42 <form method="post" id="signin" action="https://twitter.com/sessions"> 43 <label for="username">Username or email</label> 44 <input id="username" name="username" value="" title="username" tabindex="4" type="text"> 45 </p> 46 <p> 47 <label for="password">Password</label> 48 <input id="password" name="password" value="" title="password" tabindex="5" type="password"> 49 </p> 50 51 <p class="remember"> 52 <input id="signin_submit" value="Sign in" tabindex="6" type="submit"> 53 </p> 54 55 <p class="forgot"><a href="#" id="resend_password_link">Forgot your password?</a></p> 56 57 <p class="forgot-username"><A id=forgot_username_link 58 title="If you remember your password, try logging in with your email" 59 href="#">Forgot your username?</A></p> 60 </form> 61 </fieldset> 62 </div> 45 63 </div> 46 64 … … 61 79 <div> 62 80 <ul> 63 <li><html:link page="/JeuxAccess.do"><span><bean:message key="data.access.jeux"/></span></html:link></li> 64 <li><html:link page="/ParametresAccess.do"><span><bean:message key="data.access.param"/></span></html:link></li> 65 <li><html:link page="/CapteursAccess.do"><span><bean:message key="data.access.capt"/></span></html:link></li> 66 <li><html:link page="/PlateformesAccess.do"><span><bean:message key="data.access.plat"/></span></html:link></li> 81 <li><html:link page="/JeuxAccess.do"><span><bean:message 82 key="data.access.jeux"/></span></html:link></li> 83 <li><html:link page="/ParametresAccess.do"><span><bean:message key="data.access.param"/></span></html:link> 84 </li> 85 <li><html:link page="/CapteursAccess.do"><span><bean:message 86 key="data.access.capt"/></span></html:link></li> 87 <li><html:link page="/PlateformesAccess.do"><span><bean:message key="data.access.plat"/></span></html:link> 88 </li> 67 89 </ul> 68 90 </div> … … 76 98 <ul> 77 99 <logic:notPresent name="SES_USER" scope="session"> 78 <li><html:link page="/InitLogonAccess.do" paramName="access" paramId="source"><span><bean:message key="data.access.extract"/></span></html:link></li> 79 <li><html:link page="/InitLogon.do" paramName="upload" paramId="source"><span><bean:message key="data.upload"/></span></html:link></li> 100 <li><html:link page="/InitLogonAccess.do" paramName="access" 101 paramId="source"><span><bean:message 102 key="data.access.extract"/></span></html:link></li> 103 <li><html:link page="/InitLogon.do" paramName="upload" paramId="source"><span><bean:message 104 key="data.upload"/></span></html:link></li> 80 105 </logic:notPresent> 81 106 <logic:present name="SES_USER" scope="session"> 82 <li><html:link page="/DataAccess.do"><span><bean:message key="data.access.extract"/></span></html:link></li> 83 <li><html:link page="/PrepareTree.do"><span><bean:message key="data.upload"/></span></html:link></li> 107 <li><html:link page="/DataAccess.do"><span><bean:message key="data.access.extract"/></span></html:link> 108 </li> 109 <li><html:link page="/PrepareTree.do"><span><bean:message 110 key="data.upload"/></span></html:link></li> 84 111 </logic:present> 85 112 </ul> … … 93 120 <div> 94 121 <ul> 95 <li><html:link page="/visualization?methodName=viewParametersByPlateform"><span><bean:message key="data.visualization"/></span></html:link></li> 96 <li><html:link page="/visualization/inWork.jsp"><span><bean:message key="simulation.visualization"/></span></html:link></li> 122 <li><html:link page="/visualization?methodName=viewParametersByPlateform"><span><bean:message 123 key="data.visualization"/></span></html:link></li> 124 <li><html:link page="/visualization/inWork.jsp"><span><bean:message 125 key="simulation.visualization"/></span></html:link></li> 97 126 </ul> 98 127 </div> … … 113 142 <table width="100%" style="color:white;font-size: 12px"> 114 143 <tr> 115 <td align="left">© 2010-2011 <html:link href="http://www.ipsl.fr" target="help" titleKey="app.linksIPSL">IPSL</html:link> / CNRS</td> 144 <td align="left">© 2010-2011 <html:link href="http://www.ipsl.fr" target="help" 145 titleKey="app.linksIPSL">IPSL</html:link> / CNRS 146 </td> 116 147 <td align="center"><bean:message key="app.infonavig"/></td> 117 148 <td align="right"><i><bean:message key="app.lastModified"/> : <bean:write name="lastModified"/></i></td> … … 123 154 124 155 <script type="text/javascript"> 125 var interfaceTexts = $A( "");156 var interfaceTexts = $A( "" ); 126 157 interfaceTexts["app.home"] = '<bean:message key="app.home"/>'; 127 158 interfaceTexts["app.fulltitle"] = '<bean:message key="app.fulltitle"/>'; … … 129 160 interfaceTexts["app.fr"] = '<bean:message key="app.fr"/>'; 130 161 interfaceTexts["app.connexion"] = '<bean:message key="app.connexion"/>'; 162 interfaceTexts["data.upload.metadata.contact.mail"] = '<bean:message key="data.upload.metadata.contact.mail"/>'; 131 163 132 164 var interfaceTemplate = new InterfaceTemplate(); -
ether_megapoli/trunk/web/visualization/visu.jsp
r219 r227 5 5 <%@ taglib prefix="ether" tagdir="/WEB-INF/tags" %> 6 6 7 <tiles:insert page="/resources/templates/ templateEther.jsp" flush="true">7 <tiles:insert page="/resources/templates/appleTemplate.jsp" flush="true"> 8 8 9 9 <tiles:put name="title" type="string"> … … 23 23 24 24 <bean:define type="java.lang.String" id="relativePath" value="<%=Context.getRelativePath(request)%>"/> 25 <tiles:put name="nav" value='<%=relativePath+"/ nav_visu.jsp"%>'/>25 <tiles:put name="nav" value='<%=relativePath+"/apple_nav_visu.jsp"%>'/> 26 26 27 27 <tiles:put name="bodytitle" type="string">
Note: See TracChangeset
for help on using the changeset viewer.