def image_dialog(request): _ = request.getText url_prefix_static = request.cfg.url_prefix_static # wiki url requestUrl = request.url if requestUrl.find('?') == -1: requestUrl = requestUrl + '?action=fckdialog&dialog=image' action = requestUrl.split('?')[0] ticket = wikiutil.createTicket(request, pagename=request.page.page_name, action='AttachFile') redirectUrl = requestUrl attachmentsPagename = request.page.page_name attachments = _get_files(request, attachmentsPagename) attachments = filter( lambda attachment: attachment.endswith('.gif') or attachment.endswith( '.png') or attachment.endswith('.jpg') or attachment.endswith( '.jpeg'), attachments) attachments.sort() attachment_urls = {} for attachment in attachments: attachment_urls[attachment] = getAttachUrl(request.page.page_name, attachment, request, do='get') engine = tenjin.Engine(path=[os.path.dirname(__file__) + '/views']) html = engine.render('image_dialog.pyhtml', locals()) request.write(html)
def collectpackage(self, pagelist, fileobject, pkgname="", include_attachments=False): """ Expects a list of pages as an argument, and fileobject to be an open file object, which a zipfile will get written to. @param pagelist: pages to package @param fileobject: open file object to write to @param pkgname: optional file name, to prevent self packaging @rtype: string or None @return: error message, if one happened @rtype: boolean @param include_attachments: True if you want attachments collected """ _ = self.request.getText COMPRESSION_LEVEL = zipfile.ZIP_DEFLATED pages = [] for pagename in pagelist: pagename = wikiutil.normalize_pagename(pagename, self.request.cfg) if pagename: page = Page(self.request, pagename) if page.exists() and self.request.user.may.read(pagename): pages.append(page) if not pages: return (_('No pages like "%s"!') % wikiutil.escape(pagelist)) # Set zipfile output zf = zipfile.ZipFile(fileobject, "w", COMPRESSION_LEVEL) cnt = 0 userid = user.getUserIdentification(self.request) script = [packLine(['MoinMoinPackage', '1']), ] for page in pages: cnt += 1 files = _get_files(self.request, page.page_name) script.append(packLine(["AddRevision", str(cnt), page.page_name, userid, "Created by the PackagePages action."])) timestamp = wikiutil.version2timestamp(page.mtime_usecs()) # avoid getting strange exceptions from zipfile in case of pre-1980 timestamps nineteeneighty = (10 * 365 + 3) * 24 * 3600 # 1970 + 10y + 3d timestamp = max(nineteeneighty, timestamp) # zip can not store timestamps before 1980 zi = zipfile.ZipInfo(filename=str(cnt), date_time=datetime.fromtimestamp(timestamp).timetuple()[:6]) zi.compress_type = COMPRESSION_LEVEL zf.writestr(zi, page.get_raw_body().encode("utf-8")) if include_attachments: for attname in files: if attname != pkgname: cnt += 1 zipname = "%d_attachment" % cnt script.append(packLine(["AddAttachment", zipname, attname, page.page_name, userid, "Created by the PackagePages action."])) filename = AttachFile.getFilename(self.request, page.page_name, attname) zf.write(filename, zipname) script += [packLine(['Print', 'Thank you for using PackagePages!'])] zf.writestr(MOIN_PACKAGE_FILE, u"\n".join(script).encode("utf-8")) zf.close()
def packagePages(self, pagelist, filename, function): """ Puts pages from pagelist into filename and calls function on them on installation. """ request = self.request try: os.remove(filename) except OSError: pass # page LanguageSetup needs no packing! existing_pages = [ pagename for pagename in pagelist if Page(request, pagename).exists() and pagename != 'LanguageSetup' ] if not existing_pages: return zf = zipfile.ZipFile(filename, "w", COMPRESSION_LEVEL) script = [ packLine(['MoinMoinPackage', '1']), ] cnt = 0 for pagename in existing_pages: pagename = pagename.strip() page = Page(request, pagename) files = _get_files(request, pagename) for attname in files: cnt += 1 zipname = "%d" % cnt script.append( packLine([ "ReplaceUnderlayAttachment", zipname, attname, pagename ])) attpath = AttachFile.getFilename(request, pagename, attname) zf.write(attpath, zipname) cnt += 1 zipname = "%d" % cnt script.append(packLine([function, zipname, pagename])) timestamp = wikiutil.version2timestamp(page.mtime_usecs()) zi = zipfile.ZipInfo( filename=zipname, date_time=datetime.fromtimestamp(timestamp).timetuple()[:6]) zi.compress_type = COMPRESSION_LEVEL zf.writestr(zi, page.get_raw_body().encode("utf-8")) script += [ packLine([ 'Print', 'Installed MoinMaster page bundle %s.' % os.path.basename(filename) ]) ] zf.writestr(MOIN_PACKAGE_FILE, u"\n".join(script).encode("utf-8")) zf.close()
def formatAttachTree(request, f): files = _get_files(request, f.page.page_name) if not files: return f.text('No attachments, no tree.') divfmt = {'class': 'attachtree_area'} result = f.div(1, **divfmt) result += render(request, f, walk(*files)) result += f.div(0) return result
def packagePages(self, pagelist, filename, function): """ Puts pages from pagelist into filename and calls function on them on installation. """ request = self.request try: os.remove(filename) except OSError: pass # page LanguageSetup needs no packing! existing_pages = [ pagename for pagename in pagelist if Page(request, pagename).exists() and pagename != "LanguageSetup" ] if not existing_pages: return zf = zipfile.ZipFile(filename, "w", COMPRESSION_LEVEL) script = [packLine(["MoinMoinPackage", "1"])] fallback_timestamp = int(time.time()) cnt = 0 for pagename in existing_pages: pagename = pagename.strip() page = Page(request, pagename) files = _get_files(request, pagename) for attname in files: cnt += 1 zipname = "%d" % cnt script.append(packLine(["ReplaceUnderlayAttachment", zipname, attname, pagename])) attpath = AttachFile.getFilename(request, pagename, attname) zf.write(attpath, zipname) cnt += 1 zipname = "%d" % cnt script.append(packLine([function, zipname, pagename])) timestamp = wikiutil.version2timestamp(page.mtime_usecs()) if not timestamp: # page.mtime_usecs() returns 0 for underlay pages timestamp = fallback_timestamp dt = datetime.fromtimestamp(timestamp) zi = zipfile.ZipInfo(filename=zipname, date_time=dt.timetuple()[:6]) zi.compress_type = COMPRESSION_LEVEL zf.writestr(zi, page.get_raw_body().encode("utf-8")) script += [packLine(["Print", "Installed MoinMaster page bundle %s." % os.path.basename(filename)])] zf.writestr(MOIN_PACKAGE_FILE, u"\n".join(script).encode("utf-8")) zf.close()
def execute(pagename, request): form = values_to_form(request.values) util = form.get('util', [None])[0] if util == "format": txt = form.get('text', [None])[0] request.write(format_wikitext(request, txt)) elif util == "getTemplate": template = form.get('name', [None])[0] template_page = wikiutil.unquoteWikiname(template) if request.user.may.read(template_page): Page(request, template_page).send_raw() elif util == "newPage": page = form.get('page', [None])[0] content = form.get('content', [""])[0] request.content_type = "application/json" if request.environ['REQUEST_METHOD'] != 'POST': return if not page: msg = "Page name not defined!" json.dump(dict(status="error", msg=msg), request) return if not request.user.may.write(page): msg = "You are not allowed to edit this page" json.dump(dict(status="error", msg=msg), request) return p = Page(request, page) if p.exists(): msg = "Page already exists" json.dump(dict(status="error", msg=msg), request) return editor = PageEditor(request, page) msg = editor.saveText(content, p.get_real_rev()) json.dump(dict(status="ok", msg=msg), request) elif util == "getProperties": request.content_type = "application/json" key = form.get('key', [''])[0] json.dump(get_properties(request, key), request) return elif util == "uploadFile": request.content_type = "application/json" if not request.user.may.write(pagename): msg = u"You are not allowed to edit this page!" json.dump(dict(status="error", msg=msg), request) request.status_code = 403 return from MoinMoin.action.AttachFile import add_attachment, AttachmentAlreadyExists try: overwrite = int(form.get('overwrite', ['0'])[0]) except: overwrite = 0 response = dict(success=list(), failed=list()) for name in request.files: _file = request.files.get(name) filename = _file.filename try: t, s = add_attachment(request, pagename, filename, _file.stream, overwrite=overwrite) response['success'].append(filename) except AttachmentAlreadyExists: response['failed'].append(filename) json.dump(response, request) return elif util == "getAttachments": request.content_type = "application/json" from MoinMoin.action.AttachFile import _get_files, getAttachUrl files = _get_files(request, pagename) response = [] for name in files: response.append( dict(url=getAttachUrl(pagename, name, request), name=name)) json.dump(response, request) return
def execute(pagename, request): pagename_header = '%s-%s.zip' % (pagename, datetime.now().isoformat()[:10]) pagename_header = pagename_header.encode('ascii', 'ignore') request.content_type = 'application/zip' request.headers['Content-Disposition'] = \ 'attachment; filename="%s"' % pagename_header args = values_to_form(request.values) try: args = args['args'][0] except (KeyError, IndexError): args = u'' pagelist, metakeys, _ = metatable_parseargs(request, args, get_all_keys=True) renameDict = dict() for page in pagelist: metas = get_metas(request, page, ["gwikirename"], abs_attach=False, checkAccess=False) renameList = metas["gwikirename"] if renameList: renameDict[page] = renameList output = StringIO() zip = zipfile.ZipFile(output, "w", zipfile.ZIP_DEFLATED) userid = user.getUserIdentification(request) script = [ packLine(['MoinMoinPackage', '1']), ] counter = 0 for pagename in pagelist: counter += 1 page = Page(request, pagename) timestamp = wikiutil.version2timestamp(page.mtime_usecs()) # Underlay pages are in epoch 0, zipfile in python 2.7 does # not support this. if not timestamp: pagefile, rev, exists = page.get_rev() if rev == 99999999: # We should never get here log.error("Page %s neither in pages or underlay, skipping." % (pagename)) continue timestamp = os.path.getctime(pagefile) pagetext = page.get_raw_body().encode("utf-8") filename = str(counter) zinfo = zipfile.ZipInfo( filename=filename, date_time=datetime.fromtimestamp(timestamp).timetuple()[:6]) zinfo.compress_type = zipfile.ZIP_DEFLATED zip.writestr(zinfo, pagetext) targetNameList = renameDict.get(pagename, [pagename]) for targetName in targetNameList: script.append( packLine(["AddRevision", filename, targetName, userid, ""])) for attachment in _get_files(request, pagename): counter += 1 sourcefile = AttachFile.getFilename(request, pagename, attachment) filename = str(counter) + "-attachment" zip.write(sourcefile, filename) script.append( packLine([ "AddAttachment", filename, attachment, pagename, userid, "" ])) zip.writestr(MOIN_PACKAGE_FILE, u"\n".join(script).encode("utf-8")) zip.close() request.write(output.getvalue())
def execute(pagename, request): pagename_header = "%s-%s.zip" % (pagename, datetime.now().isoformat()[:10]) pagename_header = pagename_header.encode("ascii", "ignore") request.content_type = "application/zip" request.headers["Content-Disposition"] = 'attachment; filename="%s"' % pagename_header args = values_to_form(request.values) try: args = args["args"][0] except (KeyError, IndexError): args = u"" pagelist, metakeys, _ = metatable_parseargs(request, args, get_all_keys=True) renameDict = dict() for page in pagelist: metas = get_metas(request, page, ["gwikirename"], abs_attach=False, checkAccess=False) renameList = metas["gwikirename"] if renameList: renameDict[page] = renameList output = StringIO() zip = zipfile.ZipFile(output, "w", zipfile.ZIP_DEFLATED) userid = user.getUserIdentification(request) script = [packLine(["MoinMoinPackage", "1"])] counter = 0 for pagename in pagelist: counter += 1 page = Page(request, pagename) timestamp = wikiutil.version2timestamp(page.mtime_usecs()) # Underlay pages are in epoch 0, zipfile in python 2.7 does # not support this. if not timestamp: pagefile, rev, exists = page.get_rev() if rev == 99999999: # We should never get here log.error("Page %s neither in pages or underlay, skipping." % (pagename)) continue timestamp = os.path.getctime(pagefile) pagetext = page.get_raw_body().encode("utf-8") filename = str(counter) zinfo = zipfile.ZipInfo(filename=filename, date_time=datetime.fromtimestamp(timestamp).timetuple()[:6]) zinfo.compress_type = zipfile.ZIP_DEFLATED zip.writestr(zinfo, pagetext) targetNameList = renameDict.get(pagename, [pagename]) for targetName in targetNameList: script.append(packLine(["AddRevision", filename, targetName, userid, ""])) for attachment in _get_files(request, pagename): counter += 1 sourcefile = AttachFile.getFilename(request, pagename, attachment) filename = str(counter) + "-attachment" zip.write(sourcefile, filename) script.append(packLine(["AddAttachment", filename, attachment, pagename, userid, ""])) zip.writestr(MOIN_PACKAGE_FILE, u"\n".join(script).encode("utf-8")) zip.close() request.write(output.getvalue())
def attachment_dialog(request): """ Attachment dialog for GUI editor. """ """ Features: This dialog can... """ """ - list attachments in a drop down list """ """ - list attachments also for a different page than the current one """ """ - create new attachment """ _ = request.getText url_prefix_static = request.cfg.url_prefix_static # wiki url action = request.script_root + "/" # The following code lines implement the feature "list attachments for a different page". # Meaning of the variables: # - requestedPagename : Name of the page where attachments shall be listed from. # - attachmentsPagename : Name of the page where the attachments where retrieved from. # - destinationPagename : Name of the page where attachment will be placed on. requestedPagename = wikiutil.escape(request.values.get( "requestedPagename", ""), quote=True) destinationPagename = wikiutil.escape(request.values.get( "destinationPagename", request.page.page_name), quote=True) attachmentsPagename = requestedPagename or request.page.page_name attachments = _get_files(request, attachmentsPagename) attachments.sort() attachmentList = ''' <select id="sctAttachments" size="10" style="width:100%%;visibility:hidden;" onchange="OnAttachmentListChange();"> %s </select> ''' % "\n".join([ '<option value="%s">%s</option>' % (wikiutil.escape( attachment, quote=True), wikiutil.escape(attachment, quote=True)) for attachment in attachments ]) # Translation of dialog texts. langAttachmentLocation = _("Attachment location") langPagename = _("Page name") langAttachmentname = _("Attachment name") langListAttachmentsButton = _("Refresh attachment list") langAttachmentList = _("List of attachments") if len(attachmentsPagename) > 50: shortenedPagename = "%s ... %s" % (attachmentsPagename[0:25], attachmentsPagename[-25:]) else: shortenedPagename = attachmentsPagename langAvailableAttachments = "%s: %s" % (_("Available attachments for page"), shortenedPagename) request.write(''' <!-- * FCKeditor - The text editor for internet * Copyright (C) 2003-2004 Frederico Caldeira Knabben * * Licensed under the terms of the GNU Lesser General Public License: * http://www.opensource.org/licenses/lgpl-license.php * * For further information visit: * http://www.fckeditor.net/ * * File Name: fck_attachment.html * Attachment dialog window. * * Version: 2.0 FC (Preview) * Modified: 2005-02-18 23:55:22 * * File Authors: * Frederico Caldeira Knabben ([email protected]) --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta name="robots" content="index,nofollow"> <html> <head> <title>Attachment Properties</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="robots" content="noindex,nofollow" /> <script src="%(url_prefix_static)s/applets/FCKeditor/editor/dialog/common/fck_dialog_common.js" type="text/javascript"></script> <script src="%(url_prefix_static)s/applets/moinFCKplugins/moinattachment/fck_attachment.js" type="text/javascript"></script> <script src="%(url_prefix_static)s/applets/moinFCKplugins/moinurllib.js" type="text/javascript"></script> </head> <body scroll="no" style="OVERFLOW: hidden"> <form id="DlgAttachmentForm" name="DlgAttachmentForm" action=%(action)s method="GET"> <input type="hidden" name="action" value="fckdialog"> <input type="hidden" name="dialog" value="attachment"> <input type="hidden" id="requestedPagename" name="requestedPagename" value="%(requestedPagename)s"> <input type="hidden" id="attachmentsPagename" name="attachmentsPagename" value="%(attachmentsPagename)s"> <input type="hidden" id="destinationPagename" name="destinationPagename" value="%(destinationPagename)s"> <div id="divInfo" style="valign=top;"> <div id="divLinkTypeAttachment"> <fieldset> <legend>%(langAttachmentLocation)s</legend> <table cellSpacing="0" cellPadding="0" width="100%%" border="0"> <tr> <td valign="bottom" style="width:90%%" style="padding-bottom:10px"> <span>%(langPagename)s</span><br> </td> </tr> <tr> <td valign="bottom" style="width:100%%" style="padding-bottom:10px;padding-right:10px;"> <input id="txtPagename" type="text" onkeyup="OnPagenameChange();" onchange="OnPagenameChange();" style="width:98%%"> </td> </tr> <tr> <td valign="bottom" style="width:90%%" style="padding-bottom:10px;"> <span>%(langAttachmentname)s</span><br> </td> </tr> <tr valign="bottom"> <td valign="bottom" style="width:100%%" style="padding-bottom:10px;padding-right:10px;"> <input id="txtAttachmentname" type="text" onkeyup="OnAttachmentnameChange();" onchange="OnPagenameChange();" style="width:98%%"><br> </td> </tr> </table> </fieldset> <fieldset> <legend>%(langAvailableAttachments)s</legend> <table cellSpacing="0" cellPadding="0" width="100%%" border="0"> <tr> <td valign="bottom" style="width:100%%" style="padding-bottom:10px"> <input id="btnListAttachments" type="submit" value="%(langListAttachmentsButton)s"> </td> </tr> <tr> <td valign="top" style="padding-top:10px"> <label for="sctAttachments">%(langAttachmentList)s</label><br> %(attachmentList)s </td> </tr> </table> </fieldset> </div> </div> </form> </body> </html> ''' % locals())
def execute(pagename, request): form = values_to_form(request.values) util = form.get('util', [None])[0] if util == "format": txt = form.get('text', [None])[0] request.write(format_wikitext(request, txt)) elif util == "getTemplate": template = form.get('name', [None])[0] template_page = wikiutil.unquoteWikiname(template) if request.user.may.read(template_page): Page(request, template_page).send_raw() elif util == "newPage": page = form.get('page', [None])[0] content = form.get('content', [""])[0] request.content_type = "application/json" if request.environ['REQUEST_METHOD'] != 'POST': return if not page: msg = "Page name not defined!" json.dump(dict(status="error", msg=msg), request) return if not request.user.may.write(page): msg = "You are not allowed to edit this page" json.dump(dict(status="error", msg=msg), request) return p = Page(request, page) if p.exists(): msg = "Page already exists" json.dump(dict(status="error", msg=msg), request) return editor = PageEditor(request, page) msg = editor.saveText(content, p.get_real_rev()) json.dump(dict(status="ok", msg=msg), request) elif util == "getProperties": request.content_type = "application/json" key = form.get('key', [''])[0] json.dump(get_properties(request, key), request) return elif util == "uploadFile": request.content_type = "application/json" if not request.user.may.write(pagename): msg = u"You are not allowed to edit this page!" json.dump(dict(status="error", msg=msg), request) request.status_code = 403 return from MoinMoin.action.AttachFile import add_attachment, AttachmentAlreadyExists try: overwrite = int(form.get('overwrite', ['0'])[0]) except: overwrite = 0 response = dict(success=list(), failed=list()) for name in request.files: _file = request.files.get(name) filename = _file.filename try: t,s = add_attachment(request, pagename, filename, _file.stream, overwrite=overwrite) response['success'].append(filename) except AttachmentAlreadyExists: response['failed'].append(filename) json.dump(response, request) return elif util == "getAttachments": request.content_type = "application/json" from MoinMoin.action.AttachFile import _get_files, getAttachUrl files = _get_files(request, pagename) response = [] for name in files: response.append(dict(url=getAttachUrl(pagename, name, request),name=name)) json.dump(response, request) return
def attachment_dialog(request): """ Attachment dialog for GUI editor. """ """ Features: This dialog can... """ """ - list attachments in a drop down list """ """ - list attachments also for a different page than the current one """ """ - create new attachment """ _ = request.getText url_prefix_static = request.cfg.url_prefix_static # wiki url action = request.script_root + "/" # The following code lines implement the feature "list attachments for a different page". # Meaning of the variables: # - requestedPagename : Name of the page where attachments shall be listed from. # - attachmentsPagename : Name of the page where the attachments where retrieved from. # - destinationPagename : Name of the page where attachment will be placed on. requestedPagename = wikiutil.escape(request.values.get("requestedPagename", ""), quote=True) destinationPagename = wikiutil.escape(request.values.get("destinationPagename", request.page.page_name), quote=True) attachmentsPagename = requestedPagename or request.page.page_name attachments = _get_files(request, attachmentsPagename) attachments.sort() attachmentList = ''' <select id="sctAttachments" size="10" style="width:100%%;visibility:hidden;" onchange="OnAttachmentListChange();"> %s </select> ''' % "\n".join(['<option value="%s">%s</option>' % (wikiutil.escape(attachment, quote=True), wikiutil.escape(attachment, quote=True)) for attachment in attachments]) # Translation of dialog texts. langAttachmentLocation = _("Attachment location") langPagename = _("Page name") langAttachmentname = _("Attachment name") langListAttachmentsButton = _("Refresh attachment list") langAttachmentList = _("List of attachments") if len(attachmentsPagename) > 50: shortenedPagename = "%s ... %s" % (attachmentsPagename[0:25], attachmentsPagename[-25:]) else: shortenedPagename = attachmentsPagename langAvailableAttachments = "%s: %s" % (_("Available attachments for page"), shortenedPagename) request.write(''' <!-- * FCKeditor - The text editor for internet * Copyright (C) 2003-2004 Frederico Caldeira Knabben * * Licensed under the terms of the GNU Lesser General Public License: * http://www.opensource.org/licenses/lgpl-license.php * * For further information visit: * http://www.fckeditor.net/ * * File Name: fck_attachment.html * Attachment dialog window. * * Version: 2.0 FC (Preview) * Modified: 2005-02-18 23:55:22 * * File Authors: * Frederico Caldeira Knabben ([email protected]) --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta name="robots" content="index,nofollow"> <html> <head> <title>Attachment Properties</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="robots" content="noindex,nofollow" /> <script src="%(url_prefix_static)s/applets/FCKeditor/editor/dialog/common/fck_dialog_common.js" type="text/javascript"></script> <script src="%(url_prefix_static)s/applets/moinFCKplugins/moinattachment/fck_attachment.js" type="text/javascript"></script> <script src="%(url_prefix_static)s/applets/moinFCKplugins/moinurllib.js" type="text/javascript"></script> </head> <body scroll="no" style="OVERFLOW: hidden"> <form id="DlgAttachmentForm" name="DlgAttachmentForm" action=%(action)s method="GET"> <input type="hidden" name="action" value="fckdialog"> <input type="hidden" name="dialog" value="attachment"> <input type="hidden" id="requestedPagename" name="requestedPagename" value="%(requestedPagename)s"> <input type="hidden" id="attachmentsPagename" name="attachmentsPagename" value="%(attachmentsPagename)s"> <input type="hidden" id="destinationPagename" name="destinationPagename" value="%(destinationPagename)s"> <div id="divInfo" style="valign=top;"> <div id="divLinkTypeAttachment"> <fieldset> <legend>%(langAttachmentLocation)s</legend> <table cellSpacing="0" cellPadding="0" width="100%%" border="0"> <tr> <td valign="bottom" style="width:90%%" style="padding-bottom:10px"> <span>%(langPagename)s</span><br> </td> </tr> <tr> <td valign="bottom" style="width:100%%" style="padding-bottom:10px;padding-right:10px;"> <input id="txtPagename" type="text" onkeyup="OnPagenameChange();" onchange="OnPagenameChange();" style="width:98%%"> </td> </tr> <tr> <td valign="bottom" style="width:90%%" style="padding-bottom:10px;"> <span>%(langAttachmentname)s</span><br> </td> </tr> <tr valign="bottom"> <td valign="bottom" style="width:100%%" style="padding-bottom:10px;padding-right:10px;"> <input id="txtAttachmentname" type="text" onkeyup="OnAttachmentnameChange();" onchange="OnPagenameChange();" style="width:98%%"><br> </td> </tr> </table> </fieldset> <fieldset> <legend>%(langAvailableAttachments)s</legend> <table cellSpacing="0" cellPadding="0" width="100%%" border="0"> <tr> <td valign="bottom" style="width:100%%" style="padding-bottom:10px"> <input id="btnListAttachments" type="submit" value="%(langListAttachmentsButton)s"> </td> </tr> <tr> <td valign="top" style="padding-top:10px"> <label for="sctAttachments">%(langAttachmentList)s</label><br> %(attachmentList)s </td> </tr> </table> </fieldset> </div> </div> </form> </body> </html> ''' % locals())