code:
# Translation of StatusNet - Linkback to Portuguese (português)
# Exported from translatewiki.net
#
# Author: SandroHc
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Linkback\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:02+0000\n"
"Language-Team: Portuguese <https://translatewiki.net/wiki/Portal:pt>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:27+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: pt\n"
"X-Message-Group: #out-statusnet-plugin-linkback\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Trackback title.
#. TRANS: %1$s is a profile nickname, %2$s is a timestamp.
#, php-format
msgid "%1$s's status on %2$s"
msgstr ""

#. TRANS: Plugin description.
msgid ""
"Notify blog authors when their posts have been linked in microblog notices "
"using Pingback "
"or Trackback</"
"a> protocols."
msgstr ""
"Notificar os autores do blog quando as suas postagens forem vinculadas em "
"anúncios de microblog usando os protocolos Pingback ou Trackback."


code:
# Translation of StatusNet - Linkback to Russian (русский)
# Exported from translatewiki.net
#
# Author: Александр Сигачёв
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Linkback\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:02+0000\n"
"Language-Team: Russian <https://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:27+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-plugin-linkback\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Trackback title.
#. TRANS: %1$s is a profile nickname, %2$s is a timestamp.
#, php-format
msgid "%1$s's status on %2$s"
msgstr "Статус %1$s на %2$s"

#. TRANS: Plugin description.
msgid ""
"Notify blog authors when their posts have been linked in microblog notices "
"using Pingback "
"or Trackback</"
"a> protocols."
msgstr ""
"Уведомляет авторов блогов, когда на их сообщения были ссылки с помощью "
"протоколов Pingback</"
"a> или Trackback."

license: mit


code:
# Translation of StatusNet - Linkback to Tagalog (Tagalog)
# Exported from translatewiki.net
#
# Author: AnakngAraw
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Linkback\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:02+0000\n"
"Language-Team: Tagalog <https://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:27+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: tl\n"
"X-Message-Group: #out-statusnet-plugin-linkback\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Trackback title.
#. TRANS: %1$s is a profile nickname, %2$s is a timestamp.
#, php-format
msgid "%1$s's status on %2$s"
msgstr "Katayuan ni %1$s sa %2$s"

#. TRANS: Plugin description.
msgid ""
"Notify blog authors when their posts have been linked in microblog notices "
"using Pingback "
"or Trackback</"
"a> protocols."
msgstr ""
"Ipaalam sa mga may-akda ng blog kapag ang kanilang ang mga pagpapaskil ay "
"ikinawing sa mga pabatid ng mikroblog sa pamamagitan ng mga protokol na Pingback o Trackback."


code:
# Translation of StatusNet - Linkback to Ukrainian (українська)
# Exported from translatewiki.net
#
# Author: Boogie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Linkback\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:03+0000\n"
"Language-Team: Ukrainian <https://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:27+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-linkback\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Trackback title.
#. TRANS: %1$s is a profile nickname, %2$s is a timestamp.
#, php-format
msgid "%1$s's status on %2$s"
msgstr "Статус %1$s на %2$s"

#. TRANS: Plugin description.
msgid ""
"Notify blog authors when their posts have been linked in microblog notices "
"using Pingback "
"or Trackback</"
"a> protocols."
msgstr ""
"Сповіщення авторів блоґів, якщо їхні дописи стають об’єктом уваги у "
"мікроблоґах, використовуючи протоколи Pingback або Trackback."


code:
# Translation of StatusNet - Linkback to Simplified Chinese (中文（简体）)
# Exported from translatewiki.net
#
# Author: ZhengYiFeng
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Linkback\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:03+0000\n"
"Language-Team: Simplified Chinese <https://translatewiki.net/wiki/Portal:zh-"
"hans>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:27+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: zh-hans\n"
"X-Message-Group: #out-statusnet-plugin-linkback\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Trackback title.
#. TRANS: %1$s is a profile nickname, %2$s is a timestamp.
#, php-format
msgid "%1$s's status on %2$s"
msgstr ""

#. TRANS: Plugin description.
msgid ""
"Notify blog authors when their posts have been linked in microblog notices "
"using Pingback "
"or Trackback</"
"a> protocols."
msgstr ""
"当博客的地址在消息中被发布时使用 Pingback 或 Trackback 协议通知博客的作者。"


code:
<?php
/*
 * StatusNet - the distributed open-source microblogging tool
 * Copyright (C) 2010, StatusNet, Inc.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Example to disable all debug messages and those containing 'About to push':
 * addPlugin('LogFilter', array(
 *    'priority' => array(LOG_DEBUG => false),
 *    'regex' => array('/About to push/' => false)
 * ));
 *
 * @todo add an admin panel
 *
 * @package LogFilterPlugin
 * @maintainer Brion Vibber <brion@status.net>
 */
class LogFilterPlugin extends Plugin
{
    public $default = true;     // Set to false to require opting things in
    public $priority = array(); // override by priority: array(LOG_ERR => true, LOG_DEBUG => false)
    public $regex = array();    // override by regex match of message: array('/twitter/i' => false)

    function onPluginVersion(&$versions)
    {
        $versions[] = array('name' => 'LogFilter',
                            'version' => GNUSOCIAL_VERSION,
                            'author' => 'Brion Vibber',
                            'homepage' => 'http://status.net/wiki/Plugin:LogFilter',
                            'rawdescription' =>
                            // TRANS: Plugin description.
                            _m('Provides server-side setting to filter log output by type or keyword.'));

        return true;
    }

    /**
     * Hook for the StartLog event in common_log().
     * If a message doesn't pass our filters, we'll abort it.
     *
     * @param string $priority
     * @param string $msg
     * @param string $filename
     * @return boolean hook result code
     */
    function onStartLog(&$priority, &$msg, &$filename)
    {
        if ($this->filter($priority, $msg)) {
            // Let it through
            return true;
        } else {
            // Abort -- this line will go to /dev/null :)
            return false;
        }
    }

