Changeset 1226

Show
Ignore:
Timestamp:
05/17/07 16:25:43 (5 years ago)
Author:
fproulx
Message:

2007-05-17 François Proulx <francois.proulx@…>

  • WARNING: This has not been fully tested. Full testing to be completed on 2006-05-18 but I'm pretty confident that it works pretty well.
  • Added automatic resize on Avatars
  • Added FavoriteHotspots? content (mostly used for Profiles)
  • Added new features to Content and File
  • Fixed URL regexp bug in HyperlinkUtils?
  • Updated French translations
  • Updates profiles template
  • TODO: Add getNewUI et processNewUI to FavoriteHotspots? to simplify input
Location:
trunk/wifidog-auth
Files:
23 modified

Legend:

Unmodified
Added
Removed
  • trunk/wifidog-auth/CHANGELOG

    r1225 r1226  
     12007-05-17 François Proulx <francois.proulx@gmail.com> 
     2        * WARNING: This has not been fully tested. Full testing to be completed on 2006-05-18 
     3          but I'm pretty confident that it works pretty well. 
     4        * Added automatic resize on Avatars 
     5        * Added FavoriteHotspots content (mostly used for Profiles) 
     6        * Added new features to Content and File 
     7        * Fixed URL regexp bug in HyperlinkUtils 
     8        * Updated French translations 
     9        * Updates profiles template 
     10        * TODO: Add getNewUI et processNewUI to FavoriteHotspots to simplify input 
     11 
    1122007-05-03  Benoit Gréoire  <bock@step.polymtl.ca> 
    213    * MainUI_ToolContent.tpl: Make preferences_link, login_link, and logout_link CSS targetable.  Get rid of some deprecated CSS. 
     
    920 
    10212007-04-19  Benoit Grégoire  <bock@step.polymtl.ca> 
    11         * RssAggregator.php:  Fix bug saving the max item age.  
     22        * RssAggregator.php:  Fix bug saving the max item age. 
    1223        * Forgot to remove a bunch of links to faq.php. 
    13          
     24 
    14252007-04-03 Benoit Grégoire  <bock@step.polymtl.ca> 
    15         * AnonymisedDataExport.php:  New report.  Adds the ability to export anonymised SQL data for academic research.  
     26        * AnonymisedDataExport.php:  New report.  Adds the ability to export anonymised SQL data for academic research. 
    1627 
    17282007-03-20 Benoit Grégoire  <bock@step.polymtl.ca> 
    18         * Shoutbox.php: Allow limiting the number of characters entered for a shout.   
    19         (Ideally, this would also need to be enforced at db write level).    
     29        * Shoutbox.php: Allow limiting the number of characters entered for a shout. 
     30        (Ideally, this would also need to be enforced at db write level). 
    2031        Move the shout form in the list. 
    2132        Allow choosing the number of shouts displayed. 
     
    3546        * Add UIUserList content type (work towards #158) 
    3647        * portal/index.php:  Finish refactoring Smarty usage. 
    37          
     48 
    38492007-03-17 Benoit Grégoire  <bock@step.polymtl.ca> 
    3950        * install.php: Make sure we are in the right directory when uncompressing Smarty 
    4051        * Avatar.php:  Don't allow user to hyperlink the image. 
    4152        * ProfileTemplate:  Display how many profiles will be affected when deleting a template field. 
    42         * User.php:  Don't show the profile creation button if the network has no profile template.  
     53        * User.php:  Don't show the profile creation button if the network has no profile template. 
    4354         Don't hyperlink the username if the user has no profile. 
    4455 
     
    4758        * ProfileField::getContentField():  Fix bug where the object wouldn't refresh properly. 
    4859        * Content:  Delicate refactoring of the UI to create new content. 
    49         The content object now supports directly adding the actual values of a new  
    50         Content in getNewContentUI(), if the content filter only allows a single content type.   
    51         For this to work, the Content type must overload the getNewUI() method.   
     60        The content object now supports directly adding the actual values of a new 
     61        Content in getNewContentUI(), if the content filter only allows a single content type. 
     62        For this to work, the Content type must overload the getNewUI() method. 
    5263        This saves many mouse clicks for form style interface, like profiles. 
    5364        * User:  Don't create profile automatically. 
    5465        * Don't show profiles when user is invisible. 
    5566        * Langstring, SimpleString, HTMLEditor: Support getNewUI().  As a result of these changes, SmartyTemplate, SimpleSmartyTemplate, Stylesheet also get it for free. 
    56         * Add new standard Smarty value userOriginallyRequestedURL.   
     67        * Add new standard Smarty value userOriginallyRequestedURL. 
    5768 Note that this does NOT fix #266 
    5869        * Add new standard Smarty value nodeWebSiteURL 
     
    7182        * Fix detection of HTML Safe. 
    7283        * Avatar.php:  Don't allow editing the picture size. 
    73         * ContentGroup:  In some cases, the same element could be picked twice in the same display.   
    74         Make sure that doesn't happen.  Also, implement the option to not rotate content at all,  
     84        * ContentGroup:  In some cases, the same element could be picked twice in the same display. 
     85        Make sure that doesn't happen.  Also, implement the option to not rotate content at all, 
    7586        usefull when showing all elements simultaneously in a specific order. Closes #294 
    7687 
  • trunk/wifidog-auth/wifidog/classes/Content.php

    r1201 r1226  
    423423        return $retval; 
    424424    } 
    425      
     425 
    426426    /** 
    427427     * Check if this class is NOT any of the class or subclass of one of the content types given as parameter 
     
    12321232        return $retval; 
    12331233    } 
     1234 
    12341235    /** Get the authors of the Content 
    12351236     * @return null or array of User objects */ 
     
    12371238        $db = AbstractDb :: getObject(); 
    12381239        $retval = array (); 
     1240        $content_owner_row = null; 
    12391241        $sql = "SELECT user_id FROM content_has_owners WHERE content_id='$this->id' AND is_author=TRUE"; 
    12401242        $db->execSqlUniqueRes($sql, $content_owner_row, false); 
     
    12461248        return $retval; 
    12471249    } 
     1250 
     1251    /** Get the owners of the Content 
     1252     * @return null or array of User objects */ 
     1253    public function getOwners() { 
     1254        $db = AbstractDb :: getObject(); 
     1255        $retval = array (); 
     1256        $content_owner_row = null; 
     1257        $sql = "SELECT user_id FROM content_has_owners WHERE content_id='$this->id'"; 
     1258        $db->execSqlUniqueRes($sql, $content_owner_row, false); 
     1259        if ($content_owner_row != null) { 
     1260            $user = User :: getObject($content_owner_row['user_id']); 
     1261            $retval[] = $user; 
     1262        } 
     1263 
     1264        return $retval; 
     1265    } 
     1266 
    12481267    /** @see GenricObject 
    12491268     * @return The id */ 
  • trunk/wifidog-auth/wifidog/classes/Content/Avatar/Avatar.php

    r1194 r1226  
    5656        $this -> configEnableEditWidthHeight(false); 
    5757        $this -> configEnableHyperlink(false); 
     58 
     59                // Max 40x40 pixels 
     60        $this->setMaxDisplayWidth(40); 
     61        $this->setMaxDisplayHeight(40); 
    5862    } 
    5963 
     
    6266        return $html; 
    6367    } 
     68 
     69    /** 
     70         * Validates the uploaded file and return a boolean to tell if valid 
     71         * This method should be overridden when you need to write special validation scripts 
     72         * 
     73         * @param string path to input file 
     74         * @param string path to output file (by ref.), making sure you create a struct that matches the $_FILES[][] format 
     75         * 
     76         * @return boolean 
     77         */ 
     78        protected function validateUploadedFile($input, &$output) { 
     79                $errmsg = null; 
     80                // Only if GD is available, resize to max size 
     81                if (Dependencies::check("gd", $errmsg)) { 
     82                        // Extract image metadata 
     83                        list($width_orig, $height_orig, $type, $attr) = getimagesize($input['tmp_name']); 
     84                        // Check if it busts the max size 
     85                        if($width_orig > $this->getMaxDisplayWidth() || $height_orig > $this->getMaxDisplayHeight()) { 
     86                                // Init with max values 
     87                                $width = $this->getMaxDisplayWidth(); 
     88                                $height = $this->getMaxDisplayHeight(); 
     89 
     90                                // Compute ratios 
     91                                $ratio_orig = $width_orig / $height_orig; 
     92                                if ($this->getMaxDisplayWidth() / $this->getMaxDisplayHeight() > $ratio_orig) { 
     93                                   $width =  $height * $ratio_orig; 
     94                                } else { 
     95                                   $height = $width / $ratio_orig; 
     96                                } 
     97 
     98                                // Resample 
     99                                $image_p = imagecreatetruecolor($width, $height); 
     100                                $image = imagecreatefromjpeg($input['tmp_name']); 
     101                                imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 
     102 
     103                                // Build output metadata struct 
     104                                $output = array(); 
     105                                $output['tmp_name'] = tempnam("/tmp", session_id()); 
     106                                $output['type'] = "image/png"; 
     107                                $output['name'] = $input['name']; 
     108 
     109                                // Output PNG at full compression (no artefact) 
     110                                imagepng($image_p, $output['tmp_name'], 9); 
     111 
     112                                // Write new file size 
     113                                $output['size'] = filesize($output['tmp_name']); 
     114                        } 
     115                } 
     116                return true; 
     117        } 
    64118} 
    65119 
  • trunk/wifidog-auth/wifidog/classes/Content/File/File.php

    r1206 r1226  
    11<?php 
     2 
    23 
    34/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ 
     
    6364{ 
    6465 
    65     /** 
    66      * File size unit: Byte 
    67  
    68      */ 
    69     const UNIT_BYTES = 1; 
    70  
    71     /** 
    72      * File size unit: KB 
    73  
    74      */ 
    75     const UNIT_KILOBYTES = 1024; 
    76  
    77     /** 
    78      * File size unit: MB 
    79  
    80      */ 
    81     const UNIT_MEGABYTES = 1048576; 
    82  
    83     /** 
    84      * File size unit: GB 
    85  
    86      */ 
    87     const UNIT_GIGABYTES = 1073741824; 
    88  
    89         /** Can the user edit the filename */ 
    90                 private $configEnableEditFilename = true; 
    91                  
    92                         /** Can the user edit the mime type */ 
    93                 private $configEnableEditMimeType = true; 
    94     /** 
    95      * Constructor 
    96      * 
    97      * @param string $content_id Content id 
    98      */ 
    99     protected function __construct($content_id) 
    100     { 
    101          
    102         $db = AbstractDb::getObject(); 
    103  
    104         // Init values 
    105         $row = null; 
    106         parent :: __construct($content_id); 
    107  
    108         $content_id = $db->escapeString($content_id); 
    109         $sql = "SELECT * FROM content_file WHERE files_id='$content_id'"; 
    110         $db->execSqlUniqueRes($sql, $row, false); 
    111  
    112         if ($row == null) { 
    113             /* 
    114              * Since the parent Content exists, the necessary data in 
    115              * content_group had not yet been created 
    116              */ 
    117             $sql = "INSERT INTO content_file (files_id) VALUES ('$content_id')"; 
    118             $db->execSqlUpdate($sql, false); 
    119  
    120             $sql = "SELECT * FROM content_file WHERE files_id='$content_id'"; 
    121             $db->execSqlUniqueRes($sql, $row, false); 
    122  
    123             if ($row == null) { 
    124                 throw new Exception(_("The content with the following id could not be found in the database: ").$content_id); 
    125             } 
    126         } 
    127  
    128         $this->mBd = &$db; 
    129         $this->files_row = $row; 
    130     } 
    131  
    132     /** 
    133      * Set Binary data from a POST form data field 
    134      * 
    135      * @param string $upload_field The form field that contains the data 
    136      * 
    137      * @return bool True if successful 
    138  
    139      */ 
    140     private function setBinaryDataFromPostVar($upload_field) 
    141     { 
    142         // Init values 
    143         $_retval = false; 
    144  
    145         if (!empty ($_FILES[$upload_field]) && $_FILES[$upload_field]['error'] == UPLOAD_ERR_OK) { 
    146             // Unlink BLOB if any exists 
    147             $blob_oid = $this->getBinaryDataOid(); 
    148  
    149             if ($blob_oid) { 
    150                 $this->mBd->unlinkLargeObject($blob_oid); 
    151             } 
    152  
    153             // Updating database 
    154             // Create a new BLOB 
    155             $new_oid = $this->mBd->importLargeObject($_FILES[$upload_field]['tmp_name']); 
    156             // Switch to new OID and touch file 
    157             $this->setBinaryDataOid($new_oid); 
    158             $this->setLocalFileSize($_FILES[$upload_field]['size']); 
    159             $this->setMimeType($_FILES[$upload_field]['type']); 
    160             $this->setFilename($_FILES[$upload_field]['name']); 
    161  
    162             $_retval = true; 
    163         } else { 
    164             switch ($_FILES[$upload_field]['error']) 
    165             { 
    166             case 'UPLOAD_ERR_INI_SIZE': 
    167                 echo _("File size exceeds limit specified in PHP.ini"); 
    168                 break; 
    169  
    170             case 'UPLOAD_ERR_FORM_SIZE': 
    171                 echo _("File size exceeds limit specified HTML form"); 
    172                 break; 
    173  
    174             case 'UPLOAD_ERR_PARTIAL': 
    175                 echo _("File upload was interrupted"); 
    176                 break; 
    177  
    178             case 'UPLOAD_ERR_NO_TMP_DIR': 
    179                 echo _("Missing temp folder"); 
    180                 break; 
    181  
    182             } 
    183         } 
    184  
    185         return $_retval; 
    186     } 
    187  
    188     /** 
    189      * Returns the binary data from the database 
    190      * 
    191      * @return string Binary data from the database 
    192  
    193      */ 
    194     private function getBinaryDataOid() 
    195     { 
    196         return $this->mBd->unescapeBinaryString($this->files_row['data_blob']); 
    197     } 
    198  
    199     /** 
    200      * Saves the binary data to the database 
    201      * 
    202      * @param string $oid Binary data 
    203      * 
    204      * @return void 
    205  
    206      */ 
    207     private function setBinaryDataOid($oid) 
    208     { 
    209         if (is_null($oid)) { 
    210             $oid_sql = "NULL"; 
    211         } 
    212         else 
    213         { 
    214                 $oid_sql = $this->mBd->escapeString($oid); 
    215         } 
    216         if($this->files_row['data_blob']!=$oid){ 
    217         $this->mBd->execSqlUpdate("UPDATE content_file SET data_blob = $oid WHERE files_id='".$this->getId()."'", false); 
    218         // Touch and refresh this object 
    219         $this->touch(); 
    220         } 
    221     } 
    222  
    223     /** 
    224      * Is the MimeType editable 
    225      * @param $enabled Default is true 
    226      */ 
    227     protected function configEnableEditMimeType($enabled=true) 
    228     { 
    229         return $this->configEnableEditMimeType=$enabled; 
    230     } 
    231      
    232     /** 
    233      * Returns the MIME type of the file 
    234      * 
    235      * @return string MIME type of file 
    236      */ 
    237     public function getMimeType() 
    238     { 
    239         return $this->files_row['mime_type']; 
    240     } 
    241  
    242     /** 
    243      * Saves the MIME type of the file 
    244      * 
    245      * @param string $mime_type 
    246      * 
    247      * @return void 
    248      */ 
    249     private function setMimeType($mime_type) 
    250     { 
    251         $mime_type = $this->mBd->escapeString($mime_type); 
    252         $this->mBd->execSqlUpdate("UPDATE content_file SET mime_type ='".$mime_type."' WHERE files_id='".$this->getId()."'", false); 
    253         // Touch and refresh this object 
    254         $this->touch(); 
    255     } 
    256  
    257     /** 
    258      * Is the filename editable 
    259      * @param $enabled Default is true 
    260      */ 
    261     protected function configEnableEditFilename($enabled=true) 
    262     { 
    263         return $this->configEnableEditFilename=$enabled; 
    264     } 
    265      
    266     /** 
    267      * Returns the filename of the file 
    268      * 
    269      * @return string Filename of file 
    270  
    271      */ 
    272     protected function getFilename() 
    273     { 
    274         return $this->files_row['filename']; 
    275     } 
    276  
    277     /** 
    278      * Stores the filename of the file 
    279      * 
    280      * @param string $file_name Filename of the file 
    281      * 
    282      * @return void 
    283      */ 
    284     private function setFilename($file_name) 
    285     { 
    286         $file_name = $this->mBd->escapeString($file_name); 
    287         $this->mBd->execSqlUpdate("UPDATE content_file SET filename ='".$file_name."' WHERE files_id='".$this->getId()."'", false); 
    288         // Touch and refresh this object 
    289         $this->touch(); 
    290     } 
    291  
    292     /** 
    293      * Returns the size of the file 
    294      * 
    295      * @param string $unit Name of constant of which kind of filesize unit 
    296      *                     to use 
    297      *                     Possibilities: 
    298      *                       + self::UNIT_BYTES 
    299      *                       + self::UNIT_KILOBYTES 
    300      *                       + self::MEGABYTES 
    301      *                       + self::GIGABYTES 
    302      * 
    303      * @return float Size of file 
    304      */ 
    305     protected function getFileSize($unit = self::UNIT_BYTES) 
    306     { 
    307         if ($this->isLocalFile()) { 
    308             $size = $this->files_row['local_binary_size']; 
    309         } else { 
    310             $size = $this->files_row['remote_size']; 
    311         } 
    312  
    313         switch ($unit) { 
    314         case self::UNIT_KILOBYTES: 
    315         case self::UNIT_MEGABYTES: 
    316         case self::UNIT_GIGABYTES: 
    317         case self::UNIT_BYTES: 
    318             $size = round($size / $unit, 2); 
    319             break; 
    320  
    321         } 
    322  
    323         return $size; 
    324     } 
    325  
    326     /** 
    327      * Sets the size of a local file 
    328      * 
    329      * @param int    $size Size of file 
    330      * @param string $unit Name of constant of which kind of filesize unit 
    331      *                     to use 
    332      *                     Possibilities: 
    333      *                       + self::UNIT_BYTES 
    334      *                       + self::UNIT_KILOBYTES 
    335      *                       + self::MEGABYTES 
    336      *                       + self::GIGABYTES 
    337      * 
    338      * @return void 
    339      */ 
    340     private function setLocalFileSize($size, $unit = self::UNIT_BYTES) 
    341     { 
    342         if (is_numeric($size)) { 
    343             $octet_size = $size * $unit; 
    344  
    345             $this->mBd->execSqlUpdate("UPDATE content_file SET local_binary_size = $octet_size WHERE files_id='" . $this->getId() . "'", false); 
    346             $this->refresh(); 
    347         } 
    348     } 
    349  
    350     /** 
    351      * Sets the size of a remote file 
    352      * 
    353      * @param int    $size Size of file 
    354      * @param string $unit Name of constant of which kind of filesize unit 
    355      *                     to use 
    356      *                     Possibilities: 
    357      *                       + self::UNIT_BYTES 
    358      *                       + self::UNIT_KILOBYTES 
    359      *                       + self::MEGABYTES 
    360      *                       + self::GIGABYTES 
    361      * 
    362      * @return void 
    363  
    364      */ 
    365     private function setRemoteFileSize($size, $unit = self::UNIT_KILOBYTES) 
    366     { 
    367         if (is_numeric($size)) { 
    368             $octet_size = $size * $unit; 
    369  
    370             $this->mBd->execSqlUpdate("UPDATE content_file SET remote_size = $octet_size WHERE files_id='".$this->getId()."'", false); 
    371             $this->refresh(); 
    372         } 
    373     } 
    374  
    375     /** 
    376      * Get URL of file 
    377      * 
    378      * @return string URL of file 
    379      */ 
    380     public function getFileUrl() 
    381     { 
    382         // Init values 
    383         $_retval = null; 
    384  
    385         if (!$this->isLocalFile()) { 
    386             $_retval = $this->files_row['url']; 
    387         } else { 
    388             $_retval = BASE_SSL_PATH . "file_download.php?file_id=" . $this->getId(); 
    389         } 
    390  
    391         return $_retval; 
    392     } 
    393  
    394     /** 
    395      * Sets URL of a file 
    396      * 
    397      * @param string $url 
    398      * 
    399      * @return void 
    400  
    401      */ 
    402     private function setURL($url) 
    403     { 
    404         if ($url == null) { 
    405             $url_sql = "NULL"; 
    406         } else { 
    407             $url_sql = "'".$this->mBd->escapeString($url)."'"; 
    408         } 
    409                 if($this->files_row['url']!=$url){ 
    410          
    411         $this->mBd->execSqlUpdate("UPDATE content_file SET url = $url_sql WHERE files_id='".$this->getId()."'", false); 
    412         $this->refresh(); 
    413                 } 
    414     } 
    415  
    416     /** 
    417      * Returns if file is a local file 
    418      * 
    419      * @return bool True if file is local 
    420      */ 
    421     protected function isLocalFile() 
    422     { 
    423         return is_null($this->files_row['url']); 
    424     } 
    425  
    426     /** 
    427      * Shows the administration interface for RssAggregator. 
    428      * 
    429      * @param string $subclass_admin_interface HTML code to be added after the 
    430      *                                         administration interface 
    431      * 
    432      * @return string HTML code for the administration interface 
    433      */ 
    434     public function getAdminUI($subclass_admin_interface = null, $title=null) 
    435     { 
    436         // Init values 
    437         $html = ''; 
    438  
    439         $html .= "<li class='admin_element_item_container'>\n"; 
    440         $html .= "<div class='admin_element_data'>\n"; 
    441         $html .= "<input type='radio' name='file_mode".$this->getId()."' value='by_upload' ". ($this->isLocalFile() ? "CHECKED" : "")." />"; 
    442         $html .= _("Upload a new file (Uploading a new one will replace any existing file)")." : \n"; 
    443         $html .= '<input type="hidden" name="MAX_FILE_SIZE" value="1073741824" />'; 
    444         $html .= '<input name="file_file_upload'.$this->getId().'" type="file" />'; 
    445         $html .= "</div>\n"; 
    446         $html .= "</li>\n"; 
    447  
    448         $html .= "<li class='admin_element_item_container'>\n"; 
    449         $html .= "<div class='admin_element_data'>\n"; 
    450         $html .= "<input type='radio' name='file_mode".$this->getId()."' value='remote' ". (!$this->isLocalFile() ? "CHECKED" : "").">"; 
    451         $html .= _("Remote file via URL")." : \n"; 
    452  
    453  
    454         if ($this->isLocalFile()) { 
    455             $html .= "<input name='file_url".$this->getId()."' type='text' size='50'/>"; 
    456         } else { 
    457             $html .= "<input name='file_url".$this->getId()."' type='text' size='50' value='".$this->getFileUrl()."'/>"; 
    458         } 
    459  
    460         $html .= "</div>\n"; 
    461         $html .= "</li>\n"; 
    462  
    463         if (!$this->isLocalFile()) { 
    464             $html .= "<div class='admin_element_item_container'>\n"; 
    465             $html .= "<div class='admin_element_label'>"._("File URL")." : </div>\n"; 
    466             $html .= "<div class='admin_element_data'>\n"; 
    467             $html .= $this->getFileUrl(); 
    468             $html .= "</div>\n"; 
    469             $html .= "</li>\n"; 
    470         } 
    471          
    472 if($this->configEnableEditFilename) { 
    473         $html .= "<li class='admin_element_item_container'>\n"; 
    474         $html .= "<div class='admin_element_label'>"._("Filename to display")." : </div>\n"; 
    475         $html .= "<div class='admin_element_data'>\n"; 
    476         $html .= '<input type="text" name="file_file_name'.$this->getId().'" value="'.$this->getFilename().'" />'; 
    477         $html .= "</div>\n"; 
    478         $html .= "</li>\n"; 
    479 } 
    480  
    481         if ($this->isLocalFile()) { 
    482                 if($this->configEnableEditMimeType){ 
    483             $html .= "<li class='admin_element_item_container'>\n"; 
    484             $html .= "<div class='admin_element_label'>"._("MIME type")." : </div>\n"; 
    485             $html .= "<div class='admin_element_data'>\n"; 
    486             $html .= '<input type="text" name="file_mime_type'.$this->getId().'" value="'.$this->getMimeType().'" />'; 
    487             $html .= "</div>\n"; 
    488             $html .= "</li>\n"; 
    489                 } 
    490  
    491             $html .= "<li class='admin_element_item_container'>\n"; 
    492             $html .= "<div class='admin_element_data'>"._("Locally stored file size")." : \n"; 
    493             $html .= $this->getFileSize(self :: UNIT_KILOBYTES)." "._("KB"); 
    494         } else { 
    495             $html .= "<div class='admin_element_item_container'>\n"; 
    496             $html .= "<div class='admin_element_label'>"._("Remote file size (Automatically converted from KB to Bytes)")." : </div>\n"; 
    497             $html .= "<div class='admin_element_data'>\n"; 
    498             // The hidden field contains old value to determine if we have to update ( this prevents unwanted successive floating point evaluation ) 
    499             $html .= '<input type="hidden" name="file_old_remote_size'.$this->getId().'" value="'.$this->getFileSize().'" />'; 
    500             $html .= '<input type="text" name="file_remote_size'.$this->getId().'" value="'.$this->getFileSize().'" />'; 
    501  
    502         } 
    503                 $html .= " <a href='".$this->getFileUrl()."'>"._("Download")."</a>\n"; 
    504         $html .= " "._("Last update")." : \n"; 
    505                     $html .= $this->getLastUpdateTimestamp(); 
    506                 $html .= "</div>\n"; 
    507             $html .= "</li>\n"; 
    508  
    509         $html .= $subclass_admin_interface; 
    510  
    511         return parent::getAdminUI($html, $title); 
    512     } 
    513  
    514     /** 
    515      * Processes the input of the administration interface for RssAggregator 
    516      * 
    517      * @return void 
    518      */ 
    519     public function processAdminUI() 
    520     { 
    521         //echo "File::processAdminUI()<br/>\n"; 
    522         if ($this->isOwner(User :: getCurrentUser()) || User :: getCurrentUser()->isSuperAdmin()) { 
    523             parent :: processAdminUI(); 
    524  
    525             // If no file was uploaded, update filename and mime type 
    526             if (!empty ($_REQUEST["file_mode".$this->getId()])) { 
    527                 if ($this->configEnableEditFilename && !empty($_REQUEST["file_file_name".$this->getId()])) { 
    528                     $this->setFilename($_REQUEST["file_file_name".$this->getId()]); 
    529                 } 
    530  
    531                 $file_mode = $_REQUEST["file_mode".$this->getId()]; 
    532  
    533                 if ($file_mode == "by_upload") { 
    534                     if($this->configEnableEditMimeType &&isset($_REQUEST["file_mime_type".$this->getId()])) { 
    535                         $this->setMimeType($_REQUEST["file_mime_type".$this->getId()]); 
    536                     } 
    537  
    538                     $this->setBinaryDataFromPostVar("file_file_upload".$this->getId()); 
    539                     $this->setURL(null); 
    540  
    541                     // Reset the remote file size ( not used ) 
    542                     $this->setRemoteFileSize(0); 
    543                 } else { 
    544                     if ($file_mode == "remote") { 
    545                         $this->setURL($_REQUEST["file_url".$this->getId()]); 
    546                         $this->setBinaryDataOid(null); 
    547  
    548                         // When switching from local to remote, this field does not exist yet 
    549                         if (isset($_REQUEST["file_old_remote_size".$this->getId()])) { 
    550                             if ($_REQUEST["file_remote_size".$this->getId()] != $_REQUEST["file_old_remote_size".$this->getId()]) { 
    551                                 $this->setRemoteFileSize($_REQUEST["file_remote_size".$this->getId()]); 
    552                             } 
    553                         } else { 
    554                             $this->setRemoteFileSize(0); 
    555                         } 
    556                     } 
    557                 } 
    558             } 
    559         } 
    560     } 
    561  
    562     /** 
    563      * Retreives the user interface of this object. 
    564      * 
    565      * @return string The HTML fragment for this interface 
    566      */ 
    567     public function getUserUI() 
    568     { 
    569         // Init values 
    570         $html = ''; 
    571  
    572         if($this->getFileSize() > 0) { 
    573             $append_size = " (".$this->getFileSize(self :: UNIT_KILOBYTES)." "._("KB").")"; 
    574         } else { 
    575             $append_size = ""; 
    576         } 
    577  
    578         $html .= "<div class='download_button'><a href='".htmlentities($this->getFileUrl())."'>"._("Download")." ".$this->getFilename()."$append_size</a></div>"; 
    579         $html = $this->replaceHyperLinks($html); 
    580         $this->setUserUIMainDisplayContent($html); 
    581         return parent::getUserUI(); 
    582     } 
    583  
    584     /** 
    585      * Reloads the object from the database. Should normally be called after 
    586      * a set operation. This function is private because calling it from a 
    587      * subclass will call the constructor from the wrong scope. 
    588      * 
    589      * @return void 
    590      */ 
    591     private function refresh() 
    592     { 
    593         $this->__construct($this->id); 
    594     } 
    595  
    596     /** 
    597      * Deletes a File object 
    598      * 
    599      * @param string $errmsg Reference to error message 
    600      * 
    601      * @return bool True if deletion was successful 
    602      * @internal Persistent content will not be deleted 
    603      */ 
    604     public function delete(&$errmsg) 
    605     { 
    606         if ($this->isPersistent() == false) { 
    607             // Unlink BLOB if any exists 
    608             $blob_oid = $this->getBinaryDataOid(); 
    609  
    610             if($blob_oid) { 
    611                 $errmsg = "Deleting BLOB OID : $blob_oid"; 
    612  
    613                 if($this->mBd->UnlinkLargeObject($blob_oid) == false) { 
    614                     $errmsg = _("Unable to successfully unlink BLOB OID : $blob_oid !"); 
    615                     return false; 
    616                 } 
    617             } 
    618  
    619             $this->mBd->execSqlUpdate("DELETE FROM content_file WHERE files_id = '".$this->getId()."'", false); 
    620         } else { 
    621             $errmsg = _("Could not delete this file, since it is persistent"); 
    622         } 
    623  
    624         return parent::delete($errmsg); 
    625     } 
     66        /** 
     67         * File size unit: Byte 
     68 
     69         */ 
     70        const UNIT_BYTES = 1; 
     71 
     72        /** 
     73         * File size unit: KB 
     74 
     75         */ 
     76        const UNIT_KILOBYTES = 1024; 
     77 
     78        /** 
     79         * File size unit: MB 
     80 
     81         */ 
     82        const UNIT_MEGABYTES = 1048576; 
     83 
     84        /** 
     85         * File size unit: GB 
     86 
     87         */ 
     88        const UNIT_GIGABYTES = 1073741824; 
     89 
     90        /** Can the user edit the filename */ 
     91        private $configEnableEditFilename = true; 
     92 
     93        /** Can the user edit the mime type */ 
     94        private $configEnableEditMimeType = true; 
     95 
     96        // Should the admin UI display metadata about the file 
     97        private $fileMetadataVerboseFlag = true; 
     98 
     99        /** 
     100         * Constructor 
     101         * 
     102         * @param string $content_id Content id 
     103         */ 
     104        protected function __construct($content_id) 
     105        { 
     106 
     107                $db = AbstractDb :: getObject(); 
     108 
     109                // Init values 
     110                $row = null; 
     111                parent :: __construct($content_id); 
     112 
     113                $content_id = $db->escapeString($content_id); 
     114                $sql = "SELECT * FROM content_file WHERE files_id='$content_id'"; 
     115                $db->execSqlUniqueRes($sql, $row, false); 
     116 
     117                if ($row == null) 
     118                { 
     119                        /* 
     120                         * Since the parent Content exists, the necessary data in 
     121                         * content_group had not yet been created 
     122                         */ 
     123                        $sql = "INSERT INTO content_file (files_id) VALUES ('$content_id')"; 
     124                        $db->execSqlUpdate($sql, false); 
     125 
     126                        $sql = "SELECT * FROM content_file WHERE files_id='$content_id'"; 
     127                        $db->execSqlUniqueRes($sql, $row, false); 
     128 
     129                        if ($row == null) 
     130                        { 
     131                                throw new Exception(_("The content with the following id could not be found in the database: ") . $content_id); 
     132                        } 
     133                } 
     134 
     135                $this->mBd = & $db; 
     136                $this->files_row = $row; 
     137        } 
     138 
     139        public function setFileMetadataVerbose($flag) { 
     140                if(is_bool($flag)) 
     141                        $this->metadataVerboseFlag = $flag; 
     142        } 
     143 
     144        /** 
     145         * Validates the uploaded file and return a boolean to tell if valid 
     146         * This method should be overridden when you need to write special validation scripts 
     147         * 
     148         * @param string path to input file 
     149         * @param string path to output file (by ref.), making sure you create a struct that matches the $_FILES[][] format 
     150         * 
     151         * @return boolean 
     152         */ 
     153        protected function validateUploadedFile($input, &$output) { 
     154                return true; 
     155        } 
     156 
     157        /** 
     158         * Set Binary data from a POST form data field 
     159         * 
     160         * @param string $upload_field The form field that contains the data 
     161         * 
     162         * @return bool True if successful 
     163 
     164         */ 
     165        private function setBinaryDataFromPostVar($upload_field) 
     166        { 
     167                // Init values 
     168                $_retval = false; 
     169                $output = null; 
     170 
     171                if (!empty ($_FILES[$upload_field]) && $_FILES[$upload_field]['error'] == UPLOAD_ERR_OK && $this->validateUploadedFile($_FILES[$upload_field], $output)) 
     172                { 
     173                        // Unlink BLOB if any exists 
     174                        $blob_oid = $this->getBinaryDataOid(); 
     175 
     176                        if ($blob_oid) 
     177                        { 
     178                                $this->mBd->unlinkLargeObject($blob_oid); 
     179                        } 
     180 
     181                        if(empty($output)) { 
     182                                // input hasn't changed during validation 
     183                                $output = $_FILES[$upload_field]; 
     184                        } 
     185 
     186                        // Updating database 
     187                        // Create a new BLOB 
     188                        $new_oid = $this->mBd->importLargeObject($output['tmp_name']); 
     189                        // Switch to new OID and touch file 
     190                        $this->setBinaryDataOid($new_oid); 
     191                        $this->setLocalFileSize($output['size']); 
     192                        $this->setMimeType($output['type']); 
     193                        $this->setFilename($output['name']); 
     194 
     195                        $_retval = true; 
     196                } 
     197                else 
     198                { 
     199                        switch ($_FILES[$upload_field]['error']) 
     200                        { 
     201                                case 'UPLOAD_ERR_INI_SIZE' : 
     202                                        echo _("File size exceeds limit specified in PHP.ini"); 
     203                                        break; 
     204 
     205                                case 'UPLOAD_ERR_FORM_SIZE' : 
     206                                        echo _("File size exceeds limit specified HTML form"); 
     207                                        break; 
     208 
     209                                case 'UPLOAD_ERR_PARTIAL' : 
     210                                        echo _("File upload was interrupted"); 
     211                                        break; 
     212 
     213                                case 'UPLOAD_ERR_NO_TMP_DIR' : 
     214                                        echo _("Missing temp folder"); 
     215                                        break; 
     216 
     217                        } 
     218                } 
     219 
     220                return $_retval; 
     221        } 
     222 
     223        /** 
     224         * Returns the binary data from the database 
     225         * 
     226         * @return string Binary data from the database 
     227 
     228         */ 
     229        private function getBinaryDataOid() 
     230        { 
     231                return $this->mBd->unescapeBinaryString($this->files_row['data_blob']); 
     232        } 
     233 
     234        /** 
     235         * Saves the binary data to the database 
     236         * 
     237         * @param string $oid Binary data 
     238         * 
     239         * @return void 
     240 
     241         */ 
     242        private function setBinaryDataOid($oid) 
     243        { 
     244                if (is_null($oid)) 
     245                { 
     246                        $oid_sql = "NULL"; 
     247                } 
     248                else 
     249                { 
     250                        $oid_sql = $this->mBd->escapeString($oid); 
     251                } 
     252                if ($this->files_row['data_blob'] != $oid) 
     253                { 
     254                        $this->mBd->execSqlUpdate("UPDATE content_file SET data_blob = $oid WHERE files_id='" . $this->getId() . "'", false); 
     255                        // Touch and refresh this object 
     256                        $this->touch(); 
     257                } 
     258        } 
     259 
     260        /** 
     261         * Is the MimeType editable 
     262         * @param $enabled Default is true 
     263         */ 
     264        protected function configEnableEditMimeType($enabled = true) 
     265        { 
     266                return $this->configEnableEditMimeType = $enabled; 
     267        } 
     268 
     269        /** 
     270         * Returns the MIME type of the file 
     271         * 
     272         * @return string MIME type of file 
     273         */ 
     274        public function getMimeType() 
     275        { 
     276                return $this->files_row['mime_type']; 
     277        } 
     278 
     279        /** 
     280         * Saves the MIME type of the file 
     281         * 
     282         * @param string $mime_type 
     283         * 
     284         * @return void 
     285         */ 
     286        private function setMimeType($mime_type) 
     287        { 
     288                $mime_type = $this->mBd->escapeString($mime_type); 
     289                $this->mBd->execSqlUpdate("UPDATE content_file SET mime_type ='" . $mime_type . "' WHERE files_id='" . $this->getId() . "'", false); 
     290                // Touch and refresh this object 
     291                $this->touch(); 
     292        } 
     293 
     294        /** 
     295         * Is the filename editable 
     296         * @param $enabled Default is true 
     297         */ 
     298        protected function configEnableEditFilename($enabled = true) 
     299        { 
     300                return $this->configEnableEditFilename = $enabled; 
     301        } 
     302 
     303        /** 
     304         * Returns the filename of the file 
     305         * 
     306         * @return string Filename of file 
     307 
     308         */ 
     309        protected function getFilename() 
     310        { 
     311                return $this->files_row['filename']; 
     312        } 
     313 
     314        /** 
     315         * Stores the filename of the file 
     316         * 
     317         * @param string $file_name Filename of the file 
     318         * 
     319         * @return void 
     320         */ 
     321        private function setFilename($file_name) 
     322        { 
     323                $file_name = $this->mBd->escapeString($file_name); 
     324                $this->mBd->execSqlUpdate("UPDATE content_file SET filename ='" . $file_name . "' WHERE files_id='" . $this->getId() . "'", false); 
     325                // Touch and refresh this object 
     326                $this->touch(); 
     327        } 
     328 
     329        /** 
     330         * Returns the size of the file 
     331         * 
     332         * @param string $unit Name of constant of which kind of filesize unit 
     333         *                     to use 
     334         *                     Possibilities: 
     335         *                       + self::UNIT_BYTES 
     336         *                       + self::UNIT_KILOBYTES 
     337         *                       + self::MEGABYTES 
     338         *                       + self::GIGABYTES 
     339         * 
     340         * @return float Size of file 
     341         */ 
     342        protected function getFileSize($unit = self :: UNIT_BYTES) 
     343        { 
     344                if ($this->isLocalFile()) 
     345                { 
     346                        $size = $this->files_row['local_binary_size']; 
     347                } 
     348                else 
     349                { 
     350                        $size = $this->files_row['remote_size']; 
     351                } 
     352 
     353                switch ($unit) 
     354                { 
     355                        case self :: UNIT_KILOBYTES : 
     356                        case self :: UNIT_MEGABYTES : 
     357                        case self :: UNIT_GIGABYTES : 
     358                        case self :: UNIT_BYTES : 
     359                                $size = round($size / $unit, 2); 
     360                                break; 
     361 
     362                } 
     363 
     364                return $size; 
     365        } 
     366 
     367        /** 
     368         * Sets the size of a local file 
     369         * 
     370         * @param int    $size Size of file 
     371         * @param string $unit Name of constant of which kind of filesize unit 
     372         *                     to use 
     373         *                     Possibilities: 
     374         *                       + self::UNIT_BYTES 
     375         *                       + self::UNIT_KILOBYTES 
     376         *                       + self::MEGABYTES 
     377         *                       + self::GIGABYTES 
     378         * 
     379         * @return void 
     380         */ 
     381        private function setLocalFileSize($size, $unit = self :: UNIT_BYTES) 
     382        { 
     383                if (is_numeric($size)) 
     384                { 
     385                        $octet_size = $size * $unit; 
     386 
     387                        $this->mBd->execSqlUpdate("UPDATE content_file SET local_binary_size = $octet_size WHERE files_id='" . $this->getId() . "'", false); 
     388                        $this->refresh(); 
     389                } 
     390        } 
     391 
     392        /** 
     393         * Sets the size of a remote file 
     394         * 
     395         * @param int    $size Size of file 
     396         * @param string $unit Name of constant of which kind of filesize unit 
     397         *                     to use 
     398         *                     Possibilities: 
     399         *                       + self::UNIT_BYTES 
     400         *                       + self::UNIT_KILOBYTES 
     401         *                       + self::MEGABYTES 
     402         *                       + self::GIGABYTES 
     403         * 
     404         * @return void 
     405 
     406         */ 
     407        private function setRemoteFileSize($size, $unit = self :: UNIT_KILOBYTES) 
     408        { 
     409                if (is_numeric($size)) 
     410                { 
     411                        $octet_size = $size * $unit; 
     412 
     413                        $this->mBd->execSqlUpdate("UPDATE content_file SET remote_size = $octet_size WHERE files_id='" . $this->getId() . "'", false); 
     414                        $this->refresh(); 
     415                } 
     416        } 
     417 
     418        /** 
     419         * Get URL of file 
     420         * 
     421         * @return string URL of file 
     422         */ 
     423        public function getFileUrl() 
     424        { 
     425                // Init values 
     426                $_retval = null; 
     427 
     428                if (!$this->isLocalFile()) 
     429                { 
     430                        $_retval = $this->files_row['url']; 
     431                } 
     432                else 
     433                { 
     434                        $_retval = BASE_SSL_PATH . "file_download.php?file_id=" . $this->getId(); 
     435                } 
     436 
     437                return $_retval; 
     438        } 
     439 
     440        /** 
     441         * Sets URL of a file 
     442         * 
     443         * @param string $url 
     444         * 
     445         * @return void 
     446 
     447         */ 
     448        private function setURL($url) 
     449        { 
     450                if ($url == null) 
     451                { 
     452                        $url_sql = "NULL"; 
     453                } 
     454                else 
     455                { 
     456                        $url_sql = "'" . $this->mBd->escapeString($url) . "'"; 
     457                } 
     458                if ($this->files_row['url'] != $url) 
     459                { 
     460 
     461                        $this->mBd->execSqlUpdate("UPDATE content_file SET url = $url_sql WHERE files_id='" . $this->getId() . "'", false); 
     462                        $this->refresh(); 
     463                } 
     464        } 
     465 
     466        /** 
     467         * Returns if file is a local file 
     468         * 
     469         * @return bool True if file is local 
     470         */ 
     471        protected function isLocalFile() 
     472        { 
     473                return is_null($this->files_row['url']); 
     474        } 
     475 
     476        /** 
     477         * Shows the administration interface for RssAggregator. 
     478         * 
     479         * @param string $subclass_admin_interface HTML code to be added after the 
     480         *                                         administration interface 
     481         * 
     482         * @return string HTML code for the administration interface 
     483         */ 
     484        public function getAdminUI($subclass_admin_interface = null, $title = null) 
     485        { 
     486                // Init values 
     487                $html = ''; 
     488 
     489                $html .= "<li class='admin_element_item_container'>\n"; 
     490                $html .= "<div class='admin_element_data'>\n"; 
     491                $html .= "<input type='radio' name='file_mode" . $this->getId() . "' value='by_upload' " . ($this->isLocalFile() ? "CHECKED" : "") . " />"; 
     492                $html .= _("Upload a new file (Uploading a new one will replace any existing file)") . " : \n"; 
     493                $html .= '<input type="hidden" name="MAX_FILE_SIZE" value="1073741824" />'; 
     494                $html .= '<input name="file_file_upload' . $this->getId() . '" type="file" />'; 
     495                $html .= "</div>\n"; 
     496                $html .= "</li>\n"; 
     497 
     498                $html .= "<li class='admin_element_item_container'>\n"; 
     499                $html .= "<div class='admin_element_data'>\n"; 
     500                $html .= "<input type='radio' name='file_mode" . $this->getId() . "' value='remote' " . (!$this->isLocalFile() ? "CHECKED" : "") . ">"; 
     501                $html .= _("Remote file via URL") . " : \n"; 
     502 
     503                if ($this->isLocalFile()) 
     504                { 
     505                        $html .= "<input name='file_url" . $this->getId() . "' type='text' size='50'/>"; 
     506                } 
     507                else 
     508                { 
     509                        $html .= "<input name='file_url" . $this->getId() . "' type='text' size='50' value='" . $this->getFileUrl() . "'/>"; 
     510                } 
     511 
     512                $html .= "</div>\n"; 
     513                $html .= "</li>\n"; 
     514 
     515                if (!$this->isLocalFile()) 
     516                { 
     517                        $html .= "<div class='admin_element_item_container'>\n"; 
     518                        $html .= "<div class='admin_element_label'>" . _("File URL") . " : </div>\n"; 
     519                        $html .= "<div class='admin_element_data'>\n"; 
     520                        $html .= $this->getFileUrl(); 
     521                        $html .= "</div>\n"; 
     522                        $html .= "</li>\n"; 
     523                } 
     524 
     525                if ($this->configEnableEditFilename) 
     526                { 
     527                        $html .= "<li class='admin_element_item_container'>\n"; 
     528                        $html .= "<div class='admin_element_label'>" . _("Filename to display") . " : </div>\n"; 
     529                        $html .= "<div class='admin_element_data'>\n"; 
     530                        $html .= '<input type="text" name="file_file_name' . $this->getId() . '" value="' . $this->getFilename() . '" />'; 
     531                        $html .= "</div>\n"; 
     532                        $html .= "</li>\n"; 
     533                } 
     534 
     535                if ($this->isLocalFile()) 
     536                { 
     537                        if ($this->configEnableEditMimeType) 
     538                        { 
     539                                $html .= "<li class='admin_element_item_container'>\n"; 
     540                                $html .= "<div class='admin_element_label'>" . _("MIME type") . " : </div>\n"; 
     541                                $html .= "<div class='admin_element_data'>\n"; 
     542                                $html .= '<input type="text" name="file_mime_type' . $this->getId() . '" value="' . $this->getMimeType() . '" />'; 
     543                                $html .= "</div>\n"; 
     544                                $html .= "</li>\n"; 
     545                        } 
     546 
     547                        //$html .= "<li class='admin_element_item_container'>\n"; 
     548                        if($this->metadataVerboseFlag == true) { 
     549                                $html .= "<div class='admin_element_data'>" . _("Locally stored file size") . " : \n"; 
     550                                $html .= $this->getFileSize(self :: UNIT_KILOBYTES) . " " . _("KB"); 
     551                        } 
     552                } 
     553                else 
     554                { 
     555                        $html .= "<div class='admin_element_item_container'>\n"; 
     556                        $html .= "<div class='admin_element_label'>" . _("Remote file size (Automatically converted from KB to Bytes)") . " : </div>\n"; 
     557                        $html .= "<div class='admin_element_data'>\n"; 
     558                        // The hidden field contains old value to determine if we have to update ( this prevents unwanted successive floating point evaluation ) 
     559                        $html .= '<input type="hidden" name="file_old_remote_size' . $this->getId() . '" value="' . $this->getFileSize() . '" />'; 
     560                        $html .= '<input type="text" name="file_remote_size' . $this->getId() . '" value="' . $this->getFileSize() . '" />'; 
     561 
     562                } 
     563 
     564                if($this->metadataVerboseFlag == true) { 
     565                        $html .= " <a href='" . $this->getFileUrl() . "'>" . _("Download") . "</a>\n"; 
     566                        $html .= " " . _("Last update") . " : \n"; 
     567                        $html .= $this->getLastUpdateTimestamp(); 
     568                        $html .= "</div>\n"; 
     569                } 
     570                $html .= "</li>\n"; 
     571 
     572                $html .= $subclass_admin_interface; 
     573 
     574                return parent :: getAdminUI($html, $title); 
     575        } 
     576 
     577        /** 
     578         * Processes the input of the administration interface for RssAggregator 
     579         * 
     580         * @return void 
     581         */ 
     582        public function processAdminUI() 
     583        { 
     584                //echo "File::processAdminUI()<br/>\n"; 
     585                if ($this->isOwner(User :: getCurrentUser()) || User :: getCurrentUser()->isSuperAdmin()) 
     586                { 
     587                        parent :: processAdminUI(); 
     588 
     589                        // If no file was uploaded, update filename and mime type 
     590                        if (!empty ($_REQUEST["file_mode" . $this->getId()])) 
     591                        { 
     592                                if ($this->configEnableEditFilename && !empty ($_REQUEST["file_file_name" . $this->getId()])) 
     593                                { 
     594                                        $this->setFilename($_REQUEST["file_file_name" . $this->getId()]); 
     595                                } 
     596 
     597                                $file_mode = $_REQUEST["file_mode" . $this->getId()]; 
     598 
     599                                if ($file_mode == "by_upload") 
     600                                { 
     601                                        if ($this->configEnableEditMimeType && isset ($_REQUEST["file_mime_type" . $this->getId()])) 
     602                                        { 
     603                                                $this->setMimeType($_REQUEST["file_mime_type" . $this->getId()]); 
     604                                        } 
     605 
     606                                        $this->setBinaryDataFromPostVar("file_file_upload" . $this->getId()); 
     607                                        $this->setURL(null); 
     608 
     609                                        // Reset the remote file size ( not used ) 
     610                                        $this->setRemoteFileSize(0); 
     611                                } 
     612                                else 
     613                                { 
     614                                        if ($file_mode == "remote") 
     615                                        { 
     616                                                $this->setURL($_REQUEST["file_url" . $this->getId()]); 
     617                                                $this->setBinaryDataOid(null); 
     618 
     619                                                // When switching from local to remote, this field does not exist yet 
     620                                                if (isset ($_REQUEST["file_old_remote_size" . $this->getId()])) 
     621                                                { 
     622                                                        if ($_REQUEST["file_remote_size" . $this->getId()] != $_REQUEST["file_old_remote_size" . $this->getId()]) 
     623                                                        { 
     624                                                                $this->setRemoteFileSize($_REQUEST["file_remote_size" . $this->getId()]); 
     625                                                        } 
     626                                                } 
     627                                                else 
     628                                                { 
     629                                                        $this->setRemoteFileSize(0); 
     630                                                } 
     631                                        } 
     632                                } 
     633                        } 
     634                } 
     635        } 
     636 
     637        /** 
     638         * Retreives the user interface of this object. 
     639         * 
     640         * @return string The HTML fragment for this interface 
     641         */ 
     642        public function getUserUI() 
     643        { 
     644                // Init values 
     645                $html = ''; 
     646 
     647                if ($this->getFileSize() > 0) 
     648                { 
     649                        $append_size = " (" . $this->getFileSize(self :: UNIT_KILOBYTES) . " " . _("KB") . ")"; 
     650                } 
     651                else 
     652                { 
     653                        $append_size = ""; 
     654                } 
     655 
     656                $html .= "<div class='download_button'><a href='" . htmlentities($this->getFileUrl()) . "'>" . _("Download") . " " . $this->getFilename() . "$append_size</a></div>"; 
     657                $html = $this->replaceHyperLinks($html); 
     658                $this->setUserUIMainDisplayContent($html); 
     659                return parent :: getUserUI(); 
     660        } 
     661 
     662        /** 
     663         * Reloads the object from the database. Should normally be called after 
     664         * a set operation. This function is private because calling it from a 
     665         * subclass will call the constructor from the wrong scope. 
     666         * 
     667         * @return void 
     668         */ 
     669        private function refresh() 
     670        { 
     671                $this->__construct($this->id); 
     672        } 
     673 
     674        /** 
     675         * Deletes a File object 
     676         * 
     677         * @param string $errmsg Reference to error message 
     678         * 
     679         * @return bool True if deletion was successful 
     680         * @internal Persistent content will not be deleted 
     681         */ 
     682        public function delete(& $errmsg) 
     683        { 
     684                if ($this->isPersistent() == false) 
     685                { 
     686                        // Unlink BLOB if any exists 
     687                        $blob_oid = $this->getBinaryDataOid(); 
     688 
     689                        if ($blob_oid) 
     690                        { 
     691                                $errmsg = "Deleting BLOB OID : $blob_oid"; 
     692 
     693                                if ($this->mBd->UnlinkLargeObject($blob_oid) == false) 
     694                                { 
     695                                        $errmsg = _("Unable to successfully unlink BLOB OID : $blob_oid !"); 
     696                                        return false; 
     697                                } 
     698                        } 
     699 
     700                        $this->mBd->execSqlUpdate("DELETE FROM content_file WHERE files_id = '" . $this->getId() . "'", false); 
     701                } 
     702                else 
     703                { 
     704                        $errmsg = _("Could not delete this file, since it is persistent"); 
     705                } 
     706 
     707                return parent :: delete($errmsg); 
     708        } 
    626709 
    627710} 
     
    634717 * End: 
    635718 */ 
    636  
    637  
  • trunk/wifidog-auth/wifidog/classes/Content/HTMLeditor/HTMLeditor.php

    r1192 r1226  
    6464 
    6565     */ 
    66     private $_FCKeditorAvailable = false; 
     66    protected $_FCKeditorAvailable = false; 
    6767 
    6868    /** 
     
    8484        } 
    8585    } 
    86      
     86 
    8787    /** Indicate that the content is suitable to store plain text. 
    8888     * @return true or false */ 
    8989    public function isTextualContent() { 
    90         return false; 
     90                return false; 
    9191    } 
    9292        /** 
     
    109109        $locale = LocaleList::GetDefault(); 
    110110        !empty($userData['typeInterface'])?$typeInterface=$userData['typeInterface']:$typeInterface=null; 
    111             $html .= "<div class='admin_element_data'>\n"; 
    112  
    113             $html .= _("Language") . ": " . $languages->GenererFormSelect($locale, "langstrings_" . $contentId . "_substring_new_language", null, TRUE); 
    114  
    115             $_FCKeditor = new FCKeditor('langstrings_' . $contentId . '_substring_new_string'); 
    116             $_FCKeditor->BasePath = SYSTEM_PATH . "lib/FCKeditor/"; 
    117             $_FCKeditor->Config["CustomConfigurationsPath"] = BASE_URL_PATH . "js/HTMLeditor.js"; 
    118             $_FCKeditor->Config["AutoDetectLanguage"] = false; 
    119             $_FCKeditor->Config["DefaultLanguage"] = substr(Locale::getCurrentLocale()->getId(), 0, 2); 
    120             $_FCKeditor->Config["StylesXmlPath"] = BASE_URL_PATH . "templates/HTMLeditor/css/" . substr(Locale::getCurrentLocale()->getId(), 0, 2) . ".xml"; 
    121             $_FCKeditor->Config["TemplatesXmlPath"] = BASE_URL_PATH . "templates/HTMLeditor/templates/" . substr(Locale::getCurrentLocale()->getId(), 0, 2) . ".xml"; 
    122             $_FCKeditor->ToolbarSet = "WiFiDOG"; 
    123  
    124             $_FCKeditor->Value = ""; 
    125  
    126             if ($typeInterface == 'LARGE') { 
    127                 $_FCKeditor->Height = 400; 
    128             } else { 
    129                 $_FCKeditor->Height = 200; 
    130             } 
    131             $_FCKeditor->Width = 386; 
    132  
    133             $html .= $_FCKeditor->CreateHtml(); 
    134  
    135             $html .= "</div>\n"; 
    136             $html .= "<div class='admin_element_tools'>\n"; 
    137  
    138             $html .= "<input type='submit' class='submit' name='langstrings_" . $contentId . "_add_new_entry' value='" . _("Add new string") . "'>"; 
    139             $html .= "</div>\n"; 
     111        $html .= "<div class='admin_element_data'>\n"; 
     112 
     113        $html .= _("Language") . ": " . $languages->GenererFormSelect($locale, "langstrings_" . $contentId . "_substring_new_language", null, TRUE); 
     114 
     115                if (Dependencies::check("FCKeditor")) { 
     116            // Load FCKeditor class 
     117            require_once('lib/FCKeditor/fckeditor.php'); 
     118 
     119                $_FCKeditor = new FCKeditor('langstrings_' . $contentId . '_substring_new_string'); 
     120                $_FCKeditor->BasePath = SYSTEM_PATH . "lib/FCKeditor/"; 
     121                $_FCKeditor->Config["CustomConfigurationsPath"] = BASE_URL_PATH . "js/HTMLeditor.js"; 
     122                $_FCKeditor->Config["AutoDetectLanguage"] = false; 
     123                $_FCKeditor->Config["DefaultLanguage"] = substr(Locale::getCurrentLocale()->getId(), 0, 2); 
     124                $_FCKeditor->Config["StylesXmlPath"] = BASE_URL_PATH . "templates/HTMLeditor/css/" . substr(Locale::getCurrentLocale()->getId(), 0, 2) . ".xml"; 
     125                $_FCKeditor->Config["TemplatesXmlPath"] = BASE_URL_PATH . "templates/HTMLeditor/templates/" . substr(Locale::getCurrentLocale()->getId(), 0, 2) . ".xml"; 
     126                $_FCKeditor->ToolbarSet = "WiFiDOG"; 
     127 
     128                $_FCKeditor->Value = ""; 
     129 
     130                if ($typeInterface == 'LARGE') { 
     131                    $_FCKeditor->Height = 400; 
     132                } else { 
     133                    $_FCKeditor->Height = 200; 
     134                } 
     135                $_FCKeditor->Width = 386; 
     136 
     137                $html .= $_FCKeditor->CreateHtml(); 
     138                } 
     139                else { 
     140                        $html .= "<textarea name='langstrings_{$contentId}_substring_new_string' class='textarea' cols='60' rows='3'></textarea>"; 
     141                } 
     142 
     143        $html .= "</div>\n"; 
     144        $html .= "<div class='admin_element_tools'>\n"; 
     145 
     146        $html .= "<input type='submit' class='submit' name='langstrings_" . $contentId . "_add_new_entry' value='" . _("Add new string") . "'>"; 
     147        $html .= "</div>\n"; 
    140148        return $html; 
    141149    } 
     
    225233    } 
    226234 
    227   
     235 
    228236    /** 
    229237     * Reloads the object from the database. Should normally be called after 
  • trunk/wifidog-auth/wifidog/classes/Content/Picture/Picture.php

    r1194 r1226  
    126126        return $this->configEnableHyperlink = $enabled; 
    127127    } 
     128 
    128129    /** 
    129130     * Set the maximum width an image can take in the page 
     
    139140    public function setMaxDisplayHeight($height) { 
    140141        $this->maxDisplayHeight = $height; 
     142    } 
     143 
     144    public function getMaxDisplayWidth() { 
     145        return $this->maxDisplayWidth; 
     146    } 
     147 
     148    public function getMaxDisplayHeight() { 
     149        return $this->maxDisplayHeight; 
    141150    } 
    142151 
     
    283292        // Show File admin UI + display the picture 
    284293        $html .= "<li class='admin_element_item_container'>\n"; 
     294        $html .= _("Preview").":"; 
    285295        $html .= $this->getUserUI(); 
    286296        $html .= "</li>\n"; 
  • trunk/wifidog-auth/wifidog/classes/Content/SimplePicture/SimplePicture.php

    r1167 r1226  
    7171         */ 
    7272        parent::setIsPersistent(false); 
     73 
     74        $this->setFileMetadataVerbose(false); 
    7375    } 
    7476    /** When a content object is set as Simple, it means that is is used merely to contain it's own data.  No title, description or other metadata will be set or displayed, during display or administration 
     
    102104 * End: 
    103105 */ 
    104  
    105  
  • trunk/wifidog-auth/wifidog/classes/HyperLinkUtils.php

    r1196 r1226  
    6565     * HREF constructs 
    6666     * @return array of URLs 
    67      
     67 
    6868     */ 
    6969    private static function findHyperLinks(& $string) { 
     
    101101        } 
    102102    } 
    103      
     103 
    104104    /** Is the entered URL a valid URL? 
    105105     * @param $url 
     
    108108    static public function validateURL($url) { 
    109109        $retval = false; 
    110         if (!preg_match('/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\//i', $url, $m)) { 
     110        if (!preg_match('/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?(\/)?/i', $url, $m)) { 
    111111            //URL isn't valid 
    112112        } else { 
  • trunk/wifidog-auth/wifidog/classes/ProfileField.php

    r1192 r1226  
    219219        else 
    220220        $content_id = "'".$db->escapeString($content->getId())."'"; 
    221           
     221 
    222222        $_retVal = $db->execSqlUpdate("UPDATE profile_fields SET content_id = $content_id WHERE profile_field_id = '{$this->getId()}'", false); 
    223223        $this->refresh(); 
     
    286286        throw new Exception("Could not retrieve the associated content type filter."); 
    287287 
    288           
     288 
    289289        return $html; 
    290290    } 
     
    324324        //echo "ProfileField::getUserUI()"; 
    325325        $html = ""; 
     326        $template_field = $this->getProfileTemplateField(); 
     327        $html .=  "<div class='user_ui_profile_field ".$template_field->getSemanticId()."'>\n"; 
     328 
     329        $content_label = $template_field->getDisplayLabelContent(); 
     330        if(!empty($content_label)){ 
     331            $html .=  "<div class='profile_field_label'>".$content_label->getUserUI()."</div>\n"; 
     332        } 
     333 
    326334        $content_field = $this->getContentField(); 
    327335        if(!empty($content_field)) { 
    328             $template_field = $this->getProfileTemplateField(); 
    329             $html .=  "<div class='user_ui_profile_field ".$template_field->getSemanticId()."'>\n"; 
    330             $content_label = $template_field->getDisplayLabelContent(); 
    331             if(!empty($content_label)){ 
    332                 $html .=  "<div class='profile_field_label'>".$content_label->getUserUI()."</div>\n"; 
    333             } 
    334336            // Display the actual value from the profile field 
    335337            $html .=  "<div class='profile_field_content'>".$content_field->getUserUI()."</div>\n"; 
    336             $html .=  "</div>\n"; 
    337         } 
     338        } 
     339        $html .=  "</div>\n"; 
    338340 
    339341        return $html; 
  • trunk/wifidog-auth/wifidog/classes/User.php

    r1220 r1226  
    300300                } 
    301301            } 
    302               
    303               
    304               
     302 
     303 
     304 
    305305            // Display the avatar 
    306306            if(empty($avatar)) 
     
    308308            else 
    309309            $html .= $avatar; 
    310               
     310 
    311311            // Display the nickname or the username 
    312312            $profiles=$this->getAllProfiles(); 
     
    322322            } 
    323323            $profileTemplates = $this->getNetwork()->getAllProfileTemplates(); 
    324             if($this==User::getCurrentUser() && $profileTemplates) { 
    325                 $html .= "<div class='user_edit_profile_link'>(<a href='".BASE_SSL_PATH."admin/generic_object_admin.php?object_id=".$this->getId()."&object_class=User&action=edit'>"._("edit profile")."</a>)</div>"; 
    326             } 
     324            /*if($this==User::getCurrentUser() && $profileTemplates) { 
     325                $html .= "<div class='user_edit_profile_link'><br/>(<a href='".BASE_SSL_PATH."admin/generic_object_admin.php?object_id=".$this->getId()."&object_class=User&action=edit'>"._("edit profile")."</a>)</div>"; 
     326            }*/ 
    327327 
    328328        } 
  • trunk/wifidog-auth/wifidog/locale/de/LC_MESSAGES/messages.po

    r1175 r1226  
    99"Project-Id-Version: PACKAGE VERSION\n" 
    1010"Report-Msgid-Bugs-To: \n" 
    11 "POT-Creation-Date: 2007-01-18 13:02-0500\n" 
     11"POT-Creation-Date: 2007-05-17 16:22-0400\n" 
    1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
    1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 
     
    3333#: ../change_password.php:49 ../signup.php:69 ../change_password.php:74 
    3434#: ../signup.php:139 ../change_password.php:100 ../classes/User.php:786 
     35#: ../classes/User.php:847 
    3536msgid "Passwords do not match." 
    3637msgstr "Die Passwörter stimmen nicht überein." 
     
    3839#: ../change_password.php:54 ../change_password.php:79 
    3940#: ../change_password.php:107 ../change_password.php:122 
    40 #: ../classes/User.php:783 
     41#: ../classes/User.php:783 ../classes/User.php:844 
    4142msgid "Wrong password." 
    4243msgstr "Falsches Passwort." 
     
    103104 
    104105#: ../hotspots_map.php:44 smarty.txt:80 smarty.txt:44 smarty.txt:29 
    105 #: smarty.txt:23 
     106#: smarty.txt:23 smarty.txt:30 
    106107msgid "Show me the closest hotspot" 
    107108msgstr "Nächsten Hotspot anzeigen" 
    108109 
    109110#: ../hotspots_map.php:46 smarty.txt:81 smarty.txt:45 smarty.txt:30 
    110 #: smarty.txt:24 
     111#: smarty.txt:24 smarty.txt:31 
    111112msgid "Enter your postal code" 
    112113msgstr "Geben Sie ihre Postleitzahl ein" 
    113114 
    114115#: ../hotspots_map.php:48 smarty.txt:82 smarty.txt:46 smarty.txt:31 
    115 #: smarty.txt:25 
     116#: smarty.txt:25 smarty.txt:32 
    116117msgid "Show" 
    117118msgstr "Anzeigen" 
    118119 
    119120#: ../hotspots_map.php:50 smarty.txt:78 smarty.txt:100 smarty.txt:103 
    120 #: smarty.txt:83 smarty.txt:47 smarty.txt:32 smarty.txt:26 
     121#: smarty.txt:83 smarty.txt:47 smarty.txt:32 smarty.txt:26 smarty.txt:33 
    121122msgid "Refresh map" 
    122123msgstr "Karte aktualisieren" 
     
    125126#: smarty.txt:108 ../hotspots_map.php:155 smarty.txt:85 
    126127#: ../hotspots_map.php:156 smarty.txt:49 smarty.txt:34 smarty.txt:28 
     128#: smarty.txt:35 
    127129msgid "Loading, please wait..." 
    128130msgstr "Die Karte wird geladen ..." 
    129131 
    130132#: ../hotspots_map.php:57 smarty.txt:84 smarty.txt:106 smarty.txt:109 
    131 #: smarty.txt:86 smarty.txt:50 smarty.txt:35 smarty.txt:29 
     133#: smarty.txt:86 smarty.txt:50 smarty.txt:35 smarty.txt:29 smarty.txt:36 
    132134msgid "Legend" 
    133135msgstr "Legende" 
     
    225227#: smarty.txt:166 smarty.txt:169 smarty.txt:146 ../resend_validation.php:117 
    226228#: ../signup.php:229 ../portal/index.php:209 ../portal/index.php:189 
     229#: ../portal/index.php:148 
    227230msgid "An email with confirmation instructions was sent to your email address." 
    228231msgstr "" 
     
    320323#: smarty.txt:39 smarty.txt:103 ../classes/Content.php:796 
    321324#: ../classes/Node.php:959 smarty.txt:59 smarty.txt:53 
     325#: ../classes/Content.php:925 smarty.txt:25 
    322326msgid "Description" 
    323327msgstr "Beschreibung" 
     
    330334#: ../admin/generic_object_admin.php:56 ../admin/generic_object_admin.php:134 
    331335#: ../admin/generic_object_admin.php:140 ../admin/generic_object_admin.php:142 
     336#: ../admin/generic_object_admin.php:143 
    332337msgid "" 
    333338"Sorry, the object couldn't be created.  You probably didn't fill the form " 
     
    340345#: ../admin/generic_object_admin.php:229 ../admin/generic_object_admin.php:215 
    341346#: ../admin/generic_object_admin.php:237 ../admin/generic_object_admin.php:217 
    342 #: ../admin/generic_object_admin.php:239 
     347#: ../admin/generic_object_admin.php:239 ../admin/generic_object_admin.php:218 
     348#: ../admin/generic_object_admin.php:240 
    343349msgid "Object successfully deleted" 
    344350msgstr "Objekt erfolgreich gelöscht" 
     
    347353#: ../admin/generic_object_admin.php:232 ../admin/generic_object_admin.php:217 
    348354#: ../admin/generic_object_admin.php:240 ../admin/generic_object_admin.php:219 
    349 #: ../admin/generic_object_admin.php:242 
     355#: ../admin/generic_object_admin.php:242 ../admin/generic_object_admin.php:220 
     356#: ../admin/generic_object_admin.php:243 
    350357msgid "Deletion failed, error was: " 
    351358msgstr "Das Löschen ist fehlgeschlagen, der Fehler war: " 
     
    358365#: ../admin/generic_object_admin.php:97 ../admin/generic_object_admin.php:359 
    359366#: ../admin/generic_object_admin.php:360 ../admin/generic_object_admin.php:374 
    360 #: ../admin/generic_object_admin.php:399 
     367#: ../admin/generic_object_admin.php:399 ../admin/generic_object_admin.php:400 
    361368msgid "Sorry, the 'object_id' parameter must be specified" 
    362369msgstr "Der Parameter 'object_id' muss angeben werden" 
     
    364371#: ../admin/generic_object_admin.php:111 ../admin/generic_object_admin.php:375 
    365372#: ../admin/generic_object_admin.php:376 ../admin/generic_object_admin.php:390 
    366 #: ../admin/generic_object_admin.php:415 
     373#: ../admin/generic_object_admin.php:415 ../admin/generic_object_admin.php:416 
    367374msgid "Save" 
    368375msgstr "Sichern" 
     
    372379#: ../admin/generic_object_admin.php:391 ../admin/generic_object_admin.php:202 
    373380#: ../admin/generic_object_admin.php:405 ../admin/generic_object_admin.php:204 
    374 #: ../admin/generic_object_admin.php:430 
     381#: ../admin/generic_object_admin.php:430 ../admin/generic_object_admin.php:205 
     382#: ../admin/generic_object_admin.php:431 
     383#: ../classes/Content/Picture/Picture.php:285 
     384#: ../classes/Content/FavoriteHotspots/FavoriteHotspots.php:152 
     385#: ../classes/Content/Picture/Picture.php:294 
    375386msgid "Preview" 
    376387msgstr "Vorschau" 
     
    405416#: ../classes/Content/RssAggregator/RssAggregator.php:621 
    406417#: ../classes/Content.php:826 ../admin/generic_object_admin.php:420 
    407 #: ../admin/generic_object_admin.php:440 
     418#: ../admin/generic_object_admin.php:440 ../admin/generic_object_admin.php:421 
     419#: ../admin/generic_object_admin.php:441 ../classes/Content.php:955 
    408420msgid "Delete" 
    409421msgstr "Löschen" 
     
    411423#: ../admin/generic_object_admin.php:135 ../admin/generic_object_admin.php:169 
    412424#: ../admin/generic_object_admin.php:178 ../admin/generic_object_admin.php:180 
     425#: ../admin/generic_object_admin.php:181 
    413426msgid "Showing preview as it would appear at " 
    414427msgstr "Vorschau des Inhalts vom Hotspot " 
     
    423436#: ../classes/Content.php:560 ../admin/generic_object_admin.php:208 
    424437#: ../classes/Content.php:607 ../admin/generic_object_admin.php:210 
    425 #: ../classes/ProfileTemplate.php:368 
     438#: ../classes/ProfileTemplate.php:368 ../admin/generic_object_admin.php:211 
     439#: ../classes/Content.php:736 
    426440msgid "Edit" 
    427441msgstr "Bearbeiten" 
     
    429443#: ../admin/generic_object_admin.php:167 ../admin/generic_object_admin.php:425 
    430444#: ../admin/generic_object_admin.php:426 ../admin/generic_object_admin.php:440 
    431 #: ../admin/generic_object_admin.php:465 
     445#: ../admin/generic_object_admin.php:465 ../admin/generic_object_admin.php:466 
    432446msgid "Generic object editor" 
    433447msgstr "Allgemeiner Objekteditor" 
     
    558572#: smarty.txt:34 smarty.txt:140 smarty.txt:200 smarty.txt:162 smarty.txt:222 
    559573#: smarty.txt:165 smarty.txt:225 smarty.txt:208 smarty.txt:72 smarty.txt:117 
    560 #: smarty.txt:36 smarty.txt:104 smarty.txt:30 smarty.txt:98 
     574#: smarty.txt:36 smarty.txt:104 smarty.txt:30 smarty.txt:98 smarty.txt:78 
    561575msgid "Online users" 
    562576msgstr "Angemeldete Benutzer" 
     
    598612#: ../classes/Authenticators/AuthenticatorRadius.php:264 
    599613#: ../classes/Authenticators/AuthenticatorRadius.php:284 
     614#: ../classes/Authenticators/AuthenticatorLDAP.php:258 
     615#: ../classes/Authenticators/AuthenticatorLDAP.php:268 
    600616msgid "Login successfull" 
    601617msgstr "Erfolgreiche Anmeldung" 
     
    662678#: ../classes/Content/ContentGroup/ContentGroupElement.php:231 
    663679#: ../classes/Content.php:189 ../classes/ProfileTemplateField.php:187 
     680#: ../classes/ProfileTemplateField.php:186 
    664681msgid "Unable to insert new content into database!" 
    665682msgstr "Der neue Inhalt konnte nicht in der Datenbank gesichert werden!" 
     
    673690#: ../classes/Content.php:230 ../classes/Content.php:1185 
    674691#: ../classes/Content.php:231 ../classes/Content.php:223 
    675 #: ../classes/Content.php:1363 
     692#: ../classes/Content.php:1363 ../classes/Content.php:1492 
     693#: ../classes/Content.php:1511 
    676694msgid "You must select a content type: " 
    677695msgstr "Sie müssen die Art des Inhalts auswählen: " 
     
    697715#: ../classes/Content/Picture/Picture.php:100 ../classes/Content.php:124 
    698716#: ../classes/Content.php:274 
     717#: ../classes/Content/ContentGroup/ContentGroup.php:111 
     718#: ../classes/Content/File/File.php:131 
     719#: ../classes/Content/Picture/Picture.php:103 ../classes/Content.php:275 
    699720msgid "The content with the following id could not be found in the database: " 
    700721msgstr "" 
     
    707728#: ../classes/Network.php:711 ../classes/Statistics.php:124 
    708729#: ../classes/Content.php:333 ../classes/NodeList.php:153 
     730#: ../classes/Content.php:335 
    709731msgid "Unable to open directory " 
    710732msgstr "Folgendes verzeichnis konnte nicht geöffnet werden: " 
     
    717739#: ../classes/Content.php:451 ../classes/Content.php:884 
    718740#: ../classes/Content.php:440 ../classes/Content.php:896 
    719 #: ../classes/Content.php:993 
     741#: ../classes/Content.php:993 ../classes/Content.php:1122 
    720742msgid "The following content type isn't valid: " 
    721743msgstr "Die folgende Inhaltsart ist ungültig: " 
     
    741763#: ../classes/Content.php:502 ../classes/Content.php:838 
    742764#: ../classes/ProfileTemplate.php:302 ../classes/ProfileTemplateField.php:148 
     765#: ../classes/Content.php:545 ../classes/Content.php:967 
     766#: ../classes/ProfileTemplateField.php:147 
    743767msgid "Add" 
    744768msgstr "Hinzufügen" 
     
    753777#: ../classes/Content/ContentGroup/ContentGroupElement.php:373 
    754778#: ../classes/Content.php:609 ../classes/ProfileTemplate.php:370 
     779#: ../classes/Content/ContentGroup/ContentGroupElement.php:349 
     780#: ../classes/Content.php:738 
    755781msgid "Remove" 
    756782msgstr "Entfernen" 
     
    773799#: ../classes/Content.php:571 ../classes/Content.php:890 
    774800#: ../classes/Content.php:901 ../classes/Content.php:998 
     801#: ../classes/Content.php:1127 
    775802msgid "Update was unsuccessfull (database error)" 
    776803msgstr "Aktualisierung fehlgeschlagen (Datenbankfehler)" 
     
    778805#: ../classes/Content.php:590 ../classes/Content.php:909 
    779806#: ../classes/Content.php:918 ../classes/Content.php:1015 
     807#: ../classes/Content.php:1144 
    780808msgid "Unable to insert the new Owner into database." 
    781809msgstr "Der neue Besitzer konnte nicht in der Datenbank gesichert werden." 
     
    783811#: ../classes/Content.php:609 ../classes/Content.php:928 
    784812#: ../classes/Content.php:935 ../classes/Content.php:1032 
     813#: ../classes/Content.php:1161 
    785814msgid "Unable to remove the owner from the database." 
    786815msgstr "Der Besitzer konnte nicht aus der Datenbank entfernt werden." 
     
    788817#: ../classes/Content.php:751 ../classes/Content.php:1070 
    789818#: ../classes/Content.php:1060 ../classes/Content.php:1212 
     819#: ../classes/Content.php:1341 ../classes/Content.php:1360 
    790820msgid "Author(s):" 
    791821msgstr "Autor(en):" 
     
    793823#: ../classes/Content.php:775 ../classes/Content.php:1094 
    794824#: ../classes/Content.php:1081 ../classes/Content.php:1233 
     825#: ../classes/Content.php:1362 ../classes/Content.php:1381 
    795826msgid "Project information:" 
    796827msgstr "Information über das Projekt:" 
     
    804835#: ../classes/Content.php:1204 ../classes/Content.php:1208 
    805836#: ../classes/Content.php:1396 ../classes/Content.php:1401 
     837#: ../classes/Content.php:1525 ../classes/Content.php:1530 
     838#: ../classes/Content.php:1544 ../classes/Content.php:1549 
    806839msgid "Title:" 
    807840msgstr "Titel:" 
     
    810843#: ../classes/Content.php:1223 ../classes/Content.php:1227 
    811844#: ../classes/Content.php:1416 ../classes/Content.php:1420 
     845#: ../classes/Content.php:1545 ../classes/Content.php:1549 
     846#: ../classes/Content.php:1564 ../classes/Content.php:1568 
    812847msgid "Description:" 
    813848msgstr "Beschreibung:" 
     
    816851#: ../classes/Content.php:1240 ../classes/Content.php:1244 
    817852#: ../classes/Content.php:1433 ../classes/Content.php:1437 
     853#: ../classes/Content.php:1562 ../classes/Content.php:1566 
     854#: ../classes/Content.php:1581 ../classes/Content.php:1585 
    818855msgid "Long description:" 
    819856msgstr "Lange Beschreibung:" 
     
    822859#: ../classes/Content.php:1257 ../classes/Content.php:1261 
    823860#: ../classes/Content.php:1450 ../classes/Content.php:1454 
     861#: ../classes/Content.php:1579 ../classes/Content.php:1583 
     862#: ../classes/Content.php:1598 ../classes/Content.php:1602 
    824863msgid "Information on this project:" 
    825864msgstr "Information über das Project:" 
     
    832871#: ../classes/Content.php:992 ../classes/Content.php:1337 
    833872#: ../classes/Content.php:1303 ../classes/Content.php:1486 
     873#: ../classes/Content.php:1615 ../classes/Content.php:1634 
    834874msgid "Content owner list" 
    835875msgstr "Besitzer des Inhalts" 
     
    839879#: ../classes/Content.php:1333 ../classes/Node.php:968 
    840880#: ../classes/Content.php:1516 ../classes/Node.php:1094 
    841 #: ../classes/Node.php:1095 
     881#: ../classes/Node.php:1095 ../classes/Content.php:1645 
     882#: ../classes/Content.php:1664 
    842883msgid "Add owner" 
    843884msgstr "Besitzer hinzufügen" 
     
    845886#: ../classes/Content.php:1208 ../classes/Content.php:1554 
    846887#: ../classes/Content.php:1471 ../classes/Content.php:1648 
     888#: ../classes/Content.php:1777 ../classes/Content.php:1796 
    847889msgid "Unable to set as author in the database." 
    848890msgstr "Der Autor konnte nicht in der Datenbank gesichert werden." 
     
    859901#: ../classes/Content/Langstring/Langstring.php:482 
    860902#: ../classes/Content.php:1775 
     903#: ../classes/Content/Langstring/Langstring.php:533 
     904#: ../classes/Content.php:1904 ../classes/Content.php:1923 
    861905msgid "" 
    862906"Content is persistent (you must make it non persistent before you can delete " 
     
    875919#: ../classes/Content/Langstring/Langstring.php:500 
    876920#: ../classes/Content.php:1799 
     921#: ../classes/Content/Langstring/Langstring.php:551 
     922#: ../classes/Content.php:1928 ../classes/Content.php:1947 
    877923msgid "Access denied (not owner of content)" 
    878924msgstr "Zugriff verweigert (Sie sind nicht der Besitzer des Inhalts)" 
     
    882928#: ../classes/Content/ContentGroup/ContentGroupElement.php:284 
    883929#: ../classes/Content/ContentGroup/ContentGroupElement.php:325 
     930#: ../classes/Content/ContentGroup/ContentGroupElement.php:301 
    884931msgid "(Ignored if display type is random)" 
    885932msgstr "(Ignoriert, falls die Anzeigeart zufällig ist)" 
     
    904951#: ../classes/Content/ContentGroup/ContentGroupElement.php:318 
    905952#: ../classes/Content/ContentGroup/ContentGroupElement.php:385 
     953#: ../classes/Content/ContentGroup/ContentGroupElement.php:361 
    906954msgid "Add new allowed node" 
    907955msgstr "Zugelassenen Hotspot hinzufügen" 
     
    9801028 
    9811029#: ../classes/MainUI.php:240 smarty.txt:43 smarty.txt:23 smarty.txt:27 
    982 #: smarty.txt:21 
     1030#: smarty.txt:21 smarty.txt:6 
    9831031msgid "I am not logged in." 
    9841032msgstr "Sie sind nicht angemeldet." 
     
    10101058#: ../classes/MainUI.php:476 smarty.txt:21 smarty.txt:47 smarty.txt:59 
    10111059#: smarty.txt:27 smarty.txt:65 ../classes/MainUI.php:381 smarty.txt:81 
    1012 #: smarty.txt:84 smarty.txt:63 smarty.txt:29 smarty.txt:87 
     1060#: smarty.txt:84 smarty.txt:63 smarty.txt:29 smarty.txt:87 smarty.txt:15 
    10131061msgid "Please get in touch with " 
    10141062msgstr "Support-Meldungen bitte an folgende E-Mail-Adresse richten: " 
     
    10531101#: ../classes/Server.php:406 ../classes/Network.php:334 
    10541102#: ../classes/Node.php:440 ../classes/ContentTypeFilter.php:253 
     1103#: ../classes/StatisticReport/AnonymisedDataExport.php:97 
    10551104msgid "Access denied" 
    10561105msgstr "Zugriff verweigert" 
     
    11891238#: ../classes/Node.php:1136 ../classes/ContentTypeFilter.php:411 
    11901239#: ../classes/Network.php:1707 ../classes/Node.php:1137 
    1191 #: ../classes/ProfileTemplate.php:526 
     1240#: ../classes/ProfileTemplate.php:526 ../classes/Content.php:901 
     1241#: ../classes/ContentTypeFilter.php:409 ../classes/ProfileTemplate.php:532 
    11921242msgid "Access denied!" 
    11931243msgstr "Zugriff verweigert!" 
     
    12001250#: ../classes/Profile.php:351 ../classes/ProfileTemplate.php:570 
    12011251#: ../classes/ProfileTemplateField.php:623 ../classes/ProfileField.php:288 
     1252#: ../classes/ContentTypeFilter.php:449 ../classes/Profile.php:446 
     1253#: ../classes/ProfileField.php:363 ../classes/ProfileTemplate.php:576 
     1254#: ../classes/ProfileTemplateField.php:603 
    12021255msgid "Access denied (must have super admin access)" 
    12031256msgstr "Zugriff verweigert (Sie müssen volle Administratorrechte besitzen)" 
     
    14471500#: ../classes/Content.php:1324 ../classes/Node.php:964 
    14481501#: ../classes/Content.php:1507 ../classes/Node.php:1090 
    1449 #: ../classes/Node.php:1091 
     1502#: ../classes/Node.php:1091 ../classes/Content.php:1636 
     1503#: ../classes/Content.php:1655 
    14501504msgid "Remove owner" 
    14511505msgstr "Besitzer entfernen" 
     
    17051759 
    17061760#: ../classes/User.php:292 ../classes/User.php:410 ../classes/User.php:396 
    1707 #: ../classes/User.php:362 
     1761#: ../classes/User.php:362 ../classes/User.php:450 
    17081762msgid "Could not update status." 
    17091763msgstr "Der Status konnte nicht aktualisiert werden" 
     
    17231777 
    17241778#: ../classes/User.php:321 ../classes/User.php:439 ../classes/User.php:425 
    1725 #: ../classes/User.php:384 ../classes/User.php:419 
     1779#: ../classes/User.php:384 ../classes/User.php:419 ../classes/User.php:473 
    17261780msgid "Your account is currently valid." 
    17271781msgstr "Ihr Zugang wurde freigeschaltet." 
    17281782 
    17291783#: ../classes/User.php:327 ../classes/User.php:445 ../classes/User.php:431 
    1730 #: ../classes/User.php:388 ../classes/User.php:423 
     1784#: ../classes/User.php:388 ../classes/User.php:423 ../classes/User.php:477 
    17311785msgid "Sorry, your account is not valid: " 
    17321786msgstr "Ihr Zugang wurde gesperrt:" 
    17331787 
    17341788#: ../classes/User.php:416 ../classes/User.php:534 ../classes/User.php:520 
    1735 #: ../classes/User.php:470 ../classes/User.php:509 
     1789#: ../classes/User.php:470 ../classes/User.php:509 ../classes/User.php:563 
    17361790msgid "Could not change user's password." 
    17371791msgstr "Das Benutzerpasswort konnte nicht geändert werden." 
    17381792 
    17391793#: ../classes/User.php:435 ../classes/User.php:553 ../classes/User.php:539 
    1740 #: ../classes/User.php:486 ../classes/User.php:525 
     1794#: ../classes/User.php:486 ../classes/User.php:525 ../classes/User.php:579 
    17411795msgid "No users could not be found in the database" 
    17421796msgstr "Es wurden keinen Benutzer in der Datenbank gefunden" 
     
    17471801#: ../classes/User.php:494 ../classes/User.php:512 ../classes/User.php:529 
    17481802#: ../classes/User.php:533 ../classes/User.php:551 ../classes/User.php:568 
     1803#: ../classes/User.php:622 
    17491804msgid "Registration system" 
    17501805msgstr "Registrierungssystem" 
    17511806 
    17521807#: ../classes/User.php:447 ../classes/User.php:565 ../classes/User.php:551 
    1753 #: ../classes/User.php:497 ../classes/User.php:536 
     1808#: ../classes/User.php:497 ../classes/User.php:536 ../classes/User.php:590 
    17541809msgid " lost username request" 
    17551810msgstr " Anfrage bzgl. eines vergessenen Benutzernamens" 
    17561811 
    17571812#: ../classes/User.php:448 ../classes/User.php:566 ../classes/User.php:552 
    1758 #: ../classes/User.php:498 ../classes/User.php:537 
     1813#: ../classes/User.php:498 ../classes/User.php:537 ../classes/User.php:591 
    17591814msgid "" 
    17601815"Hello,\n" 
     
    17701825#: ../classes/User.php:609 ../classes/User.php:552 ../classes/User.php:595 
    17711826#: ../classes/User.php:498 ../classes/User.php:533 ../classes/User.php:537 
    1772 #: ../classes/User.php:572 
     1827#: ../classes/User.php:572 ../classes/User.php:591 ../classes/User.php:626 
    17731828msgid "" 
    17741829"\n" 
     
    17831838 
    17841839#: ../classes/User.php:456 ../classes/User.php:574 ../classes/User.php:560 
    1785 #: ../classes/User.php:504 ../classes/User.php:543 
     1840#: ../classes/User.php:504 ../classes/User.php:543 ../classes/User.php:597 
    17861841msgid "The user is not in validation period." 
    17871842msgstr "Der Benutzer befindet sich nicht in dem Bestätigungszeitraum." 
    17881843 
    17891844#: ../classes/User.php:462 ../classes/User.php:580 ../classes/User.php:566 
    1790 #: ../classes/User.php:507 ../classes/User.php:546 
     1845#: ../classes/User.php:507 ../classes/User.php:546 ../classes/User.php:600 
    17911846msgid "The validation token is empty." 
    17921847msgstr "Das Bestätigungskürzel ist leer." 
    17931848 
    17941849#: ../classes/User.php:472 ../classes/User.php:590 ../classes/User.php:576 
    1795 #: ../classes/User.php:515 ../classes/User.php:554 
     1850#: ../classes/User.php:515 ../classes/User.php:554 ../classes/User.php:608 
    17961851msgid " new user validation" 
    17971852msgstr " Bestätigung der E-Mail-Adresse" 
    17981853 
    17991854#: ../classes/User.php:474 ../classes/User.php:592 ../classes/User.php:578 
    1800 #: ../classes/User.php:517 ../classes/User.php:556 
     1855#: ../classes/User.php:517 ../classes/User.php:556 ../classes/User.php:610 
    18011856msgid "" 
    18021857"Hello,\n" 
     
    18081863 
    18091864#: ../classes/User.php:474 ../classes/User.php:592 ../classes/User.php:578 
    1810 #: ../classes/User.php:517 ../classes/User.php:556 
     1865#: ../classes/User.php:517 ../classes/User.php:556 ../classes/User.php:610 
    18111866msgid "" 
    18121867"\n" 
     
    18211876 
    18221877#: ../classes/User.php:490 ../classes/User.php:608 ../classes/User.php:594 
    1823 #: ../classes/User.php:532 ../classes/User.php:571 
     1878#: ../classes/User.php:532 ../classes/User.php:571 ../classes/User.php:625 
    18241879msgid " new password request" 
    18251880msgstr " Anfrage nach einem neuen Passwort" 
    18261881 
    18271882#: ../classes/User.php:491 ../classes/User.php:609 ../classes/User.php:595 
    1828 #: ../classes/User.php:533 ../classes/User.php:572 
     1883#: ../classes/User.php:533 ../classes/User.php:572 ../classes/User.php:626 
    18291884msgid "" 
    18301885"Hello,\n" 
     
    18391894 
    18401895#: ../classes/User.php:491 ../classes/User.php:609 ../classes/User.php:595 
    1841 #: ../classes/User.php:533 ../classes/User.php:572 
     1896#: ../classes/User.php:533 ../classes/User.php:572 ../classes/User.php:626 
    18421897msgid "" 
    18431898"\n" 
     
    18711926#: ../classes/StatisticReport/UserReport.php:284 ../classes/User.php:657 
    18721927#: ../classes/User.php:662 ../classes/User.php:710 smarty.txt:94 
     1928#: ../classes/User.php:711 ../classes/User.php:716 ../classes/User.php:764 
     1929#: smarty.txt:80 smarty.txt:88 
    18731930msgid "Username" 
    18741931msgstr "Benutzername" 
     
    19462003#: ../login/index.php:160 ../login/index.php:161 smarty.txt:115 smarty.txt:137 
    19472004#: smarty.txt:140 smarty.txt:113 smarty.txt:60 smarty.txt:84 smarty.txt:78 
     2005#: smarty.txt:48 
    19482006msgid "Username (or email)" 
    19492007msgstr "Benutzername (oder E-Mail-Adresse)" 
     
    19532011#: smarty.txt:138 smarty.txt:187 smarty.txt:141 smarty.txt:190 smarty.txt:114 
    19542012#: smarty.txt:169 smarty.txt:61 smarty.txt:44 smarty.txt:85 smarty.txt:38 
    1955 #: smarty.txt:79 
     2013#: smarty.txt:79 smarty.txt:49 smarty.txt:68 
    19562014msgid "Password" 
    19572015msgstr "Passwort" 
     
    19642022#: smarty.txt:62 smarty.txt:63 smarty.txt:68 smarty.txt:76 smarty.txt:80 
    19652023#: smarty.txt:40 smarty.txt:64 smarty.txt:86 smarty.txt:88 smarty.txt:92 
    1966 #: smarty.txt:34 smarty.txt:58 smarty.txt:82 
     2024#: smarty.txt:34 smarty.txt:58 smarty.txt:82 smarty.txt:50 smarty.txt:51 
     2025#: smarty.txt:56 smarty.txt:60 
    19672026msgid "I'm having difficulties" 
    19682027msgstr "Ich habe Probleme" 
     
    20232082#: ../portal/index.php:311 smarty.txt:148 smarty.txt:170 smarty.txt:173 
    20242083#: smarty.txt:151 ../portal/index.php:281 ../portal/index.php:251 
     2084#: ../portal/index.php:210 
    20252085msgid "Show all available contents for this hotspot" 
    20262086msgstr "Zeige sämtliche Inhalte dieses Hotspots" 
     
    20382098#: ../classes/Content/ContentGroup/ContentGroup.php:196 
    20392099#: ../classes/Content/ContentGroup/ContentGroup.php:148 
     2100#: ../classes/Content/ContentGroup/ContentGroup.php:149 
    20402101msgid "Invalid content selection mode (must be part of CONTENT_ORDERING_MODES)" 
    20412102msgstr "" 
     
    20462107#: ../classes/Content/ContentGroup/ContentGroup.php:231 
    20472108#: ../classes/Content/ContentGroup/ContentGroup.php:177 
     2109#: ../classes/Content/ContentGroup/ContentGroup.php:178 
    20482110msgid "" 
    20492111"Invalid content selection mode (must be part of CONTENT_CHANGES_ON_MODES)" 
     
    20552117#: ../classes/Content/ContentGroup/ContentGroup.php:266 
    20562118#: ../classes/Content/ContentGroup/ContentGroup.php:206 
     2119#: ../classes/Content/ContentGroup/ContentGroup.php:207 
    20572120msgid "Invalid content selection mode (must be part of ALLOW_REPEAT_MODES)" 
    20582121msgstr "" 
     
    20652128#: ../classes/Content/RssAggregator/RssAggregator.php:193 
    20662129#: ../classes/Content/ContentGroup/ContentGroup.php:238 
     2130#: ../classes/Content/ContentGroup/ContentGroup.php:239 
    20672131msgid "You must display at least one element" 
    20682132msgstr "Sie müssen mindestens ein Element auswählen" 
     
    20722136#: ../classes/Content/ContentGroup/ContentGroup.php:353 
    20732137#: ../classes/Content/ContentGroup/ContentGroup.php:263 
     2138#: ../classes/Content/ContentGroup/ContentGroup.php:264 
    20742139msgid "In what order should the content displayed?" 
    20752140msgstr "In welcher Reihenfolge soll der Inhalt angezeigt werden?" 
     
    20792144#: ../classes/Content/ContentGroup/ContentGroup.php:371 
    20802145#: ../classes/Content/ContentGroup/ContentGroup.php:272 
     2146#: ../classes/Content/ContentGroup/ContentGroup.php:273 
    20812147msgid "When does the content rotate?" 
    20822148msgstr "Wann wechselt der Inhalt?" 
     
    20862152#: ../classes/Content/ContentGroup/ContentGroup.php:388 
    20872153#: ../classes/Content/ContentGroup/ContentGroup.php:281 
     2154#: ../classes/Content/ContentGroup/ContentGroup.php:282 
    20882155msgid "Can content be shown more than once to the same user?" 
    20892156msgstr "" 
     
    21682235#: ../classes/Content/File/File.php:574 
    21692236#: ../classes/Content/EmbeddedContent/EmbeddedContent.php:354 
     2237#: ../classes/Content/File/File.php:565 ../classes/Content/File/File.php:656 
    21702238msgid "Download" 
    21712239msgstr "Download" 
     
    21812249#: ../classes/Content/File/File.php:569 
    21822250#: ../classes/Content/EmbeddedContent/EmbeddedContent.php:354 
     2251#: ../classes/Content/File/File.php:550 ../classes/Content/File/File.php:649 
    21832252msgid "KB" 
    21842253msgstr "kB" 
     
    21862255#: ../classes/Content/File.php:97 ../classes/Content/File/File.php:165 
    21872256#: ../classes/Content/File/File.php:160 ../classes/Content/File/File.php:162 
     2257#: ../classes/Content/File/File.php:202 
    21882258msgid "File size exceeds limit specified in PHP.ini" 
    21892259msgstr "Die Dateigröße überschreitet die in php.ini zugelassene Grenze" 
     
    21912261#: ../classes/Content/File.php:100 ../classes/Content/File/File.php:169 
    21922262#: ../classes/Content/File/File.php:164 ../classes/Content/File/File.php:166 
     2263#: ../classes/Content/File/File.php:206 
    21932264msgid "File size exceeds limit specified HTML form" 
    21942265msgstr "" 
     
    21972268#: ../classes/Content/File.php:103 ../classes/Content/File/File.php:173 
    21982269#: ../classes/Content/File/File.php:168 ../classes/Content/File/File.php:170 
     2270#: ../classes/Content/File/File.php:210 
    21992271msgid "File upload was interrupted" 
    22002272msgstr "Der Upload wurde unterbrochen" 
     
    22022274#: ../classes/Content/File.php:110 ../classes/Content/File/File.php:177 
    22032275#: ../classes/Content/File/File.php:172 ../classes/Content/File/File.php:174 
     2276#: ../classes/Content/File/File.php:214 
    22042277msgid "Missing temp folder" 
    22052278msgstr "Das temporäre Verzeichnis fehlt." 
     
    22102283#: ../classes/Content/File/File.php:454 ../classes/Content/File/File.php:437 
    22112284#: ../classes/Content/Avatar/Avatar.php:96 
     2285#: ../classes/Content/File/File.php:492 
    22122286msgid "Upload a new file (Uploading a new one will replace any existing file)" 
    22132287msgstr "Eine neue Datei hochladen (wird die bestehende überschreiben)" 
     
    22182292#: ../classes/Content/File/File.php:464 ../classes/Content/File/File.php:447 
    22192293#: ../classes/Content/Avatar/Avatar.php:106 
     2294#: ../classes/Content/File/File.php:501 
    22202295msgid "Remote file via URL" 
    22212296msgstr "Datei auf einem anderen Server" 
     
    22262301#: ../classes/Content/File/File.php:478 ../classes/Content/File/File.php:461 
    22272302#: ../classes/Content/Avatar/Avatar.php:120 
     2303#: ../classes/Content/File/File.php:518 
    22282304msgid "File URL" 
    22292305msgstr "Adresse" 
     
    22312307#: ../classes/Content/File.php:256 ../classes/Content/File/File.php:467 
    22322308#: ../classes/Content/File/File.php:486 ../classes/Content/File/File.php:470 
     2309#: ../classes/Content/File/File.php:528 
    22332310msgid "Filename to display" 
    22342311msgstr "Anzuzeigender Dateiname" 
     
    22362313#: ../classes/Content/File.php:265 ../classes/Content/File/File.php:475 
    22372314#: ../classes/Content/File/File.php:494 ../classes/Content/File/File.php:480 
     2315#: ../classes/Content/File/File.php:540 
    22382316msgid "MIME type" 
    22392317msgstr "MIME-Typ" 
     
    22412319#: ../classes/Content/File.php:272 ../classes/Content/File/File.php:482 
    22422320#: ../classes/Content/File/File.php:501 ../classes/Content/File/File.php:488 
     2321#: ../classes/Content/File/File.php:549 
    22432322msgid "Locally stored file size" 
    22442323msgstr "Größe der lokalen Datei" 
     
    22462325#: ../classes/Content/File.php:281 ../classes/Content/File/File.php:489 
    22472326#: ../classes/Content/File/File.php:508 ../classes/Content/File/File.php:493 
     2327#: ../classes/Content/File/File.php:556 
    22482328msgid "Remote file size (Automatically converted from KB to Bytes)" 
    22492329msgstr "" 
     
    22532333#: ../classes/Content/File.php:377 ../classes/Content/File/File.php:626 
    22542334#: ../classes/Content/File/File.php:638 ../classes/Content/File/File.php:617 
     2335#: ../classes/Content/File/File.php:704 
    22552336msgid "Could not delete this file, since it is persistent" 
    22562337msgstr "" 
     
    25602641#: ../classes/Content/Langstring/Langstring.php:211 
    25612642#: ../classes/Content/SimpleString/SimpleString.php:101 
     2643#: ../classes/Content/Langstring/Langstring.php:286 
     2644#: ../classes/Content/SimpleString/SimpleString.php:130 
    25622645msgid "Only these HTML tags are allowed : " 
    25632646msgstr "Folgende HTML-Tags sind erlaubt:" 
     
    25702653#: ../classes/Content/Langstring/Langstring.php:279 
    25712654#: ../classes/Content/HTMLeditor/HTMLeditor.php:153 
     2655#: ../classes/Content/HTMLeditor/HTMLeditor.php:211 
     2656#: ../classes/Content/Langstring/Langstring.php:354 
    25722657msgid "Delete string" 
    25732658msgstr "Zeichenfolge löschen" 
     
    25802665#: ../classes/Content/Langstring/Langstring.php:339 
    25812666#: ../classes/Content/HTMLeditor/HTMLeditor.php:191 
     2667#: ../classes/Content/HTMLeditor/HTMLeditor.php:146 
     2668#: ../classes/Content/Langstring/Langstring.php:229 
    25822669msgid "Add new string" 
    25832670msgstr "Neue Zeichenfolge hinzufügen" 
     
    26192706#: ../classes/Content/Picture/Picture.php:241 
    26202707#: ../classes/Content/Picture/Picture.php:259 
     2708#: ../classes/Content/Picture/Picture.php:271 
     2709#: ../classes/Content/Picture/Picture.php:280 
    26212710msgid "Width (leave empty if you want to keep original width)" 
    26222711msgstr "Breite (leer lassen, falls in die Originalbreite benutzt werden soll)" 
     
    26262715#: ../classes/Content/Picture/Picture.php:248 
    26272716#: ../classes/Content/Picture/Picture.php:266 
     2717#: ../classes/Content/Picture/Picture.php:278 
     2718#: ../classes/Content/Picture/Picture.php:287 
    26282719msgid "Height (leave empty if you want to keep original height)" 
    26292720msgstr "Höhe (leer lassen, falls die Originalhöhe benutzt werden soll)" 
     
    28492940msgstr "Der RSS-Feed konnte nicht empfangen werden: %S" 
    28502941 
    2851 #: smarty.txt:2 smarty.txt:8 ../classes/User.php:735 
     2942#: smarty.txt:2 smarty.txt:8 ../classes/User.php:735 ../classes/User.php:789 
    28522943msgid "Change my password" 
    28532944msgstr "Mein Passwort ändern" 
     
    28572948#: smarty.txt:150 smarty.txt:177 smarty.txt:153 smarty.txt:180 smarty.txt:127 
    28582949#: smarty.txt:158 smarty.txt:65 smarty.txt:66 smarty.txt:90 smarty.txt:84 
     2950#: smarty.txt:53 smarty.txt:62 
    28592951msgid "Your username" 
    28602952msgstr "Ihr Benutzername" 
    28612953 
    2862 #: smarty.txt:4 ../classes/User.php:719 
     2954#: smarty.txt:4 ../classes/User.php:719 ../classes/User.php:773 
    28632955msgid "Your current password" 
    28642956msgstr "Ihr aktuelles Passwort" 
    28652957 
    2866 #: smarty.txt:5 smarty.txt:6 ../classes/User.php:725 
     2958#: smarty.txt:5 smarty.txt:6 ../classes/User.php:725 ../classes/User.php:779 
    28672959msgid "Your new password" 
    28682960msgstr "Ihr neues Passwort" 
     
    29673059#: smarty.txt:22 smarty.txt:83 smarty.txt:34 smarty.txt:95 smarty.txt:40 
    29683060#: smarty.txt:101 smarty.txt:103 smarty.txt:126 smarty.txt:148 smarty.txt:151 
    2969 #: smarty.txt:129 smarty.txt:64 smarty.txt:65 smarty.txt:59 
     3061#: smarty.txt:129 smarty.txt:64 smarty.txt:65 smarty.txt:59 smarty.txt:52 
    29703062msgid "Lost password" 
    29713063msgstr "Vergessenes Passwort" 
     
    29763068#: smarty.txt:186 smarty.txt:154 smarty.txt:162 smarty.txt:189 smarty.txt:128 
    29773069#: smarty.txt:168 smarty.txt:66 smarty.txt:70 smarty.txt:43 smarty.txt:67 
    2978 #: smarty.txt:94 smarty.txt:37 smarty.txt:61 smarty.txt:88 
     3070#: smarty.txt:94 smarty.txt:37 smarty.txt:61 smarty.txt:88 smarty.txt:54 
     3071#: smarty.txt:58 
    29793072msgid "Your email address" 
    29803073msgstr "Ihre E-Mail-Adresse" 
     
    29873080#: smarty.txt:26 smarty.txt:38 smarty.txt:44 smarty.txt:127 smarty.txt:149 
    29883081#: smarty.txt:152 smarty.txt:130 smarty.txt:67 smarty.txt:68 smarty.txt:62 
     3082#: smarty.txt:55 
    29893083msgid "Please enter your username or email address to reset your password" 
    29903084msgstr "" 
     
    29943088#: smarty.txt:27 smarty.txt:82 smarty.txt:39 smarty.txt:94 smarty.txt:45 
    29953089#: smarty.txt:100 smarty.txt:102 smarty.txt:135 smarty.txt:157 smarty.txt:160 
    2996 #: smarty.txt:136 smarty.txt:69 smarty.txt:93 smarty.txt:87 
     3090#: smarty.txt:136 smarty.txt:69 smarty.txt:93 smarty.txt:87 smarty.txt:57 
    29973091msgid "Lost username" 
    29983092msgstr "Vergessener Benutzername" 
     
    30053099#: smarty.txt:30 smarty.txt:42 smarty.txt:48 smarty.txt:136 smarty.txt:158 
    30063100#: smarty.txt:161 smarty.txt:139 smarty.txt:71 smarty.txt:95 smarty.txt:89 
     3101#: smarty.txt:59 
    30073102msgid "Please enter your email address to recover your username" 
    30083103msgstr "" 
     
    31363231#: smarty.txt:59 smarty.txt:81 smarty.txt:71 smarty.txt:93 smarty.txt:77 
    31373232#: smarty.txt:99 smarty.txt:79 smarty.txt:101 smarty.txt:153 smarty.txt:175 
    3138 #: smarty.txt:178 smarty.txt:157 smarty.txt:89 smarty.txt:83 
     3233#: smarty.txt:178 smarty.txt:157 smarty.txt:89 smarty.txt:83 smarty.txt:61 
    31393234msgid "Re-send validation email" 
    31403235msgstr "Bestätigungs-E-Mail nochmals anfordern" 
     
    31473242#: smarty.txt:62 smarty.txt:74 smarty.txt:80 smarty.txt:82 smarty.txt:154 
    31483243#: smarty.txt:176 smarty.txt:179 smarty.txt:160 smarty.txt:79 smarty.txt:91 
    3149 #: smarty.txt:85 
     3244#: smarty.txt:85 smarty.txt:63 
    31503245msgid "" 
    31513246"Please enter your username and the validation email will be resent to your " 
     
    31573252#: smarty.txt:63 smarty.txt:75 smarty.txt:81 smarty.txt:83 smarty.txt:161 
    31583253#: smarty.txt:183 smarty.txt:186 smarty.txt:166 smarty.txt:41 smarty.txt:35 
     3254#: smarty.txt:65 
    31593255msgid "Register a free account with" 
    31603256msgstr "Einen neuen Zugang registrieren bei" 
     
    31623258#: smarty.txt:64 smarty.txt:76 smarty.txt:82 smarty.txt:84 smarty.txt:163 
    31633259#: smarty.txt:185 smarty.txt:188 smarty.txt:167 smarty.txt:42 smarty.txt:36 
     3260#: smarty.txt:66 
    31643261msgid "Username desired" 
    31653262msgstr "Gewünschter Benutzername" 
     
    31673264#: smarty.txt:67 smarty.txt:79 smarty.txt:85 smarty.txt:87 smarty.txt:166 
    31683265#: smarty.txt:188 smarty.txt:191 smarty.txt:170 smarty.txt:45 smarty.txt:39 
     3266#: smarty.txt:69 
    31693267msgid "Password (again)" 
    31703268msgstr "Passwort (wiederholen)" 
     
    31773275#: smarty.txt:69 smarty.txt:81 smarty.txt:87 smarty.txt:89 smarty.txt:168 
    31783276#: smarty.txt:190 smarty.txt:193 smarty.txt:172 smarty.txt:86 smarty.txt:46 
    3179 #: smarty.txt:40 
     3277#: smarty.txt:40 smarty.txt:70 
    31803278msgid "Please note" 
    31813279msgstr "Bitte beachten Sie" 
     
    31833281#: smarty.txt:70 smarty.txt:82 smarty.txt:88 smarty.txt:90 smarty.txt:169 
    31843282#: smarty.txt:191 smarty.txt:194 smarty.txt:173 smarty.txt:87 smarty.txt:47 
    3185 #: smarty.txt:41 
     3283#: smarty.txt:41 smarty.txt:71 
    31863284msgid "" 
    31873285"While accounts are free, we <em>strongly</em> suggest that you use your " 
     
    31933291#: smarty.txt:71 smarty.txt:83 smarty.txt:89 smarty.txt:91 smarty.txt:170 
    31943292#: smarty.txt:192 smarty.txt:195 smarty.txt:174 smarty.txt:51 smarty.txt:45 
     3293#: smarty.txt:75 
    31953294msgid "Note to free web-based email users" 
    31963295msgstr "Hinweis an Nutzer von kostenlosen E-Mail-Anbietern" 
     
    31983297#: smarty.txt:72 smarty.txt:84 smarty.txt:90 smarty.txt:92 smarty.txt:171 
    31993298#: smarty.txt:193 smarty.txt:196 smarty.txt:175 smarty.txt:52 smarty.txt:46 
     3299#: smarty.txt:76 
    32003300msgid "" 
    32013301"Sometimes our validation email ends up in the 'spam' folder of some " 
     
    32093309 
    32103310#: smarty.txt:73 smarty.txt:85 smarty.txt:91 smarty.txt:93 smarty.txt:176 
    3211 #: smarty.txt:53 smarty.txt:47 
     3311#: smarty.txt:53 smarty.txt:47 smarty.txt:77 
    32123312msgid "You can also use the following links if you need help" 
    32133313msgstr "Sie können auch die folgenden Links nutzen, falls Sie Hilfe benötigen" 
     
    33283428#: smarty.txt:124 smarty.txt:136 smarty.txt:142 smarty.txt:148 smarty.txt:150 
    33293429#: smarty.txt:211 smarty.txt:233 smarty.txt:236 smarty.txt:219 smarty.txt:127 
    3330 #: smarty.txt:96 smarty.txt:90 
     3430#: smarty.txt:96 smarty.txt:90 smarty.txt:84 
    33313431msgid "User list" 
    33323432msgstr "Benutzerliste" 
     
    33343434#: smarty.txt:125 smarty.txt:137 smarty.txt:143 smarty.txt:149 smarty.txt:151 
    33353435#: smarty.txt:212 smarty.txt:234 smarty.txt:237 smarty.txt:220 smarty.txt:128 
    3336 #: smarty.txt:97 smarty.txt:91 
     3436#: smarty.txt:97 smarty.txt:91 smarty.txt:85 
    33373437msgid "Sort by:" 
    33383438msgstr "Sortiert nach:" 
     
    33403440#: smarty.txt:126 smarty.txt:138 smarty.txt:144 smarty.txt:150 smarty.txt:152 
    33413441#: smarty.txt:213 smarty.txt:235 smarty.txt:238 smarty.txt:221 smarty.txt:129 
    3342 #: smarty.txt:98 smarty.txt:92 
     3442#: smarty.txt:98 smarty.txt:92 smarty.txt:86 
    33433443msgid "Direction:" 
    33443444msgstr "Anordnung" 
     
    33463446#: smarty.txt:127 smarty.txt:139 smarty.txt:145 smarty.txt:151 smarty.txt:153 
    33473447#: smarty.txt:214 smarty.txt:236 smarty.txt:239 smarty.txt:222 smarty.txt:130 
    3348 #: smarty.txt:99 smarty.txt:93 
     3448#: smarty.txt:99 smarty.txt:93 smarty.txt:87 
    33493449msgid "Sort" 
    33503450msgstr "Sortieren" 
     
    33563456#: ../classes/StatisticReport/UserReport.php:137 smarty.txt:216 smarty.txt:238 
    33573457#: smarty.txt:241 smarty.txt:224 smarty.txt:132 smarty.txt:101 
    3358 #: ../classes/StatisticReport/UserReport.php:132 smarty.txt:95 
     3458#: ../classes/StatisticReport/UserReport.php:132 smarty.txt:95 smarty.txt:89 
    33593459msgid "Network" 
    33603460msgstr "Netzwerk" 
     
    33623462#: smarty.txt:130 smarty.txt:142 smarty.txt:148 smarty.txt:154 smarty.txt:156 
    33633463#: smarty.txt:217 smarty.txt:239 smarty.txt:242 smarty.txt:225 smarty.txt:133 
    3364 #: smarty.txt:102 smarty.txt:96 
     3464#: smarty.txt:102 smarty.txt:96 smarty.txt:90 
    33653465msgid "Registered On" 
    33663466msgstr "Registriert am" 
     
    33713471#: smarty.txt:243 smarty.txt:226 smarty.txt:134 smarty.txt:103 
    33723472#: ../classes/StatisticReport/UserReport.php:147 ../classes/User.php:698 
    3373 #: smarty.txt:97 
     3473#: smarty.txt:97 ../classes/User.php:752 smarty.txt:91 
    33743474msgid "Account Status" 
    33753475msgstr "Status des Zugangs" 
     
    34013501 
    34023502#: smarty.txt:25 smarty.txt:31 smarty.txt:67 smarty.txt:89 smarty.txt:92 
    3403 #: smarty.txt:69 smarty.txt:38 smarty.txt:58 smarty.txt:52 
     3503#: smarty.txt:69 smarty.txt:38 smarty.txt:58 smarty.txt:52 smarty.txt:24 
    34043504msgid "Hotspot / Status" 
    34053505msgstr "Hotspot /Status" 
    34063506 
    34073507#: smarty.txt:27 smarty.txt:33 smarty.txt:69 smarty.txt:91 smarty.txt:94 
    3408 #: smarty.txt:71 smarty.txt:40 smarty.txt:60 smarty.txt:54 
     3508#: smarty.txt:71 smarty.txt:40 smarty.txt:60 smarty.txt:54 smarty.txt:26 
    34093509msgid "Location" 
    34103510msgstr "Adresse" 
    34113511 
    34123512#: smarty.txt:28 smarty.txt:34 smarty.txt:70 smarty.txt:92 smarty.txt:95 
    3413 #: smarty.txt:72 smarty.txt:41 smarty.txt:61 smarty.txt:55 
     3513#: smarty.txt:72 smarty.txt:41 smarty.txt:61 smarty.txt:55 smarty.txt:27