Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

contagged additions #4

Open
wants to merge 9 commits into from

2 participants

@wertarbyte

I added some more stuff to contagged, including a flash clipboard widget to simplify the inclusion of addresses in other applications. Please consider merging the changes, or contact me if you have additional questions.

pneff and others added some commits
@pneff pneff Set the global $user variable if the user is logged in. This is
necessary for the userlogreq configuration to work e.g. for exporting
CSV files.
c650fb9
@pneff pneff Calculate the map bounds and zoom level correctly so the displayed map
area shows all the included POIs.
dc6752b
@wertarbyte wertarbyte use home address fields from mozilla schema
Use separate address fields for home street, home location and home ZIP
code instead of a single field for the entire private address. For this
to work, the LDAP class mozillaAbPersonAlpha is required. The fields are
also added to the edit page and the CSV export.
83133bb
@wertarbyte wertarbyte add print export
This patch adds a "print" function to the addressbook; it displays all
currently listed contacts in a smaller font, making it possible to print
the entire address book (or parts of it).
f9d3982
@wertarbyte wertarbyte Merge branch 'master' of git://github.com/cosmocode/contagged
79626db
@wertarbyte wertarbyte add print view for single addresses
ee12dc9
@wertarbyte wertarbyte embed 'clippy' to copy address to clipboard
It is often convinient to copy a complete address to the system
clipboard; to achieve this, this patch includes the flash widget
"clippy" to the contact view. Clicking on one of the widgets copies
either the office or home address to the clipboard, making it simple to
include it in other applications.

Clippy itself is hosted here: https://github.com/mojombo/clippy
1909530
@wertarbyte wertarbyte Merge remote branch 'cosmocode/master'
2ab0678
@wertarbyte wertarbyte Merge remote branch 'cosmocode/master'
2ffcc25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Jun 9, 2010
  1. @pneff

    Set the global $user variable if the user is logged in. This is

    pneff authored
    necessary for the userlogreq configuration to work e.g. for exporting
    CSV files.
Commits on Jun 10, 2010
  1. @pneff

    Calculate the map bounds and zoom level correctly so the displayed map

    pneff authored
    area shows all the included POIs.
Commits on Oct 31, 2010
  1. @wertarbyte

    use home address fields from mozilla schema

    wertarbyte authored
    Use separate address fields for home street, home location and home ZIP
    code instead of a single field for the entire private address. For this
    to work, the LDAP class mozillaAbPersonAlpha is required. The fields are
    also added to the edit page and the CSV export.
  2. @wertarbyte

    add print export

    wertarbyte authored
    This patch adds a "print" function to the addressbook; it displays all
    currently listed contacts in a smaller font, making it possible to print
    the entire address book (or parts of it).
Commits on Nov 18, 2010
  1. @wertarbyte
Commits on Nov 30, 2010
  1. @wertarbyte
  2. @wertarbyte

    embed 'clippy' to copy address to clipboard

    wertarbyte authored
    It is often convinient to copy a complete address to the system
    clipboard; to achieve this, this patch includes the flash widget
    "clippy" to the contact view. Clicking on one of the widgets copies
    either the office or home address to the clipboard, making it simple to
    include it in other applications.
    
    Clippy itself is hosted here: https://github.com/mojombo/clippy
  3. @wertarbyte
Commits on Dec 17, 2010
  1. @wertarbyte