    /**
     * Do the filtering...
     *
     * @param string $priority
     * @param string $msg
     * @return boolean true to let the log message be processed
     */
    function filter($priority, $msg)
    {
        $state = $this->default;
        if (array_key_exists($priority, $this->priority)) {
            $state = $this->priority[$priority];
        }
        foreach ($this->regex as $regex => $override) {
            if (preg_match($regex, $msg)) {
                $state = $override;
            }
        }
        return $state;
    }
}


code:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#. TRANS: Plugin description.
#: LogFilterPlugin.php:50
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""


code:
# Translation of StatusNet - LogFilter to German (Deutsch)
# Exported from translatewiki.net
#
# Author: Fujnky
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Language-Team: German <https://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Stellt serverseitige Einstellungen zum Filtern der Log-Ausgabe nach Typ oder "
"Schlüsselwort zur Verfügung"


code:
# Translation of StatusNet - LogFilter to Spanish (español)
# Exported from translatewiki.net
#
# Author: Armando-Martin
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Proporciona la configuración de servidor para filtrar el registro de salida "
"por tipo o palabra clave."


code:
# Translation of StatusNet - LogFilter to Basque (euskara)
# Exported from translatewiki.net
#
# Author: Artsuaga
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Zerbitzari aukerak ezartzen ditu, moeta edo gako hitz bidez erregistroaren "
"irteera iragazteko."


code:
# Translation of StatusNet - LogFilter to Finnish (suomi)
# Exported from translatewiki.net
#
# Author: Nike
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Language-Team: Finnish <https://translatewiki.net/wiki/Portal:fi>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: fi\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Tarjoaa palvelinasetuksen, jolla lokeja voi suodattaa tyypin tai avainsanan "
"mukaan."


code:
# Translation of StatusNet - LogFilter to French (français)
# Exported from translatewiki.net
#
# Author: Peter17
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Language-Team: French <https://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: fr\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Fournit une configuration côté serveur pour filtrer la sortie du journal "
"d’activité par type ou par mot-clé."


code:
# Translation of StatusNet - LogFilter to Galician (galego)
# Exported from translatewiki.net
#
# Author: Toliño
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Language-Team: Galician <https://translatewiki.net/wiki/Portal:gl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: gl\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Proporciona unha configuración do servidor para filtrar a saída do rexistro "
"por tipo ou palabra clave."


code:
# Translation of StatusNet - LogFilter to Hebrew (עברית)
# Exported from translatewiki.net
#
# Author: YaronSh
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Language-Team: Hebrew <https://translatewiki.net/wiki/Portal:he>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: he\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr "אספקת הגדרות צד־שרת לסינון פלט לפי סוג או לפי מילת מפתח."


code:
# Translation of StatusNet - LogFilter to Interlingua (interlingua)
# Exported from translatewiki.net
#
# Author: McDutchie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Language-Team: Interlingua <https://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Forni un configuration al latere del servitor pro filtrar le producite "
"lineas de registro per typo o per parola-clave."


code:
# Translation of StatusNet - LogFilter to Italian (italiano)
# Exported from translatewiki.net
#
# Author: GreenFox
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:04+0000\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Fornisce un impostazione da parte del server per filtrare il log di output "
"per tipo o per parola chiave."


code:
# Translation of StatusNet - LogFilter to Macedonian (македонски)
# Exported from translatewiki.net
#
# Author: Bjankuloski06
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Macedonian <https://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Овозможува поставка кај опслужувачот за филтрирање на дневничките изводи по "
"тип или клучен збор."


code:
# Translation of StatusNet - LogFilter to Dutch (Nederlands)
# Exported from translatewiki.net
#
# Author: Siebrand
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Dutch <https://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Biedt serverinstellingen om logboekuitvoer te filteren op type of trefwoord."


code:
# Translation of StatusNet - LogFilter to Portuguese (português)
# Exported from translatewiki.net
#
# Author: Hamilton Abreu
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Portuguese <https://translatewiki.net/wiki/Portal:pt>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: pt\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Fornece uma configuração do lado do servidor para filtrar a saída do "
"registo, por tipo ou por um termo chave."


code:
# Translation of StatusNet - LogFilter to Russian (русский)
# Exported from translatewiki.net
#
# Author: Lockal
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Russian <https://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Предоставляет серверный параметр для фильтрации выходных данных журнала по "
"типу или ключевому слову."


code:
# Translation of StatusNet - LogFilter to Tagalog (Tagalog)
# Exported from translatewiki.net
#
# Author: AnakngAraw
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Tagalog <https://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: tl\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Nagbibigay ng katakdaang nasa gilid ng tagapaghain upang masala ang talaan "
"ng kinalalabasan ayon sa uri o susing-salita."


code:
# Translation of StatusNet - LogFilter to Ukrainian (українська)
# Exported from translatewiki.net
#
# Author: Boogie
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Ukrainian <https://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr ""
"Забезпечує на серверній стороні установки для фільтрації виводу журналу за "
"типом або ключовим словом."


code:
# Translation of StatusNet - LogFilter to Simplified Chinese (中文（简体）)
# Exported from translatewiki.net
#
# Author: Hydra
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - LogFilter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-06-30 11:07+0000\n"
"PO-Revision-Date: 2012-06-30 11:09:05+0000\n"
"Language-Team: Simplified Chinese <https://translatewiki.net/wiki/Portal:zh-"
"hans>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-06-05 21:50:29+0000\n"
"X-Generator: MediaWiki 1.20alpha (233fc08); Translate 2012-06-21\n"
"X-Translation-Project: translatewiki.net <https://translatewiki.net>\n"
"X-Language-Code: zh-hans\n"
"X-Message-Group: #out-statusnet-plugin-logfilter\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. TRANS: Plugin description.
msgid "Provides server-side setting to filter log output by type or keyword."
msgstr "提供了服务器端设置筛选日志输出的类型或关键字。"


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Plugin to provide map visualization of location data
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Action
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2009 StatusNet Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Plugin to provide map visualization of location data
 *
 * This plugin uses the Mapstraction JavaScript library to
 *
 * @category Plugin
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://status.net/
 *
 * @seeAlso  Location
 */
