diff --git a/app/helpers/DateHelper.php b/app/helpers/DateHelper.php
new file mode 100644
index 000000000..f9f063ffc
--- /dev/null
+++ b/app/helpers/DateHelper.php
@@ -0,0 +1,78 @@
+ t('Monday'),
+ 2 => t('Tuesday'),
+ 3 => t('Wednesday'),
+ 4 => t('Thursday'),
+ 5 => t('Friday'),
+ 6 => t('Saturday'),
+ 7 => t('Friday'));
+}
+/**
+ * Return a human-readable year
+ * @return string
+ */
+function getMonths() {
+ return array(
+ 1 => t('January'),
+ 2 => t('February'),
+ 3 => t('March'),
+ 4 => t('April'),
+ 5 => t('May'),
+ 6 => t('June'),
+ 7 => t('July'),
+ 8 => t('August'),
+ 9 => t('September'),
+ 10 => t('October'),
+ 11 => t('November'),
+ 12 => t('December'));
+}
+
+/**
+ * Return a human-readable date
+ *
+ * @param timestamp $string
+ * @return string
+ */
+function prepareDate($time, $hours = true) {
+ $dotw = getDays();
+
+ $moty = getMonths();
+
+ $today = strtotime(date('M j, Y'));
+ $reldays = ($time - $today)/86400;
+
+ if ($reldays >= 0 && $reldays < 1) {
+ $date = t('Today');
+ } else if ($reldays >= 1 && $reldays < 2) {
+ $date = t('Tomorrow');
+ } else if ($reldays >= -1 && $reldays < 0) {
+ $date = t('Yesterday');
+ } else {
+
+ if (abs($reldays) < 7) {
+ if ($reldays > 0) {
+ $reldays = floor($reldays);
+ $date = 'In ' . $reldays . ' '.t('day') . ($reldays != 1 ? 's' : '');
+ } else {
+ $reldays = abs(floor($reldays));
+ $date = t(' %d days ago', $reldays);
+ }
+ } else {
+ $date = $dotw[date('N',$time ? $time : time())] .', '.date('j',$time ? $time : time()).' '.$moty[date('n',$time ? $time : time())] ;
+ if (abs($reldays) > 182)
+ $date .= date(', Y',$time ? $time : time());
+ }
+ }
+ if($hours)
+ $date .= ' - '. date('H:i', $time);
+
+ if($time)
+ return $date;
+}
diff --git a/app/helpers/StringHelper.php b/app/helpers/StringHelper.php
new file mode 100644
index 000000000..d927e5401
--- /dev/null
+++ b/app/helpers/StringHelper.php
@@ -0,0 +1,216 @@
+ 'cry.gif',
+ ':love:'=> 'love.gif',
+ 'O:\)' => 'ange.gif',
+ 'O:-\)' => 'ange.gif',
+ ':redface:' => 'redface.gif',
+ ':petrus:' => 'petrus75.gif',
+
+ // famfamfam icons
+ ':\)\)' => 'grin.png',
+ ':\)' => 'smiley.png',
+ ':-\)' => 'smiley.png',
+ ':\(' => 'sad.png',
+ ':o' => 'shocked.png',
+ ':O' => 'shocked.png',
+ ':D' => 'grin.png',
+ ':d' => 'grin.png',
+ ':p' => 'tongue.png',
+ ':P' => 'tongue.png',
+ ':-P' => 'tongue.png',
+ ';D' => 'wink.png',
+ ';d' => 'wink.png',
+ ';\)' => 'wink.png',
+ '\^\^' => 'happy.png',
+ '\(k\)' => 'heart.png',
+ 'B\)' => 'cool.png',
+ ':s' => 'confused.png',
+ ':S' => 'confused.png',
+ ':\/' => 'wondering.png',
+ ':evil:'=> 'evil.png',
+ ":\|" => 'neutral.png',
+
+ // Meme icons
+ ':okay:' => 'okay.gif',
+ ':trolldad:' => 'trolldad.png',
+ ':epic:' => 'epic.png',
+ ':aloneyeah:' => 'aloneyeah.png',
+ ':fapfap:' => 'fapfap.png',
+ ':megusta:' => 'gusta.png',
+ ':trollface:' => 'trollface.png',
+ ':troll:' => 'trollface.png',
+ ':lol:' => 'trollol.png',
+ ':genius:' => 'genius.png',
+ );
+
+ //replace begin by www
+ $string = preg_replace_callback(
+ '/(^|\s|>)(www.[^<> \n\r]+)/ix', function ($match) {
+ //print '
preg[1]';\system\Debug::dump($match);
+ if (strlen($match[2])>0) {
+ return stripslashes($match[1].''.$match[2].'');
+ } else {
+ return $match[2];
+ }
+ }, ' ' . $string
+ );
+
+ //replace begin by http - https (before www)
+ $string = preg_replace_callback(
+ '/(?(?=]*>.+<\/a>)(?:]*>.+<\/a>)|([^="\'])((?:https?):\/\/([^<> \n\r]+)))/ix', function ($match) {
+ if (isset($match[2]) && strlen($match[2])>0) {
+ return stripslashes($match[1].''.$match[3].'');
+ } else {
+ return $match[0];
+ }
+ }, ' ' . $string
+ );
+
+ // Twitter hashtags
+ $string = preg_replace_callback(
+ "/ #[a-zA-Z0-9_-]*/", function ($match) {
+ return
+ ' ';
+ }, ' ' . $string
+ );
+
+ $string = preg_replace_callback(
+ "/ @[a-zA-Z0-9_-]*/", function ($match) {
+ return
+ ' ';
+ }, ' ' . $string
+ );
+
+ //remove all scripts
+ $string = preg_replace_callback(
+ '#<[/]?script[^>]*>#is', function ($match) {
+ return '';
+ }, ' ' . $string
+ );
+ //remove all iframe
+ $string = preg_replace_callback(
+ '#<[/]?iframe[^>]*>#is', function ($match) {
+ return '';
+ }, ' ' . $string
+ );
+
+ // We add some smileys...
+ $conf = new \system\Conf();
+ $theme = $conf->getServerConfElement('theme');
+
+ $path = BASE_URI . 'themes/' . $theme . '/img/smileys/';
+
+ foreach($smileys as $key => $value) {
+ $replace = '
';
+ $string = preg_replace('/(^|[ ])('.$key.')/', $replace, $string);
+ }
+
+ return trim($string);
+}
+
+
+/**
+ * Fix self-closing tags
+ */
+function fixSelfClosing($string) {
+ return preg_replace_callback('/<([^\s<]+)\/>/',
+ function($match) {
+ return '<'.$match[1].'>'.$match[1].'>';
+ }
+ , $string);
+}
+
+/**
+ * Remove the content, body and html tags
+ */
+function cleanHTMLTags($string) {
+ return str_replace(
+ array(
+ '',
+ '',
+ '',
+ '',
+ '',
+ ''),
+ '',
+ $string);
+}
+
+/**
+ * Return an array of informations from a XMPP uri
+ */
+function explodeURI($uri) {
+ $arr = parse_url(urldecode($uri));
+ $result = array();
+
+ if(isset($arr['query'])) {
+ $query = explode(';', $arr['query']);
+
+
+ foreach($query as $elt) {
+ if($elt != '') {
+ list($key, $val) = explode('=', $elt);
+ $result[$key] = $val;
+ }
+ }
+
+ $arr = array_merge($arr, $result);
+ }
+
+ return $arr;
+
+}
+
+/*
+ * Echap the JID
+ */
+function echapJid($jid)
+{
+ return str_replace(' ', '\40', $jid);
+}
+
+/**
+ * Return a URIfied string
+ * @param string
+ * @return string
+ */
+function stringToUri($url) {
+ $url = utf8_decode($url);
+ $url = strtolower(strtr($url, utf8_decode('ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]\'"~$&%*@ç!?;,:/\^¨€{}<>|+- '), 'aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn -- c --- e --'));
+ $url = str_replace(' ', '', $url);
+ $url = str_replace('---', '-', $url);
+ $url = str_replace('--', '-', $url);
+ $url = trim($url,'-');
+ return $url;
+}
+
+/**
+ * Return a human readable filesize
+ * @param string size in bytes
+ * @return string
+ */
+function sizeToCleanSize($size)
+{
+ $units = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
+ $power = $size > 0 ? floor(log($size, 1024)) : 0;
+ return number_format($size / pow(1024, $power), 2, '.', ',') . ' ' . $units[$power];
+}
diff --git a/app/helpers/TimezoneHelper.php b/app/helpers/TimezoneHelper.php
new file mode 100644
index 000000000..45d1cae25
--- /dev/null
+++ b/app/helpers/TimezoneHelper.php
@@ -0,0 +1,63 @@
+ -12.00,
+ 'Etc/GMT+11' => -11.00,
+ 'Etc/GMT+10' => -10.00,
+ 'Etc/GMT+9' => -9.00,
+ 'Etc/GMT+8' => -8.00,
+ 'Etc/GMT+7' => -7.00,
+ 'Etc/GMT+6' => -6.00,
+ 'Etc/GMT+5' => -5.00,
+ 'America/Caracas' => -4.30,
+ 'Etc/GMT+4' => -4.00,
+ 'America/St_Johns' => -3.30,
+ 'Etc/GMT+3' => -3.00,
+ 'Etc/GMT+2' => -2.00,
+ 'Etc/GMT+1' => -1.00,
+ 'Etc/GMT' => 0,
+ 'Etc/GMT-1' => 1.00,
+ 'Etc/GMT-2' => 2.00,
+ 'Etc/GMT-3' => 3.00,
+ 'Asia/Tehran' => 3.30,
+ 'Etc/GMT-4' => 4.00,
+ 'Etc/GMT-5' => 5.00,
+ 'Asia/Kolkata' => 5.30,
+ 'Asia/Katmandu' => 5.45,
+ 'Etc/GMT-6' => 6.00,
+ 'Asia/Rangoon' => 6.30,
+ 'Etc/GMT-7' => 7.00,
+ 'Etc/GMT-8' => 8.00,
+ 'Etc/GMT-9' => 9.00,
+ 'Australia/Darwin' => 9.30,
+ 'Etc/GMT-10' => 10.00,
+ 'Etc/GMT-11' => 11.00,
+ 'Etc/GMT-12' => 12.00,
+ 'Etc/GMT-13' => 13.00);
+ }
+
+
+/*
+ * Get the user local timezone
+ */
+function getLocalTimezone()
+{
+ date_default_timezone_set('UTC');
+ $iTime = time();
+ $arr = localtime($iTime);
+ $arr[5] += 1900;
+ $arr[4]++;
+ $iTztime = gmmktime($arr[2], $arr[1], $arr[0], $arr[4], $arr[3], $arr[5]);
+ $offset = doubleval(($iTztime-$iTime)/(60*60));
+ $zonelist = getTimezoneList();
+
+ $index = array_keys($zonelist, $offset);
+ if(sizeof($index)!=1)
+ return false;
+ return $index[0];
+}