This page is out of date. Refresh to see the latest.
View
3  inc/config.php
@@ -68,4 +68,5 @@
// Force recompilation of smarty templates?
$conf['smartycompile'] = 0;
-
+ // load clipboard flash widget from this URL:
+ $conf['clippyurl'] = 'http://github.com/mojombo/clippy/raw/master/build/clippy.swf';
View
8 inc/fields.php
@@ -53,6 +53,14 @@
$FIELDS['country'] = 'c';
/**
+ * Mozilla uses a more elaborate schema
+ */
+$OCLASSES[] = 'mozillaAbPersonAlpha';
+$FIELDS['homestreet'] = 'mozillaHomeStreet';
+$FIELDS['homelocation'] = 'mozillaHomeLocalityName';
+$FIELDS['homezip'] = 'mozillaHomePostalCode';
+
+/**
* If the open exchange schema is used the following fields
* and object classes are added
*/
View
4 inc/init.php
@@ -51,4 +51,8 @@ function remove_magic_quotes(&$array) {
// select the correct google api key
$conf['gmapkey'] = $conf['gmaps'][$_SERVER['HTTP_HOST']];
+ $user = null;
+ if (isset($_SESSION['ldapab']['username'])) {
+ $user = $_SESSION['ldapab']['username'];
+ }
?>
View
5 inc/lang/de.php
@@ -22,7 +22,9 @@
$lang['mobile'] = 'Handy';
$lang['pager'] = 'Pieper';
$lang['homephone'] = 'Telefon (priv.)';
-$lang['homestreet'] = 'Adresse (priv.)';
+$lang['homestreet'] = 'Straße (priv.)';
+$lang['homezip'] = 'Postleitzahl (priv.)';
+$lang['homelocation'] = 'Stadt (priv.)';
$lang['photo'] = 'Foto';
$lang['url'] = 'Webseite';
$lang['note'] = 'Notizen';
@@ -51,6 +53,7 @@
$lang['copy'] = 'Kopieren';
$lang['map'] = 'Karte';
$lang['csvexport'] = 'CSV';
+$lang['printexport'] = 'Drucken';
$lang['vcfexport'] = 'VCard';
$lang['vcfimport'] = 'Import';
$lang['search'] = 'Suchen';
View
5 inc/lang/en.php
@@ -22,7 +22,9 @@
$lang['mobile'] = 'Mobile';
$lang['pager'] = 'Pager';
$lang['homephone'] = 'Phone (priv.)';
-$lang['homestreet'] = 'Address (priv.)';
+$lang['homestreet'] = 'Street (priv.)';
+$lang['homezip'] = 'Postal Code (priv.)';
+$lang['homelocation'] = 'City (priv.)';
$lang['photo'] = 'Picture';
$lang['url'] = 'Website';
$lang['note'] = 'Notes';
@@ -51,6 +53,7 @@
$lang['copy'] = 'Copy';
$lang['map'] = 'Map';
$lang['csvexport'] = 'CSV';
+$lang['printexport'] = 'Print';
$lang['vcfexport'] = 'VCard';
$lang['vcfimport'] = 'Import';
$lang['search'] = 'Search';
View
27 index.php
@@ -8,6 +8,8 @@
$entrytpl = 'list_csv_entry.tpl';
}elseif(!empty($_REQUEST['export']) && $_REQUEST['export'] == 'map'){
$entrytpl = 'list_map_entry.tpl';
+ }elseif(!empty($_REQUEST['export']) && $_REQUEST['export'] == 'print'){
+ $entrytpl = 'list_print_entry.tpl';
}else{
$entrytpl = 'list_entry.tpl';
}
@@ -22,6 +24,16 @@
// fetch results
$result = ldap_queryabooks($ldapfilter,$fields);
+ //prepare templates
+ tpl_std();
+ if (empty($_REQUEST['filter'])) $_REQUEST['filter']='';
+ if (empty($_REQUEST['marker'])) $_REQUEST['marker']='';
+ if (empty($_REQUEST['search'])) $_REQUEST['search']='';
+ $smarty->assign('filter',$_REQUEST['filter']);
+ $smarty->assign('marker',$_REQUEST['marker']);
+ $smarty->assign('search',$_REQUEST['search']);
+ $smarty->assign('org',$_REQUEST['org']);
+
$list = '';
if(count($result)==1 && $_REQUEST['search']){
//only one result on a search -> display page
@@ -35,17 +47,8 @@
$list .= $smarty->fetch($entrytpl);
}
}
-
- //prepare templates
- tpl_std();
- if (empty($_REQUEST['filter'])) $_REQUEST['filter']='';
- if (empty($_REQUEST['marker'])) $_REQUEST['marker']='';
- if (empty($_REQUEST['search'])) $_REQUEST['search']='';
$smarty->assign('list',$list);
- $smarty->assign('filter',$_REQUEST['filter']);
- $smarty->assign('marker',$_REQUEST['marker']);
- $smarty->assign('search',$_REQUEST['search']);
- $smarty->assign('org',$_REQUEST['org']);
+
//display templates
if(!empty($_REQUEST['export'])){
if ($conf['userlogreq'] && $user == ''){
@@ -63,6 +66,10 @@
header('Content-Type: text/html; charset=utf-8');
$smarty->display('list_map.tpl');
exit;
+ }elseif($_REQUEST['export'] == 'print'){
+ header('Content-Type: text/html; charset=utf-8');
+ $smarty->display('list_print.tpl');
+ exit;
}
}else{
//save location in session
View
10 scripts/maps.js
@@ -1,6 +1,7 @@
var gmap_data = Array();
var gmap_centered = false;
+var gmap_bounds = new GLatLngBounds();
function gmap_loader(){
if (!GBrowserIsCompatible()) {
@@ -29,10 +30,11 @@ function gmap_add(map,gc,adr,info,t){
if (!point) {
//alert(address + " not found");
} else {
- if(!gmap_centered){
- map.setCenter(point, 5);
- gmap_centered = true;
- }
+ gmap_bounds.extend(point);
+ var zoom = map.getBoundsZoomLevel(gmap_bounds);
+ if (zoom > 17) zoom = 17;
+ map.setCenter(gmap_bounds.getCenter(), zoom);
+
var marker = new GMarker(point);
map.addOverlay(marker);
GEvent.addListener(marker, "click", function(){
View
5 styles/design.css
@@ -115,6 +115,11 @@ a.ed_csvexport {
padding: 1px 0px 1px 16px;
}
+a.ed_printexport {
+ background: transparent url(../pix/page_white_excel.png) 0px 1px no-repeat;
+ padding: 1px 0px 1px 16px;
+}
+
a.ed_vcfimport {
background: transparent url(../pix/page_in.png) 0px 1px no-repeat;
padding: 1px 0px 1px 16px;
View
5 styles/layout.css
@@ -243,3 +243,8 @@ div#footrow {
div#footrow div.login{
float: right;
}
+
+/* print export */
+div.print h2 {
+ border-bottom: 1px solid #999;
+}
View
13 templates/entry_edit.tpl
@@ -165,6 +165,19 @@
<td><textarea name="entry[homestreet]" class="input" rows="2" cols="30">{$entry.homestreet|h}</textarea></td>
</tr>
{/if}
+{if $fields.homezip}
+ <tr>
+ <th>{$lang.homezip}:</th>
+ <td><input type="text" class="input ac" name="entry[homezip]" value="{$entry.homezip|h}" /></td>
+ </tr>
+{/if}
+{if $fields.homelocation}
+ <tr>
+ <th>{$lang.homelocation}:</th>
+ <td><textarea name="entry[homelocation]" class="input" rows="2" cols="30">{$entry.homelocation|h}</textarea></td>
+ </tr>
+{/if}
+
{if $fields.homephone}
<tr>
<th>{$lang.homephone}:</th>
View
20 templates/entry_print.tpl
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>ConTagged - {$lang.ldapab}</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+ <link rel="stylesheet" type="text/css" href="styles/layout.css" />
+ <link rel="stylesheet" type="text/css" href="styles/design.css" />
+ <link rel="stylesheet" type="text/css" href="styles/scripted.css" />
+
+</head>
+<body>
+ <div id="content" class="print">
+ {if $conf.userlogreq == 0 || $user != ''}
+ {include file="list_print_entry.tpl"}
+ {/if}
+ </div>
+</body>
+</html>
View
44 templates/entry_show.tpl
@@ -18,6 +18,26 @@
<tr>
<td valign="top" width="50%">
<h3>{$lang.business}</h3>
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
+ width="110"
+ height="14"
+ id="clippy" >
+ <embed src="{$conf.clippyurl}"
+ width="110"
+ height="14"
+ name="clippy"
+ quality="high"
+ allowScriptAccess="always"
+ type="application/x-shockwave-flash"
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
+ flashvars="text={$entry.title} {$entry.givenname} {$entry.name}
+{$entry.organization}
+{$entry.street}
+{$entry.zip} {$entry.location}
+{$entry.state}
+"
+ />
+ </object>
<table width="100%">
<tr>
<td colspan="2">
@@ -94,6 +114,26 @@
<td valign="top" width="50%">
<h3>{$lang.private}</h3>
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
+ width="110"
+ height="14"
+ id="clippy_home" >
+ <embed src="{$conf.clippyurl}"
+ width="110"
+ height="14"
+ name="clippy_home"
+ quality="high"
+ allowScriptAccess="always"
+ type="application/x-shockwave-flash"
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
+ flashvars="text={$entry.title} {$entry.givenname} {$entry.name}
+{$entry.homestreet}
+{$entry.homezip} {$entry.homelocation}
+{$entry.homestate}
+"
+ />
+ </object>
+
<table width="100%">
<tr>
<td colspan="2">
@@ -101,6 +141,10 @@
{if $entry.homestreet}
{$entry.homestreet|h|nl2br}<br /><br />
{/if}
+{if $entry.homelocation}
+ {$entry.homezip|h} {$entry.homelocation|h|nl2br}<br /><br />
+{/if}
+
</td>
</tr>
{if $entry.homephone}
View
2  templates/list_csv.tpl
@@ -1,2 +1,2 @@
-{$lang.name|csv};{$lang.givenname|csv};{$lang.title|csv};{$lang.organization|csv};{$lang.office|csv};{$lang.street|csv};{$lang.zip|csv};{$lang.location|csv};{$lang.country|csv};{$lang.phone|csv};{$lang.fax|csv};{$lang.pager|csv};{$lang.homestreet|csv};{$lang.homephone|csv};{$lang.mobile|csv};{$lang.url|csv};{$lang.note|csv};{$lang.mail|csv};{$lang.mail|csv};{$lang.mail|csv};{$lang.marker|csv}
+{$lang.name|csv};{$lang.givenname|csv};{$lang.title|csv};{$lang.organization|csv};{$lang.office|csv};{$lang.street|csv};{$lang.zip|csv};{$lang.location|csv};{$lang.country|csv};{$lang.phone|csv};{$lang.fax|csv};{$lang.pager|csv};{$lang.homestreet|csv};{$lang.homezip|csv};{$lang.homelocation|csv};{$lang.homephone|csv};{$lang.mobile|csv};{$lang.url|csv};{$lang.note|csv};{$lang.mail|csv};{$lang.mail|csv};{$lang.mail|csv};{$lang.marker|csv}
{$list}
View
2  templates/list_csv_entry.tpl
@@ -1,2 +1,2 @@
-{$entry.name|csv};{$entry.givenname|csv};{$entry.title|csv};{$entry.organization|csv};{$entry.office|csv};{$entry.street|csv};{$entry.zip|csv};{$entry.location|csv};{$entry.country|csv};{$entry.phone|csv};{$entry.fax|csv};{$entry.pager|csv};{$entry.homestreet|csv};{$entry.homephone|csv};{$entry.mobile|csv};{$lang.url|csv};{$entry.note|csv};{$entry.mail[0]|csv};{$entry.mail[1]|csv};{$entry.mail[2]|csv};{$entry.markers|csv}
+{$entry.name|csv};{$entry.givenname|csv};{$entry.title|csv};{$entry.organization|csv};{$entry.office|csv};{$entry.street|csv};{$entry.zip|csv};{$entry.location|csv};{$entry.country|csv};{$entry.phone|csv};{$entry.fax|csv};{$entry.pager|csv};{$entry.homestreet|csv};{$entry.homezip|csv};{$entry.homelocation|csv};{$entry.homephone|csv};{$entry.mobile|csv};{$lang.url|csv};{$entry.note|csv};{$entry.mail[0]|csv};{$entry.mail[1]|csv};{$entry.mail[2]|csv};{$entry.markers|csv}
View
21 templates/list_print.tpl
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+ <title>ConTagged - {$lang.ldapab}</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+ <link rel="stylesheet" type="text/css" href="styles/layout.css" />
+ <link rel="stylesheet" type="text/css" href="styles/design.css" />
+ <link rel="stylesheet" type="text/css" href="styles/scripted.css" />
+
+</head>
+<body>
+ <div id="content" class="print">
+ {if $conf.userlogreq == 0 || $user != ''}
+ {* $list is a concatenation of multiple list_print_entry.tpl *}
+ {$list}
+ {/if}
+ </div>
+</body>
+</html>
View
235 templates/list_print_entry.tpl
@@ -0,0 +1,235 @@
+<div class="show">
+
+<h2>
+ {$entry.givenname|h} {$entry.name|h}
+</h2>
+
+<table width="100%" class="show">
+ <tr>
+ <td valign="top" width="50%">
+ <h3>{$lang.business}</h3>
+ <table width="100%">
+ <tr>
+ <td colspan="2">
+
+ {$entry.title|h} {$entry.givenname|h} {$entry.name|h}<br />
+{if $entry.organization}
+ <a href="index.php?org={$entry.organization|escape:url}">{$entry.organization|h}</a><br />
+{/if}
+{if $entry.office}
+ {$entry.office|h}<br />
+{/if}
+{if $entry.street}
+ {$entry.street|h}<br />
+{/if}
+{if $entry.location}
+ {$entry.zip|h} {$entry.location|h}<br />
+{/if}
+{if $entry.state}
+ {$entry.state|h}
+{/if}
+{if $entry.country}
+ {$iso3166[$entry.country]}
+{/if}
+ <br /><br />
+ </td>
+ </tr>
+{if $entry.phone}
+ <tr>
+ <th>{$lang.phone}:</th>
+ <td><a href="callto://{$entry.phone|escape:phone}">{$entry.phone|h}</a></td>
+ </tr>
+{/if}
+{if $entry.switchboard}
+ <tr>
+ <th>{$lang.switchboard}:</th>
+ <td>{$entry.switchboard|h}</td>
+ </tr>
+{/if}
+{if $entry.fax}
+ <tr>
+ <th>{$lang.fax}:</th>
+ <td>{$entry.fax|h}</td>
+ </tr>
+{/if}
+{if $entry.pager}
+ <tr>
+ <th>{$lang.pager}:</th>
+ <td>{$entry.pager|h}</td>
+ </tr>
+{/if}
+{if $managername}
+ <tr>
+ <th>{$lang.manager}:</th>
+ <td>{$managername}</td>
+ </tr>
+{/if}
+{if $entry.position}
+ <tr>
+ <th>{$lang.position}:</th>
+ <td>{$entry.position|h}</td>
+ </tr>
+{/if}
+{if $entry.department}
+ <tr>
+ <th>{$lang.department}:</th>
+ <td>{$entry.department|h}</td>
+ </tr>
+{/if}
+
+ </table>
+
+ </td>
+
+
+ <td valign="top" width="50%">
+ <h3>{$lang.private}</h3>
+ <table width="100%">
+ <tr>
+ <td colspan="2">
+ {$entry.title|h} {$entry.givenname|h} {$entry.name|h}<br />
+{if $entry.homestreet}
+ {$entry.homestreet|h|nl2br}<br /><br />
+{/if}
+{if $entry.homelocation}
+ {$entry.homezip|h} {$entry.homelocation|h|nl2br}<br /><br />
+{/if}
+
+ </td>
+ </tr>
+{if $entry.homephone}
+ <tr>
+ <th>{$lang.homephone}:</th>
+ <td><a href="callto://{$entry.homephone|escape:phone}">{$entry.homephone|h}</a></td>
+ </tr>
+{/if}
+{if $entry.mobile}
+ <tr>
+ <th>{$lang.mobile}:</th>
+ <td><a href="callto://{$entry.mobile|escape:phone}">{$entry.mobile|h}</a></td>
+ </tr>
+{/if}
+{if $entry.birthday}
+ <tr>
+ <th>{$lang.birthday}:</th>
+ <td>{$entry.birthday|h}</td>
+ </tr>
+{/if}
+{if $entry.anniversary}
+ <tr>
+ <th>{$lang.anniversary}:</th>
+ <td>{$entry.anniversary|date_format:$conf.dateformat|h}</td>
+ </tr>
+{/if}
+{if $entry.spouse}
+ <tr>
+ <th>{$lang.spouse}:</th>
+ <td>{$entry.spouse|h}</td>
+ </tr>
+{/if}
+
+ </table>
+
+ <h3>{$lang.communication}</h3>
+ <table width="100%">
+{if $entry.url}
+ <tr>
+ <th>{$lang.url}:</th>
+ <td>{$entry.url|http}</td>
+ </tr>
+{/if}
+{if $entry.mail}
+ <tr>
+ <th>{$lang.mail}:</th>
+ <td>
+ {foreach from=$entry.mail item=mail}
+ <a href="mailto:{$mail|escape:url}">{$mail|h}</a><br />
+ {/foreach}
+ </td>
+ </tr>
+{/if}
+{if $entry.instantmessenger}
+ <tr>
+ <th>{$lang.instantmessenger}:</th>
+ <td>{$entry.instantmessenger|h}</td>
+ </tr>
+{/if}
+{if $entry.ipphone}
+ <tr>
+ <th>{$lang.ipphone}:</th>
+ <td>{$entry.ipphone|h}</td>
+ </tr>
+{/if}
+
+ </table>
+
+ </td>
+ </tr>
+</table>
+
+<h3>{$lang.extended}</h3>
+
+<table width="100%" class="show">
+ <tr>
+ <td width="50%" valign="top">
+ <table width="100%">
+{if $fields.note}
+ <tr>
+ <th>
+ {$lang.note}:
+ <div {if $user}id="noteedit"{/if}>&nbsp;</div>
+ </th>
+ <td>
+ <div id="notes">
+ {$entry.note|noteparser}
+ &nbsp;
+ </div>
+ </td>
+ </tr>
+{/if}
+ </table>
+ </td>
+ <td width="50%" valign="top">
+ <table width="100%">
+{if $fields._marker}
+ <tr>
+ <th>
+ {$lang.marker}:
+ <div {if $user}id="tagedit"{/if}>&nbsp;</div>
+ </th>
+ <td>
+ <span id="taglist">
+ {foreach from=$entry.marker item=marker}
+ <a href="index.php?marker={$marker|escape:url}" class="tag">{$marker|h}</a>
+ {/foreach}
+ &nbsp;
+ </span>
+ </td>
+ </tr>
+{/if}
+{if $entry.certificate}
+ <tr>
+ <th>{$lang.certificate}:</th>
+ <td><form>
+ <textarea rows=3 cols=28 name='certificate' onClick='this.form.certificate.select();'>{$entry.certificate|h}</textarea>
+ </form></td>
+ </tr>
+{/if}
+{if $entry.domain}
+ <tr>
+ <th>{$lang.domain}:</th>
+ <td>{$entry.domain|h}</td>
+ </tr>
+{/if}
+{if $entry.timezone}
+ <tr>
+ <th>{$lang.timezone}:</th>
+ <td>{$entry.timezone|h}</td>
+ </tr>
+{/if}
+ </table>
+ </td>
+ </tr>
+</table>
+
+</div>
View
7 templates/toolbar.tpl
@@ -44,6 +44,9 @@
<li>
<a href="entry.php?dn={$dn|escape:url}&amp;mode=vcf" class="ed_vcfexport">{$lang.vcfexport}</a>
</li>
+ <li>
+ <a href="entry.php?dn={$dn|escape:url}&amp;mode=print" class="ed_printexport">{$lang.printexport}</a>
+ </li>
<!-- qr code -->
<li>
@@ -74,6 +77,10 @@
<li>
<a href="index.php?filter={$filter|escape:url}&amp;marker={$marker|escape:url}&amp;search={$search|escape:url}&amp;org={$org|escape:url}&amp;export=csv"
class="ed_csvexport">{$lang.csvexport}</a>
+ <li>
+ <a href="index.php?filter={$filter|escape:url}&amp;marker={$marker|escape:url}&amp;search={$search|escape:url}&amp;org={$org|escape:url}&amp;export=print"
+ class="ed_printexport">{$lang.printexport}</a>
+
</li>
{/if}
Something went wrong with that request. Please try again.