Esempio n. 1
0
function links_my_tasks_dropdown()
{
    echo '<li class="header"><a href="' . get_url('links', 'index') . '">' . lang('links') . '</a></li>';
    if (ProjectLink::canAdd(logged_user(), active_project())) {
        echo '<li><a href="' . get_url('links', 'add_link') . '">' . lang('add link') . '</a></li>';
    }
    // if
}
Esempio n. 2
0
<?php

trace(__FILE__, 'begin');
set_page_title(lang('project links'));
project_tabbed_navigation(PROJECT_TAB_LINKS);
project_crumbs(array(array(lang('links'), get_url('links', 'index')), array(lang('index'))));
if (ProjectLink::canAdd(logged_user(), active_project())) {
    add_page_action(lang('add link'), get_url('links', 'add_link'));
}
// if
add_stylesheet_to_page('project/files.css');
$counter = 0;
?>
<div id="files">
<?php 
if (isset($links) && is_array($links) && count($links)) {
    ?>
<div class="filesList">
<?php 
    foreach ($links as $link) {
        $counter++;
        ?>
  <div class="listedFile <?php 
        echo $counter % 2 ? 'even' : 'odd';
        ?>
">
  <div class="fileInfo">
      <div class="fileName"><a href="<?php 
        echo $link->asUrl();
        ?>
" title="<?php 
 /**
  * Delete project link
  *
  * @param void
  * @return null
  */
 function delete_link()
 {
     $project_link = ProjectLinks::findById(get_id());
     if (!ProjectLink::canEdit(logged_user())) {
         flash_error(lang('no access permissions'));
         $this->redirectTo('links', 'index');
     }
     // if
     if (!$project_link instanceof ProjectLink) {
         flash_error(lang('project link dnx'));
         $this->redirectTo('links');
     }
     // if
     try {
         DB::beginWork();
         $project_link->delete();
         ApplicationLogs::createLog($project_link, active_project(), ApplicationLogs::ACTION_DELETE);
         DB::commit();
         flash_success(lang('success delete link', $project_link->getTitle()));
         $this->redirectTo('links');
     } catch (Exception $e) {
         DB::rollback();
         tpl_assign('error', $e);
     }
     // try
 }
Esempio n. 4
0
 /**
  * @return \yii\db\ActiveQuery
  */
 public function getProjectLinks()
 {
     return $this->hasMany(ProjectLink::className(), ['project_id' => 'id']);
 }
 /**
  * Copy project
  *
  * @param void
  * @return null
  */
 function copy()
 {
     trace(__FILE__, "copy():begin");
     if (!Project::canAdd(logged_user())) {
         flash_error(lang('no access permissions'));
         $this->redirectToReferer(get_url('dashboard'));
     }
     // if
     $this->setTemplate('copy_project');
     $this->setLayout('administration');
     $project_data = array_var($_POST, 'project');
     tpl_assign('project_data', $project_data);
     // Submitted...
     if (is_array($project_data)) {
         $source = Projects::findById($project_data['source']);
         if (!$source instanceof Project) {
             flash_error(lang('project dnx'));
             $this->redirectTo('administration', 'projects');
         }
         // if
         try {
             $shift_dates = isset($project_data['shift_dates']) ? $project_data['shift_dates'] == 'checked' : false;
             $copy_details = isset($project_data['copy_details']) ? $project_data['copy_details'] == 'checked' : false;
             $copy_tasks = isset($project_data['copy_tasks']) ? $project_data['copy_tasks'] == 'checked' : false;
             $copy_milestones = isset($project_data['copy_milestones']) ? $project_data['copy_milestones'] == 'checked' : false;
             $copy_messages = isset($project_data['copy_messages']) ? $project_data['copy_messages'] == 'checked' : false;
             $copy_links = isset($project_data['copy_links']) ? $project_data['copy_links'] == 'checked' : false;
             $copy_files = isset($project_data['copy_files']) ? $project_data['copy_files'] == 'checked' : false;
             $copy_users = isset($project_data['copy_users']) ? $project_data['copy_users'] == 'checked' : false;
             $copy_pages = isset($project_data['copy_pages']) ? $project_data['copy_pages'] == 'checked' : false;
             DB::beginWork();
             $project = new Project();
             $new_name = lang('projects copy new name', $source->getName());
             $new_name .= date(' z H:i:s');
             $project->setName($new_name);
             if ($copy_details) {
                 $project->setDescription($source->getDescription());
                 $project->setPriority($source->getPriority());
                 $project->setShowDescriptionInOverview($source->getShowDescriptionInOverview());
             }
             $project->save();
             $project_id = $project->getId();
             $add_seconds = 0;
             if (isset($project_data['add_days'])) {
                 $add_days = 0 + trim($project_data['add_days']);
                 $add_seconds = $add_days * 24 * 60 * 60;
             }
             $source_created_on = $source->getCreatedOn();
             //var_dump($source_created_on);
             $milestone_map = array(0 => 0);
             // project milestones
             if ($copy_milestones) {
                 $source_milestones = $source->getAllMilestones();
                 if (is_array($source_milestones)) {
                     foreach ($source_milestones as $source_milestone) {
                         $milestone = new ProjectMilestone();
                         //$milestone->copy($source_milestone);
                         $milestone->setName($source_milestone->getName());
                         $milestone->setDescription($source_milestone->getDescription());
                         if ($shift_dates) {
                             trace(__FILE__, "copy():shift dates");
                             $milestone->setDueDate(DateTimeValueLib::now());
                             $seconds = $source_milestone->getDueDate()->difference($source_created_on);
                             $milestone->getDueDate()->advance($seconds);
                         } else {
                             $milestone->setDueDate($source_milestone->getDueDate());
                         }
                         $milestone->getDueDate()->advance($add_seconds);
                         $milestone->setIsPrivate($source_milestone->getIsPrivate());
                         $milestone->setAssignedToUserId($source_milestone->getAssignedToUserId());
                         $milestone->setAssignedToCompanyId($source_milestone->getAssignedToCompanyId());
                         $milestone->setProjectId($project_id);
                         $milestone->save();
                         $milestone_map[$source_milestone->getId()] = $milestone->getId();
                     }
                     // foreach
                 }
                 // if
             }
             // if
             // project tasks
             if ($copy_tasks) {
                 $source_task_lists = $source->getAllTaskLists();
                 if (is_array($source_task_lists)) {
                     foreach ($source_task_lists as $source_task_list) {
                         $task_list = new ProjectTaskList();
                         //$task_list->copy($source_milestone);
                         $task_list->setName($source_task_list->getName());
                         $task_list->setPriority($source_task_list->getPriority());
                         $task_list->setDescription($source_task_list->getDescription());
                         if ($copy_milestones) {
                             $task_list->setMilestoneId($milestone_map[$source_task_list->getMilestoneId()]);
                         }
                         $task_list->setDueDate($source_task_list->getDueDate());
                         if ($task_list->getDueDate() instanceof DateTimeValue) {
                             if ($shift_dates) {
                                 trace(__FILE__, "copy():task list shift dates");
                                 $task_list->setDueDate(DateTimeValueLib::now());
                                 $seconds = $source_task_list->getDueDate()->difference($source_created_on);
                                 $task_list->getDueDate()->advance($seconds);
                             }
                             $task_list->getDueDate()->advance($add_seconds);
                         }
                         $task_list->setIsPrivate($source_task_list->getIsPrivate());
                         $task_list->setOrder($source_task_list->getOrder());
                         $task_list->setProjectId($project_id);
                         $task_list->save();
                         $source_tasks = $source_task_list->getTasks();
                         if (is_array($source_tasks)) {
                             foreach ($source_tasks as $source_task) {
                                 $task = new ProjectTask();
                                 $task->setOrder($source_task->getOrder());
                                 $task->setDueDate($source_task->getDueDate());
                                 if ($task->getDueDate() instanceof DateTimeValue) {
                                     if ($shift_dates) {
                                         trace(__FILE__, "copy():task shift dates");
                                         $task->setDueDate(DateTimeValueLib::now());
                                         $seconds = $source_task->getDueDate()->difference($source_created_on);
                                         $task->getDueDate()->advance($seconds);
                                     }
                                     $task->getDueDate()->advance($add_seconds);
                                 }
                                 $task->setText($source_task->getText());
                                 $task->getAssignedToUserId($source_task->getAssignedToUserId());
                                 $task->getAssignedToCompanyId($source_task->getAssignedToCompanyId());
                                 $task_list->attachTask($task);
                             }
                         }
                     }
                     // foreach
                 }
                 // if
             }
             // if
             // project messages
             if ($copy_messages) {
                 $source_messages = $source->getAllMessages();
                 if (is_array($source_messages)) {
                     foreach ($source_messages as $source_message) {
                         $message = new ProjectMessage();
                         //$message->copy($source_message);
                         $message->setTitle($source_message->getTitle());
                         $message->setText($source_message->getText());
                         $message->setAdditionalText($source_message->getAdditionalText());
                         if ($copy_milestones) {
                             $message->setMilestoneId($milestone_map[$source_message->getMilestoneId()]);
                         }
                         $message->setIsImportant($source_message->getIsImportant());
                         $message->setIsPrivate($source_message->getIsPrivate());
                         $message->setCommentsEnabled($source_message->getCommentsEnabled());
                         $message->setAnonymousCommentsEnabled($source_message->getAnonymousCommentsEnabled());
                         $message->setProjectId($project_id);
                         $message->save();
                     }
                     // foreach
                 }
                 // if
             }
             // if
             // project links
             if ($copy_links) {
                 $source_links = ProjectLinks::getAllProjectLinks($source);
                 if (is_array($source_links)) {
                     foreach ($source_links as $source_link) {
                         $link = new ProjectLink();
                         //$folder->copy($source_link);
                         $link->setTitle($source_link->getTitle());
                         $link->setUrl($source_link->getUrl());
                         $link->setProjectId($project_id);
                         $link->save();
                     }
                     // foreach
                 }
                 // if
             }
             // if
             // project folders & files
             if ($copy_files) {
                 $folder_map = array(0 => 0);
                 $source_folders = $source->getFolders();
                 if (is_array($source_folders)) {
                     foreach ($source_folders as $source_folder) {
                         $folder = new ProjectFolder();
                         //$folder->copy($source_folder);
                         $folder->setName($source_folder->getName());
                         $folder->setProjectId($project_id);
                         $folder->save();
                         $folder_map[$source_folder->getId()] = $folder->getId();
                     }
                     // foreach
                 }
                 // if
                 $source_files = ProjectFiles::getAllFilesByProject($source);
                 if (is_array($source_files)) {
                     foreach ($source_files as $source_file) {
                         $file = new ProjectFile();
                         $file->setProjectId($project_id);
                         $file->setFolderId($folder_map[$source_file->getFolderId()]);
                         $file->setFileName($source_file->getFileName());
                         $file->setDescription($source_file->getDescription());
                         $file->setIsPrivate($source_file->getIsPrivate());
                         $file->setIsImportant($source_file->getIsImportant());
                         $file->setIsLocked($source_file->getIsLocked());
                         $file->setIsVisible($source_file->getIsVisible());
                         $file->setExpirationTime($source_file->getExpirationTime());
                         $file->setCommentsEnabled($source_file->getCommentsEnabled());
                         $file->setAnonymousCommentsEnabled($source_file->getAnonymousCommentsEnabled());
                         $file->save();
                         $source_revision = $source_file->getLastRevision();
                         if ($source_revision instanceof ProjectFileRevision) {
                             $revision = new ProjectFileRevision();
                             $revision->setFileId($file->getId());
                             $revision->setRevisionNumber($source_revision->getRevisionNumber());
                             $revision->setRepositoryId($source_revision->getRepositoryId());
                             $revision->setFilesize($source_revision->getFilesize());
                             $revision->setFilename($source_revision->getFileName());
                             $revision->setTypeString($source_revision->getTypeString());
                             $revision->setThumbFilename($source_revision->getThumbFilename());
                             $revision->setFileTypeId($source_revision->getFileTypeId());
                             $revision->setComment($source_revision->getComment());
                             $revision->save();
                         }
                     }
                     // foreach
                 }
                 // if
             }
             // if
             if ($copy_pages) {
                 $source_pages = Wiki::getAllProjectPages($source);
                 if (is_array($source_pages)) {
                     foreach ($source_pages as $source_page) {
                         $page = new WikiPage();
                         $page->setProjectId($project_id);
                         $page->setProjectIndex($source_page->getProjectIndex());
                         $page->setProjectSidebar($source_page->getProjectSidebar());
                         if (plugin_active('tags')) {
                             //$page->setTags($source_page->getTagNames());
                         }
                         //Make a new revision of this page
                         $revision = $page->makeRevision();
                         $source_revision = $source_page->getLatestRevision();
                         //Set attributes
                         $revision->setName($source_revision->getName());
                         $revision->setContent($source_revision->getContent());
                         $revision->setLogMessage($source_revision->getLogMessage());
                         //Save the page
                         $page->save();
                     }
                     // foreach
                 }
                 // if
             }
             // if
             if ($copy_users) {
                 $source_companies = ProjectCompanies::instance()->getCompaniesByProject($source);
                 if (is_array($source_companies)) {
                     foreach ($source_companies as $source_company) {
                         $project_company = new ProjectCompany();
                         $project_company->setCompanyId($source_company->getId());
                         $project_company->setProjectId($project_id);
                         $project_company->save();
                     }
                     // foreach
                 }
                 $source_users = ProjectUsers::instance()->getUsersByProject($source);
                 if (is_array($source_users)) {
                     foreach ($source_users as $source_user) {
                         $project_user = new ProjectUser();
                         $project_user->setUserId($source_user->getId());
                         $project_user->setProjectId($project_id);
                         $project_user->save();
                     }
                     // foreach
                 }
             }
             /*
                       $permissions = array_keys(PermissionManager::getPermissionsText());
                       $auto_assign_users = owner_company()->getAutoAssignUsers();
                       
                       // We are getting the list of auto assign users. If current user is not in the list
                       // add it. He's creating the project after all...
                       if (is_array($auto_assign_users)) {
                         $auto_assign_logged_user = false;
                         foreach ($auto_assign_users as $user) {
                           if ($user->getId() == logged_user()->getId()) {
                             $auto_assign_logged_user = true;
                           }
                         } // if
                         if (!$auto_assign_logged_user) {
                           $auto_assign_users[] = logged_user();
                         }
                       } else {
                         $auto_assign_users[] = logged_user();
                       } // if
                       
                       foreach ($auto_assign_users as $user) {
                         $project_user = new ProjectUser();
                         $project_user->setProjectId($project->getId());
                         $project_user->setUserId($user->getId());
                         if (is_array($permissions)) {
                           foreach ($permissions as $permission) {
                             $user = Users::findById($project_user->getUserId());
                             $user->setProjectPermission($project,$permission,true);
                           }
                         } // if
                         $project_user->save();
                       } // foreach
             */
             ApplicationLogs::createLog($project, null, ApplicationLogs::ACTION_ADD, false, true);
             DB::commit();
             flash_success(lang('success copy project', $source->getName(), $project->getName()));
             $this->redirectToUrl($project->getPermissionsUrl());
         } catch (Exception $e) {
             echo $e->getMessage();
             tpl_assign('error', $e);
             DB::rollback();
         }
         // try
     }
     // if (submitted)
 }
Esempio n. 6
0
 public static function parseBBCode($text)
 {
     if (Format::$BBCodeParser === null) {
         Format::$BBCodeParser = new BBCodeParser();
         /**********************************\
         			          NO CLOSING TAGS
         			\**********************************/
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("separator", function ($tag, $parameter, $content) {
             return Separator::getInstance()->getHtml();
         }));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("pin", function ($tag, $parameter, $content) {
             return Pin::getInstance()->getHtml();
         }));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("advert", function ($tag, $parameter, $content) {
             return "<script src='http://www.blogbang.com/demo/js/blogbang_ad.php?id=6ee3436cd7' type='text/javascript'></script>";
         }));
         /**********************************\
         			       NO PARAMETERED TAGS
         			\**********************************/
         $notFormattedContent = function ($tag, $parameter, $content) {
             return BBCodeDescriptor::contentToString($content);
         };
         $simpleOpenTag = function ($tag, $parameter, $content) {
             return "<{$tag}>";
         };
         $simpleCloseTag = function ($tag, $parameter, $content) {
             return "</{$tag}>";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("b", $simpleOpenTag, $simpleCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("i", $simpleOpenTag, $simpleCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("u", $simpleOpenTag, $simpleCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("s", $simpleOpenTag, $simpleCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("code", $simpleOpenTag, $simpleCloseTag, $notFormattedContent));
         /**********************************\
         			                TITLE
         			\**********************************/
         $titleOpenTag = function ($tag, $parameter, $content) {
             $level = 1;
             if ($parameter === null) {
                 // let as is
             } else {
                 $parameters = preg_split('#\\|#', $parameter);
                 $level = $parameters[0];
             }
             return "<h" . $level . ">";
         };
         $titleContent = function ($tag, $parameter, $content) {
             $level = 1;
             static $lastNumbers = array();
             if ($parameter === null) {
                 // let as is
             } else {
                 $parameters = preg_split('#\\|#', $parameter);
                 $level = $parameters[0];
                 if (count($parameters) == 2) {
                     if ($parameters[1] == 'number') {
                         if (in_array($level, array_keys($lastNumbers))) {
                             $lastNumbers[$level]++;
                         } else {
                             $lastNumbers[$level] = 1;
                         }
                         $content = $lastNumbers[$level] . ". " . $content;
                     } else {
                         throw new Exception($parameters[1] . " is not a known parameter");
                     }
                 } else {
                     // do nothing special
                 }
             }
             return $content;
         };
         $titleCloseTag = function ($tag, $parameter, $content) {
             $level = 1;
             if ($parameter === null) {
                 // let as is
             } else {
                 $parameters = preg_split('#\\|#', $parameter);
                 $level = $parameters[0];
             }
             return "</h" . $level . ">";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("title", $titleOpenTag, $titleCloseTag, $titleContent));
         /**********************************\
         			                SIZE
         			\**********************************/
         $sizeOpenTag = function ($tag, $parameter, $content) {
             $parameter = is_numeric($parameter) ? $parameter . 'em' : $parameter;
             return "<span style='font-size: " . $parameter . ";'>";
         };
         $sizeCloseTag = function ($tag, $parameter, $content) {
             return "</span>";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("size", $sizeOpenTag, $sizeCloseTag));
         /**********************************\
         			              COLORS
         			\**********************************/
         $colorOpenTag = function ($tag, $parameter, $content) {
             return "<span style='color: {$parameter};'>";
         };
         $colorCloseTag = function ($tag, $parameter, $content) {
             return "</span>";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("color", $colorOpenTag, $colorCloseTag));
         /**********************************\
         			             ALIGNEMENT
         			\**********************************/
         $alignOpenTag = function ($tag, $parameter, $content) {
             if ($tag === 'align') {
                 $tag = empty($parameter) ? 'inherited' : $parameter;
             }
             if (in_array($tag, array('left', 'right', 'center', 'justify'))) {
                 return "<div style='text-align: {$tag};'>";
             } else {
                 throw new Exception($tag . " is not managed");
             }
         };
         $alignCloseTag = function ($tag, $parameter, $content) {
             return "</div>";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("left", $alignOpenTag, $alignCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("right", $alignOpenTag, $alignCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("center", $alignOpenTag, $alignCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("justify", $alignOpenTag, $alignCloseTag));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("align", $alignOpenTag, $alignCloseTag));
         /**********************************\
         			         LISTS & LIST ITEMS
         			\**********************************/
         $listOpenTag = function ($tag, $parameter, $content) {
             if ($tag === 'list') {
                 return $parameter === '1' ? '<ol>' : '<ul>';
             } else {
                 if ($tag === 'item') {
                     return '<li>';
                 } else {
                     throw new Exception($tag . " is not managed");
                 }
             }
         };
         $listCloseTag = function ($tag, $parameter, $content) {
             if ($tag === 'list') {
                 return $parameter === '1' ? '</ol>' : '</ul>';
             } else {
                 if ($tag === 'item') {
                     return '</li>';
                 } else {
                     throw new Exception($tag . " is not managed");
                 }
             }
         };
         $listContent = function ($tag, $parameter, $content) {
             if ($tag === 'list') {
                 $content = Format::trimAndCleanArray($content);
                 return BBCodeDescriptor::defaultContentCallback($tag, $parameter, $content);
             }
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("list", $listOpenTag, $listCloseTag, $listContent));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("item", $listOpenTag, $listCloseTag));
         /**********************************\
         			               IMAGES
         			\**********************************/
         $imageOpenTag = function ($tag, $parameter, $content) {
             if (empty($parameter)) {
                 $parameter = $content;
                 $content = null;
             }
             if (empty($parameter)) {
                 throw new Exception("No image given");
             }
             if ($tag === 'img') {
                 $image = new Image($parameter, $content);
             } else {
                 if (in_array($tag, array('img-left', 'imgl'))) {
                     $image = new Image($parameter, $content);
                     $image->makeLeftFloating();
                 } else {
                     if (in_array($tag, array('img-right', 'imgr'))) {
                         $image = new Image($parameter, $content);
                         $image->makeRightFloating();
                     } else {
                         if (in_array($tag, array('img-auto', 'imga'))) {
                             $image = new AutoFloatImage($parameter, $content);
                         } else {
                             if (in_array($tag, array('img-auto-right', 'imgar'))) {
                                 $image = new AutoFloatImage($parameter, $content, true);
                             } else {
                                 if (in_array($tag, array('img-auto-left', 'imgal'))) {
                                     $image = new AutoFloatImage($parameter, $content, false);
                                 } else {
                                     throw new Exception($tag . " is not managed");
                                 }
                             }
                         }
                     }
                 }
             }
             return $image->getCurrentHTML();
         };
         $imageCloseTag = function ($tag, $parameter, $content) {
             return "";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("img", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("img-right", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("imgr", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("img-left", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("imgl", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("img-auto", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("imga", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("img-auto-left", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("imgal", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("img-auto-right", $imageOpenTag, $imageCloseTag, null));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("imgar", $imageOpenTag, $imageCloseTag, null));
         /**********************************\
         			          GENERIC LINKS
         			\**********************************/
         $linkOpenTag = function ($tag, $parameter, $content) {
             if (empty($parameter) && empty($content)) {
                 throw new Exception("no data has been given");
             } else {
                 if (empty($content)) {
                     $content = $parameter;
                 } else {
                     if (empty($parameter)) {
                         $parameter = $content;
                     } else {
                         // nothing is empty, so let as is
                     }
                 }
             }
             if (in_array($tag, array('url', 'ext'))) {
                 $link = new Link($parameter, $content);
                 if ($tag == 'ext' || $tag == 'url' && !$link->isLocalLink()) {
                     $link->openNewWindow(true);
                 }
             } else {
                 if ($tag == 'urlk') {
                     $parameter = preg_split('#\\|#', $parameter);
                     $url = null;
                     if (in_array('current', $parameter)) {
                         $url = Url::getCurrentUrl();
                     } else {
                         if (in_array('referer', $parameter)) {
                             $url = new Url($_SERVER['HTTP_REFERER']);
                         } else {
                             throw new Exception("no address keyword has been given (like 'current' or 'referer')");
                         }
                     }
                     $full = false;
                     if (in_array('full', $parameter)) {
                         $full = true;
                     }
                     $link = new Link($url, $content, $full);
                     if (!$link->isLocalLink()) {
                         $link->openNewWindow(true);
                     }
                 } else {
                     if ($tag == 'mail') {
                         if (is_numeric($parameter)) {
                             $parameter = TeamMember::getMember(intval($parameter))->getMail();
                         }
                         $link = new MailLink($parameter, $content);
                     } else {
                         throw new Exception($tag . " is not managed");
                     }
                 }
             }
             return $link->getOpenTag();
         };
         $linkContent = function ($tag, $parameter, $content) {
             if ($tag === 'urlk') {
                 if ($content === null) {
                     $parameter = preg_split('#\\|#', $parameter);
                     $url = null;
                     if (in_array('current', $parameter)) {
                         $url = Url::getCurrentUrl();
                     } else {
                         if (in_array('referer', $parameter)) {
                             $url = new Url($_SERVER['HTTP_REFERER']);
                         } else {
                             throw new Exception("no address keyword has been given (like 'current' or 'referer')");
                         }
                     }
                     $full = false;
                     if (in_array('full', $parameter)) {
                         $full = true;
                     }
                     $content = $url->toString($full);
                 }
             }
             return BBCodeDescriptor::contentToHTML($content);
         };
         $linkCloseTag = function ($tag, $parameter, $content) {
             return "</a>";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("url", $linkOpenTag, $linkCloseTag, $linkContent));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("urlk", $linkOpenTag, $linkCloseTag, $linkContent));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("ext", $linkOpenTag, $linkCloseTag, $linkContent));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("mail", $linkOpenTag, $linkCloseTag, $linkContent));
         /**********************************\
         			          SPECIAL LINKS
         			\**********************************/
         $releaseOpenTag = function ($tag, $parameter, $content) {
             $parameter = preg_split('#\\|#', $parameter);
             if ($parameter[1] === '*') {
                 $parameter[1] = Release::getAllReleasesIDForProject($parameter[0]);
             } else {
                 $parameter[1] = Format::trimAndCleanArray(preg_split('#,#', $parameter[1]));
             }
             $link = new ReleaseLink($parameter[0], $parameter[1], null);
             return $link->getOpenTag();
         };
         $releaseContent = function ($tag, $parameter, $content) {
             if (empty($content)) {
                 $parameter = preg_split('#\\|#', $parameter);
                 if ($parameter[1] === '*') {
                     $parameter[1] = Release::getAllReleasesIDForProject($parameter[0]);
                 } else {
                     $parameter[1] = Format::trimAndCleanArray(preg_split('#,#', $parameter[1]));
                 }
                 $projectName = Project::getProject($parameter[0])->getName();
                 $numbers = array();
                 $others = array();
                 foreach ($parameter[1] as $key => $id) {
                     if (preg_match("#^ep\\d+\$#", $id)) {
                         $numbers[] = substr($id, 2);
                     } else {
                         $others[] = $id;
                     }
                 }
                 sort($numbers);
                 if (!empty($numbers)) {
                     $ref = 0;
                     $last = $numbers[0];
                     for ($i = 1; $i < count($numbers); $i++) {
                         $current = $numbers[$i];
                         if ($current == $last + 1) {
                             $numbers[$i] = null;
                         } else {
                             if ($numbers[$ref] != $last) {
                                 $numbers[$ref] .= "-" . $last;
                             }
                             $ref = $i;
                         }
                         $last = $current;
                     }
                     if ($numbers[$ref] != $last) {
                         $numbers[$ref] .= "-" . $last;
                     }
                     $numbers = array_filter($numbers);
                     $list = implode(", ", $numbers) . ", ";
                 }
                 foreach ($others as $id) {
                     $list = Release::getRelease($parameter[0], $id)->getName() . ", ";
                 }
                 $list = substr($list, 0, strlen($list) - 2);
                 return $projectName . " " . $list;
             } else {
                 return BBCodeDescriptor::contentToHTML($content);
             }
         };
         $partnerOpenTag = function ($tag, $parameter, $content) {
             if (empty($parameter)) {
                 $parameter = $content;
                 $content = null;
             }
             $parameter = preg_split('#\\|#', $parameter);
             $partner = null;
             $useImage = false;
             foreach ($parameter as $param) {
                 try {
                     $partner = Partner::getPartner($param);
                 } catch (Exception $e) {
                     if ($param === 'image') {
                         $useImage = true;
                     }
                 }
             }
             if ($partner === null) {
                 $partner = Partner::getPartner($content);
                 $content = null;
             }
             $link = new PartnerLink($partner, BBCodeDescriptor::contentToHTML($content));
             $link->openNewWindow(true);
             if ($useImage) {
                 $link->setUseImage(true);
             }
             return $link->getOpenTag();
         };
         $partnerContent = function ($tag, $parameter, $content) {
             if (empty($parameter)) {
                 $parameter = $content;
                 $content = null;
             }
             $parameter = preg_split('#\\|#', $parameter);
             $partner = null;
             $useImage = false;
             foreach ($parameter as $param) {
                 try {
                     $partner = Partner::getPartner($param);
                 } catch (Exception $e) {
                     if ($param === 'image') {
                         $useImage = true;
                     }
                 }
             }
             if ($partner === null) {
                 $partner = Partner::getPartner($content);
                 $content = null;
             }
             $link = new PartnerLink($partner, BBCodeDescriptor::contentToHTML($content));
             $link->openNewWindow(true);
             if ($useImage) {
                 $link->setUseImage(true);
             }
             return $link->getHTMLContent();
         };
         $projectOpenTag = function ($tag, $parameter, $content) {
             if (empty($parameter)) {
                 $link = new ProjectLink(Project::getProject($content));
             } else {
                 $parameter = preg_split('#\\|#', $parameter);
                 try {
                     $link = new ProjectLink(Project::getProject($parameter[0]));
                 } catch (Exception $e) {
                     $link = new ProjectLink(Project::getProject($content));
                 }
             }
             return $link->getOpenTag();
         };
         $projectContent = function ($tag, $parameter, $content) {
             if (empty($parameter)) {
                 $link = new ProjectLink(Project::getProject($content));
             } else {
                 $parameter = preg_split('#\\|#', $parameter);
                 try {
                     $link = new ProjectLink(Project::getProject($parameter[0]));
                     if (!empty($content)) {
                         $link->setContent(BBCodeDescriptor::contentToHTML($content));
                     }
                 } catch (Exception $e) {
                     $link = new ProjectLink(Project::getProject($content));
                 }
                 if (in_array('image', $parameter)) {
                     $link->useImage(true);
                 }
             }
             return $link->getHTMLContent();
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("release", $releaseOpenTag, $linkCloseTag, $releaseContent));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("project", $projectOpenTag, $linkCloseTag, $projectContent));
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("partner", $partnerOpenTag, $linkCloseTag, $partnerContent));
         /**********************************\
         			             SPOILER
         			\**********************************/
         $spoilerOpenTag = function ($tag, $parameter, $content) {
             static $id = 0;
             $id++;
             $index = 0;
             while (empty($parameter)) {
                 $parameter = $content[$index];
                 if (is_string($parameter)) {
                     $parameter = trim($parameter);
                 }
                 $index++;
             }
             if ($parameter instanceof BBCodeDescriptor) {
                 $parameter = $parameter->generateHTML();
             }
             // TODO show the spoiler if javascript deactivated
             return "<a href=\"#\" onclick=\"show('spoiler{$id}');return(false)\">{$parameter}</a><object id=\"spoiler{$id}\" style=\"display: none;\">";
         };
         $spoilerContent = function ($tag, $parameter, $content) {
             $index = 0;
             while (empty($parameter)) {
                 $parameter = $content[$index];
                 if (is_string($parameter)) {
                     $parameter = trim($parameter);
                 }
                 $index++;
             }
             if ($index > 0) {
                 unset($content[$index - 1]);
             }
             return BBCodeDescriptor::defaultContentCallback($tag, $parameter, $content);
         };
         $spoilerCloseTag = function ($tag, $parameter, $content) {
             return '</object>';
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("spoiler", $spoilerOpenTag, $spoilerCloseTag, $spoilerContent));
         /**********************************\
         			              VIDEOS
         			\**********************************/
         function parseVideoParameter($parameter)
         {
             $parameter = preg_split('#\\|#', $parameter);
             $result = array();
             foreach ($parameter as $row) {
                 $row = preg_split('#:#', $row);
                 if (in_array($row[0], array('width', 'height'))) {
                     $result[$row[0]] = $row[1];
                 } else {
                     throw new Exception($row[0] . " is not managed");
                 }
             }
             if (!isset($result['width']) || $result['width'] <= 0) {
                 throw new Exception("The width of the video is not well defined");
             }
             if ($result['height'] <= 0) {
                 throw new Exception("The height of the video is not well defined");
             }
             return $result;
         }
         $videoOpenTag = function ($tag, $parameter, $content) {
             $parameter = parseVideoParameter($parameter);
             $width = $parameter['width'];
             $height = $parameter['height'];
             return "<object width='{$width}' height='{$height}'><param name='allowfullscreen' value='true' /><param name='allowscriptaccess' value='always' /><param name='movie' value='{$content}' />";
         };
         $videoContent = function ($tag, $parameter, $content) {
             $parameter = parseVideoParameter($parameter);
             $width = $parameter['width'];
             $height = $parameter['height'];
             return "<embed src='{$content}' type='application/x-shockwave-flash' allowfullscreen='true' allowscriptaccess='always' width='{$width}' height='{$height}'></embed>";
         };
         $videoCloseTag = function ($tag, $parameter, $content) {
             return "</object>";
         };
         Format::$BBCodeParser->addDescriptor(new BBCodeDescriptor("video", $videoOpenTag, $videoCloseTag, $videoContent));
     }
     return Format::$BBCodeParser->translate($text);
 }