class MapstractionPlugin extends Plugin
{
    const VERSION = GNUSOCIAL_VERSION;

    /** provider name, one of:
     'cloudmade', 'google', 'microsoft', 'openlayers', 'yahoo' */
    public $provider = 'openlayers';
    /** provider API key (or 'appid'), if required ('google' and 'yahoo' only) */
    public $apikey = null;

    /**
     * Hook for new URLs
     *
     * The way to register new actions from a plugin.
     *
     * @param Router $m reference to router
     *
     * @return boolean event handler return
     */
    function onRouterInitialized($m)
    {
        $m->connect(':nickname/all/map',
                    array('action' => 'allmap'),
                    array('nickname' => Nickname::DISPLAY_FMT));
        $m->connect(':nickname/map',
                    array('action' => 'usermap'),
                    array('nickname' => Nickname::DISPLAY_FMT));
        return true;
    }

    /**
     * Hook for adding extra JavaScript
     *
     * This makes sure our scripts get loaded for map-related pages
     *
     * @param Action $action Action object for the page
     *
     * @return boolean event handler return
     */
    function onEndShowScripts($action)
    {
        $actionName = $action->trimmed('action');

        if (!in_array($actionName,
                      array('showstream', 'all', 'usermap', 'allmap'))) {
            return true;
        }

        switch ($this->provider)
        {
        case 'cloudmade':
            $action->script('http://tile.cloudmade.com/wml/0.2/web-maps-lite.js');
            break;
        case 'google':
            $action->script(sprintf('http://maps.google.com/maps?file=api&v=2&sensor=false&key=%s',
                                    urlencode($this->apikey)));
            break;
        case 'microsoft':
            $action->script((StatusNet::isHTTPS()?'https':'http') + '://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6');
            break;
        case 'openlayers':
            // Use our included stripped & minified OpenLayers.
            $action->script($this->path('OpenLayers/OpenLayers.js'));
            break;
        case 'yahoo':
            $action->script(sprintf('http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=%s',
                                    urlencode($this->apikey)));
            break;
        case 'geocommons': // don't support this yet
        default:
            return true;
        }
        $action->script(sprintf('%s?(%s)',
                                $this->path('js/mxn.js'),
                                $this->provider));
        $action->script($this->path('usermap.js'));

        $action->inlineScript(sprintf('var _provider = "%s";', $this->provider));

        // usermap and allmap handle this themselves

        if (in_array($actionName,
                     array('showstream', 'all'))) {
            $action->inlineScript('$(document).ready(function() { '.
                                  ' var user = null; '.
                                  (($actionName == 'showstream') ? ' user = scrapeUser(); ' : '') .
                                  ' var notices = scrapeNotices(user); ' .
                                  ' var canvas = $("#map_canvas")[0]; ' .
                                  ' if (typeof(canvas) != "undefined") { showMapstraction(canvas, notices); } '.
                                  '});');
        }

        return true;
    }

    function onEndShowSections(Action $action)
    {
        $actionName = $action->trimmed('action');
        // These are the ones that have maps on 'em
        if (!in_array($actionName,
                      array('showstream', 'all'))) {
            return true;
        }

        $action->elementStart('div', array('id' => 'entity_map',
                                         'class' => 'section'));

        // TRANS: Header for Map widget that displays a map with geodata for notices.
        $action->element('h2', null, _m('Map'));

        $action->element('div', array('id' => 'map_canvas',
                                    'class' => 'gray smallmap',
                                    'style' => "width: 100%; height: 240px"));

        $mapAct = ($actionName == 'showstream') ? 'usermap' : 'allmap';
        $mapUrl =  common_local_url($mapAct,
                                    array('nickname' => $action->trimmed('nickname')));

        $action->element('a', array('href' => $mapUrl),
                         // TRANS: Clickable item to allow opening the map in full size.
                         _m('Full size'));

        $action->elementEnd('div');
    }

    function onPluginVersion(&$versions)
    {
        $versions[] = array('name' => 'Mapstraction',
                            'version' => self::VERSION,
                            'author' => 'Evan Prodromou',
                            'homepage' => 'http://status.net/wiki/Plugin:Mapstraction',
                            'rawdescription' =>
                            // TRANS: Plugin description.
                            _m('Show maps of users\' and friends\' notices '.
                               'with Mapstraction.'));
        return true;
    }
}


code:
.fake: clean all

TARGET=OpenLayers.js
SOURCEDIR=OpenLayers-2.10/
HERE=`pwd`

all: $(TARGET)

clean:
	rm -f $(TARGET)

$(TARGET): statusnet.cfg
	cp -f statusnet.cfg $(SOURCEDIR)/build/statusnet.cfg
	(cd $(SOURCEDIR)/build && ./build.py statusnet.cfg)
	yui-compressor $(SOURCEDIR)/build/OpenLayers.js -o $(TARGET)


code:
The default OpenLayers.js file, minified, weighs in at a whopping 943kb uncompressed.
With gzip compression it's still over 200kb, so we're building a stripped-down copy
with just what we need.

Docs on how the stripping process works:
http://docs.openlayers.org/library/deploying.html

To recreate this OpenLayers.js file:

  # get yui-compressor (install from apt, or set up a shell script or alias to the jar)
  # download and decompress OpenLayers-2.10 zip or tgz
  make clean && make

If necessary, change the relative path to the OpenLayers source directory in the Makefile.

path: plugins/Mapstraction/OpenLayers/README


code:
# Modified lite.cfg for building an OpenLayers subset for StatusNet's Mapstraction plugin.

# This file includes a small subset of OpenLayers code, designed to be
# integrated into another application. It includes only the Layer types
# neccesary to create tiled or untiled WMS, and does not include any Controls.
# This is the result of what was at the time called "Webmap.js" at the FOSS4G
# Web Mapping BOF.

[first]
OpenLayers/SingleFile.js
OpenLayers.js
OpenLayers/BaseTypes.js
OpenLayers/BaseTypes/Class.js
OpenLayers/Util.js

[last]

[include]
OpenLayers/Map.js
OpenLayers/Layer/WMS.js

# Needed for Mapstraction on StatusNet
OpenLayers/Feature.js
OpenLayers/Feature/Vector.js
OpenLayers/Geometry.js
OpenLayers/Geometry/Point.js
OpenLayers/Geometry/LinearRing.js
OpenLayers/Geometry/LineString.js
OpenLayers/Icon.js
OpenLayers/Layer/Markers.js
OpenLayers/Layer/TMS.js
OpenLayers/Marker.js
OpenLayers/Popup.js

# Default controls, needed to keep the map dynamic
OpenLayers/Control/ArgParser.js
OpenLayers/Control/Attribution.js
OpenLayers/Control/Navigation.js
OpenLayers/Control/PanZoom.js

[exclude]


code:
.olLayerGoogleCopyright {
    right: 3px;
    bottom: 2px;
    left: auto;
}
.olLayerGooglePoweredBy {
    left: 2px;
    bottom: 2px;
}


code:
.olControlZoomPanel div {
    background-image: url(img/zoom-panel-NOALPHA.png);
}
.olControlPanPanel div {
    background-image: url(img/pan-panel-NOALPHA.png);
}


code:
div.olMap {
    z-index: 0;
    padding: 0px!important;
    margin: 0px!important;
    cursor: default;
}

div.olMapViewport {
    text-align: left;
}

div.olLayerDiv {
   -moz-user-select: none;
}

.olLayerGoogleCopyright {
    left: 2px;
    bottom: 2px;
}
.olLayerGooglePoweredBy {
    left: 2px;
    bottom: 15px;
}
.olControlAttribution {
    font-size: smaller;
    right: 3px;
    bottom: 4.5em;
    position: absolute;
    display: block;
}
.olControlScale {
    right: 3px;
    bottom: 3em;
    display: block;
    position: absolute;
    font-size: smaller;
}
.olControlScaleLine {
   display: block;
   position: absolute;
   left: 10px;
   bottom: 15px;
   font-size: xx-small;
}
.olControlScaleLineBottom {
   border: solid 2px black;
   border-bottom: none;
   margin-top:-2px;
   text-align: center;
}
.olControlScaleLineTop {
   border: solid 2px black;
   border-top: none;
   text-align: center;
}

.olControlPermalink {
    right: 3px;
    bottom: 1.5em;
    display: block;
    position: absolute;
    font-size: smaller;
}

div.olControlMousePosition {
    bottom: 0em;
    right: 3px;
    display: block;
    position: absolute;
    font-family: Arial;
    font-size: smaller;
}

.olControlOverviewMapContainer {
    position: absolute;
    bottom: 0px;
    right: 0px;
}

.olControlOverviewMapElement {
    padding: 10px 18px 10px 10px;
    background-color: #00008B;
    -moz-border-radius: 1em 0 0 0;
}

.olControlOverviewMapMinimizeButton {
    right: 0px;
    bottom: 80px;
}

.olControlOverviewMapMaximizeButton {
    right: 0px;
    bottom: 80px;
}

.olControlOverviewMapExtentRectangle {
    overflow: hidden;
    background-image: url("img/blank.gif");
    cursor: move;
    border: 2px dotted red;
}
.olControlOverviewMapRectReplacement {
    overflow: hidden;
    cursor: move;
    background-image: url("img/overview_replacement.gif");
    background-repeat: no-repeat;
    background-position: center;
}

.olLayerGeoRSSDescription {
    float:left;
    width:100%;
    overflow:auto;
    font-size:1.0em;
}
.olLayerGeoRSSClose {
    float:right;
    color:gray;
    font-size:1.2em;
    margin-right:6px;
    font-family:sans-serif;
}
.olLayerGeoRSSTitle {
    float:left;font-size:1.2em;
}

.olPopupContent {
    padding:5px;
    overflow: auto;
}
.olControlNavToolbar {
    width:0px;
    height:0px;
}
.olControlNavToolbar div {
  display:block;
  width:  28px;
  height: 28px;
  top: 300px;
  left: 6px;
  position: relative;
}

.olControlNavigationHistory {
   background-image: url("img/navigation_history.png");
   background-repeat: no-repeat;
   width:  24px;
   height: 24px;

}
.olControlNavigationHistoryPreviousItemActive {
  background-position: 0px 0px;
}
.olControlNavigationHistoryPreviousItemInactive {
   background-position: 0px -24px;
}
.olControlNavigationHistoryNextItemActive {
   background-position: -24px 0px;
}
.olControlNavigationHistoryNextItemInactive {
   background-position: -24px -24px;
}

.olControlNavToolbar .olControlNavigationItemActive {
  background-image: url("img/panning-hand-on.png");
  background-repeat: no-repeat;
}
.olControlNavToolbar .olControlNavigationItemInactive {
  background-image: url("img/panning-hand-off.png");
  background-repeat: no-repeat;
}
.olControlNavToolbar .olControlZoomBoxItemActive {
  background-image: url("img/drag-rectangle-on.png");
  background-color: orange;
  background-repeat: no-repeat;
}
.olControlNavToolbar .olControlZoomBoxItemInactive {
  background-image: url("img/drag-rectangle-off.png");
  background-repeat: no-repeat;
}
.olControlEditingToolbar  {
    float:right;
    right: 0px;
    height: 30px;
    width: 200px;
}
.olControlEditingToolbar div {
  background-image: url("img/editing_tool_bar.png");
  background-repeat: no-repeat;
  float:right;
  width:  24px;
  height: 24px;
  margin: 5px;
}
.olControlEditingToolbar .olControlNavigationItemActive {
  background-position: -103px -23px;
}
.olControlEditingToolbar .olControlNavigationItemInactive {
  background-position: -103px -0px;
}
.olControlEditingToolbar .olControlDrawFeaturePointItemActive {
  background-position: -77px -23px;
}
.olControlEditingToolbar .olControlDrawFeaturePointItemInactive {
  background-position: -77px -0px;
}
.olControlEditingToolbar .olControlDrawFeaturePathItemInactive {
  background-position: -51px 0px;
}
.olControlEditingToolbar .olControlDrawFeaturePathItemActive {
  background-position: -51px -23px;
}
.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive {
  background-position: -26px 0px;
}
.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive {
  background-position: -26px -23px ;
}
div.olControlSaveFeaturesItemActive {
    background-image: url(img/save_features_on.png);
    background-repeat: no-repeat;
    background-position: 0px 1px;
}
div.olControlSaveFeaturesItemInactive {
    background-image: url(img/save_features_off.png);
    background-repeat: no-repeat;
    background-position: 0px 1px;
}

.olHandlerBoxZoomBox {
    border: 2px solid red;
    position: absolute;
    background-color: white;
    opacity: 0.50;
    font-size: 1px;
    filter: alpha(opacity=50);
}
.olHandlerBoxSelectFeature {
    border: 2px solid blue;
    position: absolute;
    background-color: white;
    opacity: 0.50;
    font-size: 1px;
    filter: alpha(opacity=50);
}

.olControlPanPanel {
    top: 10px;
    left: 5px;
}

.olControlPanPanel div {
    background-image: url(img/pan-panel.png);
    height: 18px;
    width: 18px;
    cursor: pointer;
    position: absolute;
}

.olControlPanPanel .olControlPanNorthItemInactive {
    top: 0px;
    left: 9px;
    background-position: 0px 0px;
}
.olControlPanPanel .olControlPanSouthItemInactive {
    top: 36px;
    left: 9px;
    background-position: 18px 0px;
}
.olControlPanPanel .olControlPanWestItemInactive {
    position: absolute;
    top: 18px;
    left: 0px;
    background-position: 0px 18px;
}
.olControlPanPanel .olControlPanEastItemInactive {
    top: 18px;
    left: 18px;
    background-position: 18px 18px;
}

.olControlZoomPanel {
    top: 71px;
    left: 14px;
}

.olControlZoomPanel div {
    background-image: url(img/zoom-panel.png);
    position: absolute;
    height: 18px;
    width: 18px;
    cursor: pointer;
}

.olControlZoomPanel .olControlZoomInItemInactive {
    top: 0px;
    left: 0px;
    background-position: 0px 0px;
}

.olControlZoomPanel .olControlZoomToMaxExtentItemInactive {
    top: 18px;
    left: 0px;
    background-position: 0px -18px;
}

.olControlZoomPanel .olControlZoomOutItemInactive {
    top: 36px;
    left: 0px;
    background-position: 0px 18px;
}

.olPopupCloseBox {
  background: url("img/close.gif") no-repeat;
  cursor: pointer;
}

.olFramedCloudPopupContent {
    padding: 5px;
    overflow: auto;
}

.olControlNoSelect {
 -moz-user-select: none;
}

.olImageLoadError {
    background-color: pink;
    opacity: 0.5;
    filter: alpha(opacity=50); /* IE */
}

/**
 * Cursor styles
 */

.olCursorWait {
    cursor: wait;
}
.olDragDown {
    cursor: move;
}
.olDrawBox {
    cursor: crosshair;
}
.olControlDragFeatureOver {
    cursor: move;
}
.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown {
    cursor: -moz-grabbing;
}

/**
 * Layer switcher
 */
.olControlLayerSwitcher {
    position: absolute;
    top: 25px;
    right: 0px;
    width: 20em;
    font-family: sans-serif;
    font-weight: bold;
    margin-top: 3px;
    margin-left: 3px;
    margin-bottom: 3px;
    font-size: smaller;
    color: white;
    background-color: transparent;
}

.olControlLayerSwitcher .layersDiv {
    padding-top: 5px;
    padding-left: 10px;
    padding-bottom: 5px;
    padding-right: 75px;
    background-color: darkblue;
    width: 100%;
    height: 100%;
}

.olControlLayerSwitcher .layersDiv .baseLbl,
.olControlLayerSwitcher .layersDiv .dataLbl {
    margin-top: 3px;
    margin-left: 3px;
    margin-bottom: 3px;
}

.olControlLayerSwitcher .layersDiv .baseLayersDiv,
.olControlLayerSwitcher .layersDiv .dataLayersDiv {
    padding-left: 10px;
}

.olControlLayerSwitcher .maximizeDiv,
.olControlLayerSwitcher .minimizeDiv {
    top: 5px;
    right: 0px;
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Show a map of user's friends' notices
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Mapstraction
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2009 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Show a map of user's notices
 *
 * @category Mapstraction
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @author   Craig Andrews <candrews@integralblue.com>
 * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://status.net/
 */
class AllmapAction extends MapAction
{
    function prepare($args)
    {
        if (parent::prepare($args)) {
            $stream = new InboxNoticeStream($this->user->getProfile(), $this->scoped);
            $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
                                                NOTICES_PER_PAGE + 1,
                                                null,
                                                null);
            return true;
        } else {
            return false;
        }
    }

    function title()
    {
        $base = $this->profile->getFancyName();

        if ($this->page == 1) {
            // TRANS: Page title.
            // TRANS: %s is a user nickname.
            return sprintf(_m("%s friends map"),
                           $base);
        } else {
            // @todo CHECKME: does this even happen? May not be needed.
            // TRANS: Page title.
            // TRANS: %1$s is a user nickname, %2$d is a page number.
            return sprintf(_m('%1$s friends map, page %2$d'),
                           $base,
                           $this->page);
        }
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Show a map of user's notices
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Mapstraction
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2009-2011 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Show a map of notices
 *
 * @category Mapstraction
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @author   Craig Andrews <candrews@integralblue.com>
 * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://status.net/
 */
class MapAction extends Action
{
    var $profile = null;
    var $page    = null;
    var $notices = null;

    function prepare($args)
    {
        parent::prepare($args);

        $nickname_arg = $this->arg('nickname');
        $nickname     = Nickname::normalize($nickname_arg);

        // Permanent redirect on non-canonical nickname

        if ($nickname_arg != $nickname) {
            $args = array('nickname' => $nickname);
            if ($this->arg('page') && $this->arg('page') != 1) {
                $args['page'] = $this->arg['page'];
            }
            common_redirect(common_local_url($this->trimmed('action'), $args), 301);
        }

        $this->user = User::getKV('nickname', $nickname);

        if (!$this->user) {
            // TRANS: Client error displayed when referring to a non-existing user.
            $this->clientError(_m('No such user.'), 404);
        }

        $this->profile = $this->user->getProfile();

        if (!$this->profile) {
            // TRANS: Error message displayed when referring to a user without a profile.
            $this->serverError(_m('User has no profile.'));
        }

        $page = $this->trimmed('page');

        if (!empty($page) && Validate::number($page)) {
            $this->page = $page+0;
        } else {
            $this->page = 1;
        }

        $this->notices = empty($this->tag)
          ? $this->user->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1)
            : $this->user->getTaggedNotices($this->tag, ($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, 0, 0, null);

        return true;
    }

    function handle($args)
    {
        parent::handle($args);
        $this->showPage();
    }

    function showContent()
    {
        $this->element('div', array('id' => 'map_canvas',
                                    'class' => 'gray smallmap',
                                    'style' => "width: 100%; height: 400px"));
    }

    /**
     * Hook for adding extra JavaScript
     *
     * @param Action $action Action object for the page
     *
     * @return boolean event handler return
     */
    function showScripts()
    {
        parent::showScripts();
        $jsonArray = array();

        while ($this->notice->fetch()) {
            if (!empty($this->notice->lat) && !empty($this->notice->lon)) {
                $jsonNotice = $this->noticeAsJson($this->notice);
                $jsonArray[] = $jsonNotice;
            }
        }

        $this->inlineScript('$(document).ready(function() { '.
                            ' var _notices = ' . json_encode($jsonArray).'; ' .
                            'showMapstraction($("#map_canvas"), _notices); });');

        return true;
    }

    function noticeAsJson($notice)
    {
        // FIXME: this code should be abstracted to a neutral third
        // party, like Notice::asJson(). I'm not sure of the ethics
        // of refactoring from within a plugin, so I'm just abusing
        // the ApiAction method. Don't do this unless you're me!

        $act = new ApiAction('/dev/null');

        $arr = $act->twitterStatusArray($notice, true);
        $arr['url'] = $notice->getUrl(true);
        $arr['html'] = $notice->rendered;
        $arr['source'] = $arr['source'];

        if (!empty($notice->reply_to)) {
            $reply_to = Notice::getKV('id', $notice->reply_to);
            if (!empty($reply_to)) {
                $arr['in_reply_to_status_url'] = $reply_to->getUrl(true);
            }
            $reply_to = null;
        }

        $profile = $notice->getProfile();
        $arr['user']['profile_url'] = $profile->profileurl;

        return $arr;
    }
}


code:
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Show a map of user's notices
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Mapstraction
 * @package   StatusNet
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2009 StatusNet, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://status.net/
 */

if (!defined('STATUSNET')) {
    exit(1);
}

/**
 * Show a map of user's notices
 *
 * @category Mapstraction
 * @package  StatusNet
 * @author   Evan Prodromou <evan@status.net>
 * @author   Craig Andrews <candrews@integralblue.com>
 * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://status.net/
 */
class UsermapAction extends MapAction
{
    function prepare($args)
    {
        if(parent::prepare($args)) {
            $this->notice = empty($this->tag)
              ? $this->user->getNotices(($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1)
                : $this->user->getTaggedNotices($this->tag, ($this->page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1, 0, 0, null);
            return true;
        }else{
            return false;
        }
    }

    function title()
    {
        $base = $this->profile->getFancyName();

        if ($this->page == 1) {
            // TRANS: Title for map widget.
            // TRANS: %s is a user name.
            return sprintf(_m('%s map'),$base);
        } else {
            // @todo CHECKME: Is the part ", page %2$d" relevant here?
            // TRANS: Title for map widget.
            // TRANS: %1$s is a user name, %2$d is a page nember.
            return sprintf(_m("%1$s map, page %2$d"),
                           $base,
                           $this->page);
        }
    }
}


code:
mxn.register('{{api_id}}', {

Mapstraction: {

	init: function(element, api) {
		var me = this;

		// TODO: Add provider code
	},

	applyOptions: function(){
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	resizeTo: function(width, height){
		// TODO: Add provider code
	},

	addControls: function( args ) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	addSmallControls: function() {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	addLargeControls: function() {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	addMapTypeControls: function() {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	setCenterAndZoom: function(point, zoom) {
		var map = this.maps[this.api];
		var pt = point.toProprietary(this.api);

		// TODO: Add provider code
	},

	addMarker: function(marker, old) {
		var map = this.maps[this.api];
		var pin = marker.toProprietary(this.api);

		// TODO: Add provider code

		return pin;
	},

	removeMarker: function(marker) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	removeAllMarkers: function() {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	declutterMarkers: function(opts) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	addPolyline: function(polyline, old) {
		var map = this.maps[this.api];
		var pl = polyline.toProprietary(this.api);

		// TODO: Add provider code

		return pl;
	},

	removePolyline: function(polyline) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	getCenter: function() {
		var point;
		var map = this.maps[this.api];

		// TODO: Add provider code

		return point;
	},

	setCenter: function(point, options) {
		var map = this.maps[this.api];
		var pt = point.toProprietary(this.api);
		if(options && options.pan) {
			// TODO: Add provider code
		}
		else {
			// TODO: Add provider code
		}
	},

	setZoom: function(zoom) {
		var map = this.maps[this.api];

		// TODO: Add provider code

	},

	getZoom: function() {
		var map = this.maps[this.api];
		var zoom;

		// TODO: Add provider code

		return zoom;
	},

	getZoomLevelForBoundingBox: function( bbox ) {
		var map = this.maps[this.api];
		// NE and SW points from the bounding box.
		var ne = bbox.getNorthEast();
		var sw = bbox.getSouthWest();
		var zoom;

		// TODO: Add provider code

		return zoom;
	},

	setMapType: function(type) {
		var map = this.maps[this.api];
		switch(type) {
			case mxn.Mapstraction.ROAD:
				// TODO: Add provider code
				break;
			case mxn.Mapstraction.SATELLITE:
				// TODO: Add provider code
				break;
			case mxn.Mapstraction.HYBRID:
				// TODO: Add provider code
				break;
			default:
				// TODO: Add provider code
		}
	},

	getMapType: function() {
		var map = this.maps[this.api];

		// TODO: Add provider code

		//return mxn.Mapstraction.ROAD;
		//return mxn.Mapstraction.SATELLITE;
		//return mxn.Mapstraction.HYBRID;

	},

	getBounds: function () {
		var map = this.maps[this.api];

		// TODO: Add provider code

		//return new mxn.BoundingBox( ,  ,  ,  );
	},

	setBounds: function(bounds){
		var map = this.maps[this.api];
		var sw = bounds.getSouthWest();
		var ne = bounds.getNorthEast();

		// TODO: Add provider code

	},

	addImageOverlay: function(id, src, opacity, west, south, east, north, oContext) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	setImagePosition: function(id, oContext) {
		var map = this.maps[this.api];
		var topLeftPoint; var bottomRightPoint;

		// TODO: Add provider code

		//oContext.pixels.top = ...;
		//oContext.pixels.left = ...;
		//oContext.pixels.bottom = ...;
		//oContext.pixels.right = ...;
	},

	addOverlay: function(url, autoCenterAndZoom) {
		var map = this.maps[this.api];

		// TODO: Add provider code

	},

	addTileLayer: function(tile_url, opacity, copyright_text, min_zoom, max_zoom) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	toggleTileLayer: function(tile_url) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	getPixelRatio: function() {
		var map = this.maps[this.api];

		// TODO: Add provider code
	},

	mousePosition: function(element) {
		var map = this.maps[this.api];

		// TODO: Add provider code
	}
},

LatLonPoint: {

	toProprietary: function() {
		// TODO: Add provider code
	},

	fromProprietary: function(googlePoint) {
		// TODO: Add provider code
	}

},

Marker: {

	toProprietary: function() {
		// TODO: Add provider code
	},

	openBubble: function() {
		// TODO: Add provider code
	},

	hide: function() {
		// TODO: Add provider code
	},

	show: function() {
		// TODO: Add provider code
	},

	update: function() {
		// TODO: Add provider code
	}

},

Polyline: {

	toProprietary: function() {
		// TODO: Add provider code
	},

	show: function() {
		// TODO: Add provider code
	},

	hide: function() {
		// TODO: Add provider code
	}

}

});


code:
mxn.register('cloudmade', {

    Mapstraction: {

        init: function(element, api) {
            var me = this;
            var cloudmade = new CM.Tiles.CloudMade.Web({key: cloudmade_key});
            this.maps[api] = new CM.Map(element, cloudmade);
            this.loaded[api] = true;

            CM.Event.addListener(this.maps[api], 'click', function(location,marker) {
                if ( marker && marker.mapstraction_marker ) {
                    marker.mapstraction_marker.click.fire();
                }
                else if ( location ) {
                    me.click.fire({'location': new mxn.LatLonPoint(location.lat(), location.lng())});
                }

                // If the user puts their own Google markers directly on the map
                // then there is no location and this event should not fire.
                if ( location ) {
                    me.clickHandler(location.lat(),location.lng(),location,me);
                }
            });
        },

        applyOptions: function(){
            var map = this.maps[this.api];
            if(this.options.enableScrollWheelZoom){
              map.enableScrollWheelZoom();
            }
        },

        resizeTo: function(width, height){
            this.maps[this.api].checkResize();
        },

        addControls: function( args ) {
            var map = this.maps[this.api];

	    var c = this.addControlsArgs;
	    switch (c.zoom) {
	      case 'large':
	        this.addLargeControls();
	      break;
	      case 'small':
	        this.addSmallControls();
	      break;
	    }

	    if (c.map_type) {
	      this.addMapTypeControls();
	    }
	    if (c.scale) {
	      map.addControl(new CM.ScaleControl());
	      this.addControlsArgs.scale = true;
	    }
        },

        addSmallControls: function() {
            var map = this.maps[this.api];
	    map.addControl(new CM.SmallMapControl());
	    this.addControlsArgs.zoom = 'small';
        },

        addLargeControls: function() {
            var map = this.maps[this.api];
	    map.addControl(new CM.LargeMapControl());
	    this.addControlsArgs.zoom = 'large';
        },

        addMapTypeControls: function() {
            var map = this.maps[this.api];

	    map.addControl(new CM.TileLayerControl());
	    this.addControlsArgs.map_type = true;
        },

        dragging: function(on) {
            var map = this.maps[this.api];

            if (on) {
              map.enableDragging();
            } else {
              map.disableDragging();
            }
        },

        setCenterAndZoom: function(point, zoom) {
            var map = this.maps[this.api];
            var pt = point.toProprietary(this.api);
            map.setCenter(pt, zoom);

        },

        addMarker: function(marker, old) {
            var map = this.maps[this.api];
            var pin = marker.toProprietary(this.api);
	    map.addOverlay(pin);
            return pin;
        },

        removeMarker: function(marker) {
            var map = this.maps[this.api];
            marker.proprietary_marker.closeInfoWindow();
	    map.removeOverlay(marker.proprietary_marker);
        },

        removeAllMarkers: function() {
	    // Done in mxn.core.js
        },

        declutterMarkers: function(opts) {
            var map = this.maps[this.api];

            // TODO: Add provider code
        },

        addPolyline: function(polyline, old) {
            var map = this.maps[this.api];
            var pl = polyline.toProprietary(this.api);
	    map.addOverlay(pl);
            return pl;
        },

        removePolyline: function(polyline) {
            var map = this.maps[this.api];
            map.removeOverlay(polyline.proprietary_polyline);
        },

        getCenter: function() {
            var map = this.maps[this.api];
            var pt = map.getCenter();

            return new mxn.LatLonPoint(pt.lat(), pt.lng());
        },

        setCenter: function(point, options) {
            var map = this.maps[this.api];
            var pt = point.toProprietary(this.api);
            if(options !== null && options.pan) { map.panTo(pt); }
            else { map.setCenter(pt); }
        },

        setZoom: function(zoom) {
            var map = this.maps[this.api];
	    map.setZoom(zoom);
        },

        getZoom: function() {
	    var map = this.maps[this.api];
	    return map.getZoom();
        },

        getZoomLevelForBoundingBox: function( bbox ) {
            var map = this.maps[this.api];
            // NE and SW points from the bounding box.
            var ne = bbox.getNorthEast();
            var sw = bbox.getSouthWest();

	    var zoom = map.getBoundsZoomLevel(new CM.LatLngBounds(sw.toProprietary(this.api), ne.toProprietary(this.api)));
            return zoom;
        },

        setMapType: function(type) {
            var map = this.maps[this.api];

            // TODO: Are there any MapTypes for Cloudmade?

            switch(type) {
                case mxn.Mapstraction.ROAD:
                // TODO: Add provider code
                break;
                case mxn.Mapstraction.SATELLITE:
                // TODO: Add provider code
                break;
                case mxn.Mapstraction.HYBRID:
                // TODO: Add provider code
                break;
                default:
                // TODO: Add provider code
            }
        },

        getMapType: function() {
            var map = this.maps[this.api];

            // TODO: Are there any MapTypes for Cloudmade?

            return mxn.Mapstraction.ROAD;
            //return mxn.Mapstraction.SATELLITE;
            //return mxn.Mapstraction.HYBRID;

        },

        getBounds: function () {
            var map = this.maps[this.api];

            var box = map.getBounds();
            var sw = box.getSouthWest();
            var ne = box.getNorthEast();

            return new mxn.BoundingBox(sw.lat(), sw.lng(), ne.lat(), ne.lng());
        },

        setBounds: function(bounds){
            var map = this.maps[this.api];
            var sw = bounds.getSouthWest();
            var ne = bounds.getNorthEast();

	    map.zoomToBounds(new CM.LatLngBounds(sw.toProprietary(this.api), ne.toProprietary(this.api)));
        },

        addImageOverlay: function(id, src, opacity, west, south, east, north, oContext) {
            var map = this.maps[this.api];

            // TODO: Add provider code
        },

        setImagePosition: function(id, oContext) {
            var map = this.maps[this.api];
            var topLeftPoint; var bottomRightPoint;

            // TODO: Add provider code

        },

        addOverlay: function(url, autoCenterAndZoom) {
            var map = this.maps[this.api];

            // TODO: Add provider code

        },

        addTileLayer: function(tile_url, opacity, copyright_text, min_zoom, max_zoom) {
            var map = this.maps[this.api];

            // TODO: Add provider code
        },

        toggleTileLayer: function(tile_url) {
            var map = this.maps[this.api];

            // TODO: Add provider code
        },

        getPixelRatio: function() {
            var map = this.maps[this.api];

            // TODO: Add provider code
        },

        mousePosition: function(element) {
            var map = this.maps[this.api];

            // TODO: Add provider code
        }
    },

    LatLonPoint: {

        toProprietary: function() {
	    var cll = new CM.LatLng(this.lat,this.lon);
	    return cll;
        },

        fromProprietary: function(point) {
	    return new mxn.LatLonPoint(point.lat(),point.lng());
        }

    },

    Marker: {

        toProprietary: function() {
	    var pt = this.location.toProprietary(this.api);
	    var options = {};

	    if (this.iconUrl) {
	      var cicon = new CM.Icon();
	      cicon.image = this.iconUrl;
	      if (this.iconSize) {
	        cicon.iconSize = new CM.Size(this.iconSize[0], this.iconSize[1]);
	        if (this.iconAnchor) {
	          cicon.iconAnchor = new CM.Point(this.iconAnchor[0], this.iconAnchor[1]);
	        }
	      }
	      if (this.iconShadowUrl) {
	        cicon.shadow = this.iconShadowUrl;
	        if (this.iconShadowSize) {
	          cicon.shadowSize = new CM.Size(this.iconShadowSize[0], this.iconShadowSize[1]);
	        }
	      }
	      options.icon = cicon;
	    }
	    if (this.labelText) {
 	      options.title = this.labelText;
	    }
	    var cmarker = new CM.Marker(pt, options);

	    if (this.infoBubble) {
	      cmarker.bindInfoWindow(this.infoBubble);
	    }

	    return cmarker;
        },

        openBubble: function() {
            var pin = this.proprietary_marker;
            pin.openInfoWindow(this.infoBubble);
        },

        hide: function() {
            var pin = this.proprietary_marker;
            pin.hide();
        },

        show: function() {
            var pin = this.proprietary_marker;
            pin.show();
        },

        update: function() {
            // TODO: Add provider code
        }

    },

    Polyline: {

        toProprietary: function() {
            var pts = [];
            var poly;

            for (var i = 0,  length = this.points.length ; i< length; i++){
              pts.push(this.points[i].toProprietary(this.api));
            }
            if (this.closed || pts[0].equals(pts[pts.length-1])) {
              poly = new CM.Polygon(pts, this.color, this.width, this.opacity, this.fillColor || "#5462E3", this.opacity || "0.3");
            } else {
              poly = new CM.Polyline(pts, this.color, this.width, this.opacity);
            }
            return poly;
        },

        show: function() {
	    this.proprietary_polyline.show();
        },

        hide: function() {
	    this.proprietary_polyline.hide();
        }

    }

});