Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MVC specification.php36
-rw-r--r--TODO10
-rw-r--r--api_test.php21
-rwxr-xr-xindex.php182
-rwxr-xr-xmisc/generateDoc.sh6
-rwxr-xr-xmisc/phpdoc-config.ini4
-rwxr-xr-xmisc/stress.sh2
-rwxr-xr-xmodules/API/APIable.php14
-rwxr-xr-xmodules/API/Proxy.php70
-rw-r--r--modules/API/Request.php197
-rwxr-xr-xmodules/Access.php1
-rw-r--r--modules/ArchiveProcessing.php2
-rw-r--r--modules/ArchiveProcessing/Day.php12
-rw-r--r--modules/ArchiveProcessing/Period.php4
-rw-r--r--modules/ArchiveProcessing/Record.php120
-rw-r--r--modules/Auth.php3
-rw-r--r--modules/Common.php3
-rwxr-xr-xmodules/Config.php2
-rw-r--r--modules/DataFiles/Browsers.php5
-rw-r--r--modules/DataFiles/Countries.php7
-rw-r--r--modules/DataFiles/OS.php5
-rw-r--r--modules/DataFiles/SearchEngines.php19
-rw-r--r--modules/DataTable.php1
-rw-r--r--modules/DataTable/Filter.php25
-rw-r--r--modules/DataTable/Filter/ColumnCallback.php6
-rw-r--r--modules/DataTable/Filter/ColumnCallbackAddDetail.php9
-rw-r--r--modules/DataTable/Filter/ColumnCallbackReplace.php7
-rw-r--r--modules/DataTable/Filter/DetailCallbackAddDetail.php6
-rw-r--r--modules/DataTable/Filter/Empty.php9
-rw-r--r--modules/DataTable/Filter/ExcludeLowPopulation.php11
-rw-r--r--modules/DataTable/Filter/Limit.php9
-rw-r--r--modules/DataTable/Filter/Pattern.php11
-rw-r--r--modules/DataTable/Filter/ReplaceColumnNames.php23
-rw-r--r--modules/DataTable/Filter/Sort.php9
-rw-r--r--modules/DataTable/Manager.php31
-rw-r--r--modules/DataTable/Renderer.php36
-rw-r--r--modules/DataTable/Renderer/Console.php9
-rw-r--r--modules/DataTable/Renderer/HTML.php10
-rw-r--r--modules/DataTable/Renderer/PHP.php8
-rw-r--r--modules/DataTable/Renderer/XML.php7
-rw-r--r--modules/DataTable/Row.php126
-rw-r--r--modules/DataTable/Row/DataTableSummary.php14
-rw-r--r--modules/DataTable/Simple.php28
-rw-r--r--modules/Date.php2
-rwxr-xr-xmodules/ErrorHandler.php10
-rw-r--r--modules/ExceptionHandler.php2
-rwxr-xr-xmodules/Log.php2
-rw-r--r--modules/Log/APICall.php2
-rw-r--r--modules/Log/Error.php2
-rw-r--r--modules/Log/Exception.php2
-rw-r--r--modules/Log/Message.php2
-rw-r--r--modules/Log/Null.php2
-rw-r--r--modules/LogStats.php2
-rw-r--r--modules/LogStats/Action.php2
-rw-r--r--modules/LogStats/Config.php2
-rw-r--r--modules/LogStats/Cookie.php2
-rw-r--r--modules/LogStats/Db.php3
-rw-r--r--modules/LogStats/Generator.php2
-rw-r--r--modules/LogStats/Visit.php2
-rw-r--r--modules/Period.php4
-rwxr-xr-xmodules/Piwik.php2
-rw-r--r--modules/Plugin.php2
-rw-r--r--modules/PluginsManager.php1
-rw-r--r--modules/Site.php2
-rwxr-xr-xmodules/SitesManager.php4
-rw-r--r--modules/TablePartitioning.php2
-rw-r--r--modules/Timer.php1
-rw-r--r--modules/Translate.php2
-rwxr-xr-xmodules/UsersManager.php2
-rw-r--r--piwik.php4
-rw-r--r--plugins/Referers.php53
-rw-r--r--plugins/Referers/API.php101
-rw-r--r--plugins/Referers/images/searchEngines/affiliate.espotting.fr.pngbin0 -> 1045 bytes
-rw-r--r--plugins/Referers/images/searchEngines/arianna.libero.it.pngbin0 -> 1025 bytes
-rw-r--r--plugins/Referers/images/searchEngines/class.hit-parade.com.pngbin0 -> 1214 bytes
-rw-r--r--plugins/Referers/images/searchEngines/directory.google.com.pngbin0 -> 1127 bytes
-rw-r--r--plugins/Referers/images/searchEngines/dmoz.org.pngbin0 -> 277 bytes
-rw-r--r--plugins/Referers/images/searchEngines/find.copernic.com.pngbin0 -> 28708 bytes
-rw-r--r--plugins/Referers/images/searchEngines/fr.dir.com.pngbin0 -> 1072 bytes
-rw-r--r--plugins/Referers/images/searchEngines/fr.wedoo.com.pngbin0 -> 1001 bytes
-rw-r--r--plugins/Referers/images/searchEngines/fulltext.centrum.cz.pngbin0 -> 507 bytes
-rw-r--r--plugins/Referers/images/searchEngines/g.msn.com.pngbin0 -> 1102 bytes
-rw-r--r--plugins/Referers/images/searchEngines/go.mail.ru.pngbin0 -> 255 bytes
-rw-r--r--plugins/Referers/images/searchEngines/hledani.tiscali.cz.pngbin0 -> 284 bytes
-rw-r--r--plugins/Referers/images/searchEngines/hotbox.pngbin0 -> 1130 bytes
-rw-r--r--plugins/Referers/images/searchEngines/images.google.com.pngbin0 -> 1127 bytes
-rw-r--r--plugins/Referers/images/searchEngines/images.yandex.ru.pngbin0 -> 341 bytes
-rw-r--r--plugins/Referers/images/searchEngines/jyxo.cz.pngbin0 -> 1052 bytes
-rw-r--r--plugins/Referers/images/searchEngines/morfeo.centrum.cz.pngbin0 -> 507 bytes
-rw-r--r--plugins/Referers/images/searchEngines/msxml.excite.com.pngbin0 -> 1008 bytes
-rw-r--r--plugins/Referers/images/searchEngines/news.google.com.pngbin0 -> 1127 bytes
-rw-r--r--plugins/Referers/images/searchEngines/recherche.club-internet.fr.pngbin0 -> 1016 bytes
-rw-r--r--plugins/Referers/images/searchEngines/recherche.francite.com.pngbin0 -> 1095 bytes
-rw-r--r--plugins/Referers/images/searchEngines/recherche.toile.qc.ca.pngbin0 -> 1067 bytes
-rw-r--r--plugins/Referers/images/searchEngines/rechercher.aliceadsl.fr.pngbin0 -> 694 bytes
-rw-r--r--plugins/Referers/images/searchEngines/rechercher.nomade.aliceadsl.fr.pngbin0 -> 1062 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search-dyn.tiscali.it.pngbin0 -> 1055 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.about.com.pngbin0 -> 733 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.aol.com.pngbin0 -> 1062 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.atlas.cz.pngbin0 -> 489 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.bluewin.ch.pngbin0 -> 852 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.centrum.cz.pngbin0 -> 507 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.earthlink.net.pngbin0 -> 257 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.free.fr.pngbin0 -> 1143 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.ke.wanadoo.fr.pngbin0 -> 1193 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.metacrawler.com.pngbin0 -> 1128 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.msn.com.pngbin0 -> 1055 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.netscape.com.pngbin0 -> 1132 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.seznam.cz.pngbin0 -> 1149 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.skynet.be.pngbin0 -> 1128 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.virgilio.it.pngbin0 -> 227 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.voila.com.pngbin0 -> 929 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.yaca.yandex.ru.pngbin0 -> 341 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search.yahoo.com.pngbin0 -> 254 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search1.seznam.cz.pngbin0 -> 1149 bytes
-rw-r--r--plugins/Referers/images/searchEngines/search2.seznam.cz.pngbin0 -> 1149 bytes
-rw-r--r--plugins/Referers/images/searchEngines/sm.aport.ru.pngbin0 -> 1032 bytes
-rw-r--r--plugins/Referers/images/searchEngines/translate.google.com.pngbin0 -> 1127 bytes
-rw-r--r--plugins/Referers/images/searchEngines/web.toile.com.pngbin0 -> 1115 bytes
-rw-r--r--plugins/Referers/images/searchEngines/web.volny.cz.pngbin0 -> 293 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.a9.com.pngbin0 -> 403 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.alltheweb.com.pngbin0 -> 307 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.altavista.com.pngbin0 -> 454 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.ask.com.pngbin0 -> 1030 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.eo.st.pngbin0 -> 598 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.eu.ixquick.com.pngbin0 -> 489 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.euroseek.com.pngbin0 -> 1072 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.exalead.fr.pngbin0 -> 696 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.google.com.pngbin0 -> 1127 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.google.interia.pl.pngbin0 -> 382 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.hotbot.com.pngbin0 -> 237 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.icq.com.pngbin0 -> 1208 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.looksmart.com.pngbin0 -> 1089 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.mozbot.com.pngbin0 -> 1041 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.multimania.lycos.fr.pngbin0 -> 1214 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.mywebsearch.com.pngbin0 -> 1092 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.najdi.si.pngbin0 -> 721 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.northernlight.com.pngbin0 -> 1141 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.rambler.ru.pngbin0 -> 539 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.reacteur.com.pngbin0 -> 1076 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.search.ch.pngbin0 -> 250 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.search.com.pngbin0 -> 997 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.searchalot.com.pngbin0 -> 223 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.teoma.com.pngbin0 -> 1003 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.webalta.ru.pngbin0 -> 389 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.weborama.fr.pngbin0 -> 1214 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.ya.ru.pngbin0 -> 341 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.yandex.ru.pngbin0 -> 341 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www.zoeken.nl.pngbin0 -> 1031 bytes
-rw-r--r--plugins/Referers/images/searchEngines/www3.zoek.nl.pngbin0 -> 1214 bytes
-rw-r--r--plugins/Referers/images/searchEngines/xx.gifbin0 -> 55 bytes
-rw-r--r--plugins/Referers/images/searchEngines/xx.pngbin0 -> 980 bytes
-rw-r--r--plugins/Referers/images/searchEngines/ya.ru.pngbin0 -> 341 bytes
-rw-r--r--plugins/Referers/images/searchEngines/yandex.ru.pngbin0 -> 341 bytes
-rw-r--r--plugins/Referers/images/searchEngines/zoohoo.cz.pngbin0 -> 1009 bytes
-rw-r--r--plugins/Referers/lang/en.php2
-rwxr-xr-xplugins/UserCountry/flags/ad.pngbin0 -> 760 bytes
-rwxr-xr-xplugins/UserCountry/flags/ae.pngbin0 -> 657 bytes
-rwxr-xr-xplugins/UserCountry/flags/af.pngbin0 -> 760 bytes
-rwxr-xr-xplugins/UserCountry/flags/ag.pngbin0 -> 730 bytes
-rwxr-xr-xplugins/UserCountry/flags/al.pngbin0 -> 737 bytes
-rwxr-xr-xplugins/UserCountry/flags/am.pngbin0 -> 751 bytes
-rwxr-xr-xplugins/UserCountry/flags/ao.pngbin0 -> 756 bytes
-rwxr-xr-xplugins/UserCountry/flags/ar.pngbin0 -> 761 bytes
-rwxr-xr-xplugins/UserCountry/flags/at.pngbin0 -> 747 bytes
-rwxr-xr-xplugins/UserCountry/flags/au.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/az.pngbin0 -> 772 bytes
-rwxr-xr-xplugins/UserCountry/flags/ba.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/bb.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/bd.pngbin0 -> 728 bytes
-rwxr-xr-xplugins/UserCountry/flags/be.pngbin0 -> 748 bytes
-rwxr-xr-xplugins/UserCountry/flags/bf.pngbin0 -> 763 bytes
-rwxr-xr-xplugins/UserCountry/flags/bg.pngbin0 -> 756 bytes
-rwxr-xr-xplugins/UserCountry/flags/bh.pngbin0 -> 698 bytes
-rwxr-xr-xplugins/UserCountry/flags/bi.pngbin0 -> 770 bytes
-rwxr-xr-xplugins/UserCountry/flags/bj.pngbin0 -> 757 bytes
-rwxr-xr-xplugins/UserCountry/flags/bn.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/bo.pngbin0 -> 769 bytes
-rwxr-xr-xplugins/UserCountry/flags/br.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/bs.pngbin0 -> 766 bytes
-rwxr-xr-xplugins/UserCountry/flags/bt.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/bw.pngbin0 -> 714 bytes
-rwxr-xr-xplugins/UserCountry/flags/by.pngbin0 -> 770 bytes
-rwxr-xr-xplugins/UserCountry/flags/bz.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/ca.pngbin0 -> 755 bytes
-rwxr-xr-xplugins/UserCountry/flags/cf.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/cg.pngbin0 -> 722 bytes
-rwxr-xr-xplugins/UserCountry/flags/ch.pngbin0 -> 744 bytes
-rwxr-xr-xplugins/UserCountry/flags/ci.pngbin0 -> 725 bytes
-rwxr-xr-xplugins/UserCountry/flags/ck.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/cl.pngbin0 -> 735 bytes
-rwxr-xr-xplugins/UserCountry/flags/cm.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/cn.pngbin0 -> 576 bytes
-rwxr-xr-xplugins/UserCountry/flags/co.pngbin0 -> 724 bytes
-rwxr-xr-xplugins/UserCountry/flags/cr.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/cs.pngbin0 -> 589 bytes
-rwxr-xr-xplugins/UserCountry/flags/cu.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/cv.pngbin0 -> 765 bytes
-rwxr-xr-xplugins/UserCountry/flags/cy.pngbin0 -> 687 bytes
-rwxr-xr-xplugins/UserCountry/flags/cz.pngbin0 -> 739 bytes
-rwxr-xr-xplugins/UserCountry/flags/de.pngbin0 -> 753 bytes
-rwxr-xr-xplugins/UserCountry/flags/dj.pngbin0 -> 764 bytes
-rwxr-xr-xplugins/UserCountry/flags/dk.pngbin0 -> 719 bytes
-rwxr-xr-xplugins/UserCountry/flags/dm.pngbin0 -> 787 bytes
-rwxr-xr-xplugins/UserCountry/flags/do.pngbin0 -> 777 bytes
-rwxr-xr-xplugins/UserCountry/flags/dz.pngbin0 -> 695 bytes
-rwxr-xr-xplugins/UserCountry/flags/ec.pngbin0 -> 775 bytes
-rwxr-xr-xplugins/UserCountry/flags/ee.pngbin0 -> 720 bytes
-rwxr-xr-xplugins/UserCountry/flags/eg.pngbin0 -> 735 bytes
-rwxr-xr-xplugins/UserCountry/flags/er.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/es.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/et.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/fi.pngbin0 -> 728 bytes
-rwxr-xr-xplugins/UserCountry/flags/fj.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/fm.pngbin0 -> 685 bytes
-rwxr-xr-xplugins/UserCountry/flags/fr.pngbin0 -> 738 bytes
-rwxr-xr-xplugins/UserCountry/flags/ga.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/gb.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/gd.pngbin0 -> 793 bytes
-rwxr-xr-xplugins/UserCountry/flags/ge.pngbin0 -> 595 bytes
-rwxr-xr-xplugins/UserCountry/flags/gh.pngbin0 -> 742 bytes
-rwxr-xr-xplugins/UserCountry/flags/gm.pngbin0 -> 748 bytes
-rwxr-xr-xplugins/UserCountry/flags/gn.pngbin0 -> 716 bytes
-rwxr-xr-xplugins/UserCountry/flags/gq.pngbin0 -> 778 bytes
-rwxr-xr-xplugins/UserCountry/flags/gr.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/gt.pngbin0 -> 767 bytes
-rwxr-xr-xplugins/UserCountry/flags/gw.pngbin0 -> 737 bytes
-rwxr-xr-xplugins/UserCountry/flags/gy.pngbin0 -> 765 bytes
-rwxr-xr-xplugins/UserCountry/flags/hk.pngbin0 -> 1055 bytes
-rwxr-xr-xplugins/UserCountry/flags/hn.pngbin0 -> 757 bytes
-rwxr-xr-xplugins/UserCountry/flags/hr.pngbin0 -> 765 bytes
-rwxr-xr-xplugins/UserCountry/flags/ht.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/hu.pngbin0 -> 745 bytes
-rwxr-xr-xplugins/UserCountry/flags/id.pngbin0 -> 726 bytes
-rwxr-xr-xplugins/UserCountry/flags/ie.pngbin0 -> 730 bytes
-rwxr-xr-xplugins/UserCountry/flags/il.pngbin0 -> 751 bytes
-rwxr-xr-xplugins/UserCountry/flags/in.pngbin0 -> 764 bytes
-rwxr-xr-xplugins/UserCountry/flags/iq.pngbin0 -> 754 bytes
-rwxr-xr-xplugins/UserCountry/flags/ir.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/is.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/it.pngbin0 -> 710 bytes
-rwxr-xr-xplugins/UserCountry/flags/jm.pngbin0 -> 763 bytes
-rwxr-xr-xplugins/UserCountry/flags/jo.pngbin0 -> 766 bytes
-rwxr-xr-xplugins/UserCountry/flags/jp.pngbin0 -> 630 bytes
-rwxr-xr-xplugins/UserCountry/flags/ke.pngbin0 -> 763 bytes
-rwxr-xr-xplugins/UserCountry/flags/kg.pngbin0 -> 750 bytes
-rwxr-xr-xplugins/UserCountry/flags/kh.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/ki.pngbin0 -> 778 bytes
-rwxr-xr-xplugins/UserCountry/flags/km.pngbin0 -> 781 bytes
-rwxr-xr-xplugins/UserCountry/flags/kn.pngbin0 -> 697 bytes
-rwxr-xr-xplugins/UserCountry/flags/kp.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/kr.pngbin0 -> 686 bytes
-rwxr-xr-xplugins/UserCountry/flags/kw.pngbin0 -> 703 bytes
-rwxr-xr-xplugins/UserCountry/flags/kz.pngbin0 -> 754 bytes
-rwxr-xr-xplugins/UserCountry/flags/la.pngbin0 -> 744 bytes
-rwxr-xr-xplugins/UserCountry/flags/lb.pngbin0 -> 751 bytes
-rwxr-xr-xplugins/UserCountry/flags/lc.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/li.pngbin0 -> 715 bytes
-rwxr-xr-xplugins/UserCountry/flags/lk.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/lr.pngbin0 -> 775 bytes
-rwxr-xr-xplugins/UserCountry/flags/ls.pngbin0 -> 790 bytes
-rwxr-xr-xplugins/UserCountry/flags/lt.pngbin0 -> 595 bytes
-rwxr-xr-xplugins/UserCountry/flags/lu.pngbin0 -> 750 bytes
-rwxr-xr-xplugins/UserCountry/flags/lv.pngbin0 -> 705 bytes
-rwxr-xr-xplugins/UserCountry/flags/ly.pngbin0 -> 548 bytes
-rwxr-xr-xplugins/UserCountry/flags/ma.pngbin0 -> 849 bytes
-rwxr-xr-xplugins/UserCountry/flags/mc.pngbin0 -> 730 bytes
-rwxr-xr-xplugins/UserCountry/flags/md.pngbin0 -> 753 bytes
-rwxr-xr-xplugins/UserCountry/flags/mg.pngbin0 -> 741 bytes
-rwxr-xr-xplugins/UserCountry/flags/mh.pngbin0 -> 754 bytes
-rwxr-xr-xplugins/UserCountry/flags/mk.pngbin0 -> 811 bytes
-rwxr-xr-xplugins/UserCountry/flags/ml.pngbin0 -> 720 bytes
-rwxr-xr-xplugins/UserCountry/flags/mm.pngbin0 -> 693 bytes
-rwxr-xr-xplugins/UserCountry/flags/mn.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/mr.pngbin0 -> 676 bytes
-rwxr-xr-xplugins/UserCountry/flags/mt.pngbin0 -> 733 bytes
-rwxr-xr-xplugins/UserCountry/flags/mu.pngbin0 -> 721 bytes
-rwxr-xr-xplugins/UserCountry/flags/mv.pngbin0 -> 754 bytes
-rwxr-xr-xplugins/UserCountry/flags/mw.pngbin0 -> 648 bytes
-rwxr-xr-xplugins/UserCountry/flags/mx.pngbin0 -> 745 bytes
-rwxr-xr-xplugins/UserCountry/flags/my.pngbin0 -> 782 bytes
-rwxr-xr-xplugins/UserCountry/flags/mz.pngbin0 -> 770 bytes
-rwxr-xr-xplugins/UserCountry/flags/na.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/ne.pngbin0 -> 769 bytes
-rwxr-xr-xplugins/UserCountry/flags/ng.pngbin0 -> 660 bytes
-rwxr-xr-xplugins/UserCountry/flags/ni.pngbin0 -> 751 bytes
-rwxr-xr-xplugins/UserCountry/flags/nl.pngbin0 -> 744 bytes
-rwxr-xr-xplugins/UserCountry/flags/no.pngbin0 -> 753 bytes
-rwxr-xr-xplugins/UserCountry/flags/np.pngbin0 -> 591 bytes
-rwxr-xr-xplugins/UserCountry/flags/nr.pngbin0 -> 744 bytes
-rwxr-xr-xplugins/UserCountry/flags/nu.pngbin0 -> 727 bytes
-rwxr-xr-xplugins/UserCountry/flags/nz.pngbin0 -> 760 bytes
-rwxr-xr-xplugins/UserCountry/flags/om.pngbin0 -> 750 bytes
-rwxr-xr-xplugins/UserCountry/flags/pa.pngbin0 -> 1116 bytes
-rwxr-xr-xplugins/UserCountry/flags/pe.pngbin0 -> 770 bytes
-rwxr-xr-xplugins/UserCountry/flags/pg.pngbin0 -> 619 bytes
-rwxr-xr-xplugins/UserCountry/flags/ph.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/pk.pngbin0 -> 759 bytes
-rwxr-xr-xplugins/UserCountry/flags/pl.pngbin0 -> 703 bytes
-rwxr-xr-xplugins/UserCountry/flags/po.pngbin0 -> 703 bytes
-rwxr-xr-xplugins/UserCountry/flags/pt.pngbin0 -> 724 bytes
-rwxr-xr-xplugins/UserCountry/flags/pw.pngbin0 -> 723 bytes
-rwxr-xr-xplugins/UserCountry/flags/py.pngbin0 -> 765 bytes
-rwxr-xr-xplugins/UserCountry/flags/qa.pngbin0 -> 662 bytes
-rwxr-xr-xplugins/UserCountry/flags/ro.pngbin0 -> 772 bytes
-rwxr-xr-xplugins/UserCountry/flags/rs.pngbin0 -> 756 bytes
-rwxr-xr-xplugins/UserCountry/flags/ru.pngbin0 -> 756 bytes
-rwxr-xr-xplugins/UserCountry/flags/rw.pngbin0 -> 739 bytes
-rwxr-xr-xplugins/UserCountry/flags/sa.pngbin0 -> 745 bytes
-rwxr-xr-xplugins/UserCountry/flags/sb.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/sc.pngbin0 -> 796 bytes
-rwxr-xr-xplugins/UserCountry/flags/sd.pngbin0 -> 741 bytes
-rwxr-xr-xplugins/UserCountry/flags/se.pngbin0 -> 765 bytes
-rwxr-xr-xplugins/UserCountry/flags/sg.pngbin0 -> 726 bytes
-rwxr-xr-xplugins/UserCountry/flags/si.pngbin0 -> 748 bytes
-rwxr-xr-xplugins/UserCountry/flags/sk.pngbin0 -> 760 bytes
-rwxr-xr-xplugins/UserCountry/flags/sl.pngbin0 -> 754 bytes
-rwxr-xr-xplugins/UserCountry/flags/sm.pngbin0 -> 796 bytes
-rwxr-xr-xplugins/UserCountry/flags/sn.pngbin0 -> 721 bytes
-rwxr-xr-xplugins/UserCountry/flags/so.pngbin0 -> 694 bytes
-rwxr-xr-xplugins/UserCountry/flags/sr.pngbin0 -> 715 bytes
-rwxr-xr-xplugins/UserCountry/flags/st.pngbin0 -> 745 bytes
-rwxr-xr-xplugins/UserCountry/flags/sv.pngbin0 -> 736 bytes
-rwxr-xr-xplugins/UserCountry/flags/sy.pngbin0 -> 615 bytes
-rwxr-xr-xplugins/UserCountry/flags/sz.pngbin0 -> 811 bytes
-rwxr-xr-xplugins/UserCountry/flags/td.pngbin0 -> 714 bytes
-rwxr-xr-xplugins/UserCountry/flags/tg.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/th.pngbin0 -> 770 bytes
-rwxr-xr-xplugins/UserCountry/flags/tj.pngbin0 -> 778 bytes
-rwxr-xr-xplugins/UserCountry/flags/tm.pngbin0 -> 567 bytes
-rwxr-xr-xplugins/UserCountry/flags/tn.pngbin0 -> 744 bytes
-rwxr-xr-xplugins/UserCountry/flags/to.pngbin0 -> 667 bytes
-rwxr-xr-xplugins/UserCountry/flags/tr.pngbin0 -> 672 bytes
-rwxr-xr-xplugins/UserCountry/flags/tt.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/tv.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/tw.pngbin0 -> 1061 bytes
-rwxr-xr-xplugins/UserCountry/flags/tz.pngbin0 -> 725 bytes
-rwxr-xr-xplugins/UserCountry/flags/ua.pngbin0 -> 765 bytes
-rwxr-xr-xplugins/UserCountry/flags/ug.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/uk.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/us.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/uy.pngbin0 -> 773 bytes
-rwxr-xr-xplugins/UserCountry/flags/uz.pngbin0 -> 769 bytes
-rwxr-xr-xplugins/UserCountry/flags/va.pngbin0 -> 745 bytes
-rwxr-xr-xplugins/UserCountry/flags/vc.pngbin0 -> 805 bytes
-rwxr-xr-xplugins/UserCountry/flags/ve.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/vi.pngbin0 -> 776 bytes
-rwxr-xr-xplugins/UserCountry/flags/vn.pngbin0 -> 696 bytes
-rwxr-xr-xplugins/UserCountry/flags/vu.pngbin0 -> 737 bytes
-rwxr-xr-xplugins/UserCountry/flags/ws.pngbin0 -> 673 bytes
-rwxr-xr-xplugins/UserCountry/flags/xx.pngbin0 -> 658 bytes
-rwxr-xr-xplugins/UserCountry/flags/ye.pngbin0 -> 717 bytes
-rwxr-xr-xplugins/UserCountry/flags/yu.pngbin0 -> 751 bytes
-rwxr-xr-xplugins/UserCountry/flags/za.pngbin0 -> 779 bytes
-rwxr-xr-xplugins/UserCountry/flags/zm.pngbin0 -> 645 bytes
-rwxr-xr-xplugins/UserCountry/flags/zr.pngbin0 -> 757 bytes
-rwxr-xr-xplugins/UserCountry/flags/zw.pngbin0 -> 782 bytes
-rw-r--r--plugins/UserSettings.php2
-rwxr-xr-xtests/all_tests.php2
-rwxr-xr-xtests/modules/Common.test.php2
-rw-r--r--tests/modules/Date.test.php2
-rw-r--r--tests/modules/Period.test.php2
-rw-r--r--tests/modules/Piwik.test.php2
-rwxr-xr-xtests/modules/SitesManager.test.php2
-rwxr-xr-xtests/modules/TablePartitioning.test.php2
-rwxr-xr-xtests/modules/blank.test.php2
366 files changed, 1053 insertions, 308 deletions
diff --git a/MVC specification.php b/MVC specification.php
new file mode 100644
index 0000000000..728c205227
--- /dev/null
+++ b/MVC specification.php
@@ -0,0 +1,36 @@
+MVC specification
+=================
+
+Modules that need to display HTML
+- Installation
+- Administration modules
+- All the reports modules
+
+These modules can be part of the "core" or "plugins"
+
+It must be *easy* for a plugin to display some data in the interface
+Either
+- add a menu in the main menu, or a submenu
+- Modify the footer/header
+- Add a table in a page
+
+A plugin can have a tab for its configuration
+
+But at the same time a plugin can require to edit the template
+and add some dirty PHP code in the source so that the author doesn't
+have to bother about model, view and controller if he wants to do something simple
+
+
+* Using Smarty for template engine
+
+
+Use cases
+------------------------------------------------------------------------------------
+1 - Plugin publishes the list of the last N visitors with their information
+2 - Display a Google map of the last visitors locations
+3 - Display a DataTable of the last N new search keywords
+4 - Feed tracking via feedburner API integration
+5 - Alexa, pagerank, etc. summary in the dashboard
+6 - Database import / export tool
+7 - Plugin that add a selection for every user
+
diff --git a/TODO b/TODO
index c41f4cb001..b858f10dcf 100644
--- a/TODO
+++ b/TODO
@@ -6,6 +6,7 @@ FEATURES
we could select the information last_action_time, last_id_action, etc. assuming we have the idvisitor in the cookie
this would allow to save the logs later by big bulk
- Purge log_ when archiving is done
+- Provide Config file feature for plugins (works as the translation system)
BUGS
====
@@ -29,9 +30,16 @@ TODO MISC
- when the plugins are not used in the piwik.php logging script, don't load the related files
- Archive::build must have the same parameters order as all the API calls that use idSite, Period, Date
- change all .png images to GIF
-
+- Ensure that all parameters to the API are checked against security rules etc.
CHANGES DONE TO LIBRARIES
=========================
- edited zend_log and changed attr to protected
- fixed bug fwrite in zend_log stream writer
+- fixed PEAR so that it works under PHP5 with STRICT MODE enabled
+
+COMMENT
+=======
+When commenting
+- check warning PHP DOC for missing @package
+- look for "[TAB]function " for missing public/private on methods \ No newline at end of file
diff --git a/api_test.php b/api_test.php
deleted file mode 100644
index 032c3773ab..0000000000
--- a/api_test.php
+++ /dev/null
@@ -1,21 +0,0 @@
-Use cases
-
-This part is the equivalent of the Model in MVC.
-It accepts a list of defined parameters and executes action OR gives data.
-It doesnt read anything except the methods parameters.
-The query parameter processing is done outside.
-
-A request returns:
-- one datatable
-- one datable with lots of filters applied
-- an HTML page containing 3 datatables + other values
-- 2 datatable being from different websites, different dates, different filters applied
-- the results of 3 other requests with the same parameters
-
-
-
-<?php
-
-
-
-?>
diff --git a/index.php b/index.php
index 49767be382..bc23adf4f5 100755
--- a/index.php
+++ b/index.php
@@ -70,7 +70,7 @@ $doNotDrop = array(
Piwik::prefixTable('log_action'),
Piwik::prefixTable('log_profiling'),
Piwik::prefixTable('archive'),
- );
+);
Piwik::dropTables($doNotDrop);
Piwik::createTables();
@@ -135,8 +135,8 @@ function displayProfiler()
function main()
{
Piwik::log(
- '<a href="http://localhost/dev/piwiktrunk/?method=UserSettings.getResolution&idSite=1&date=yesterday&period=week&format=xml&filter_limit=&filter_offset=&filter_column=label&filter_pattern=12">
- http://localhost/dev/piwiktrunk/?method=UserSettings.getResolution&idSite=1&date=yesterday&period=week&format=xml&filter_limit=&filter_offset=&filter_column=label&filter_pattern=12
+ '<a href="http://localhost/dev/piwiktrunk/?method=UserSettings.getResolution&idSite=1&date=2007-08-25&period=week&format=xml&filter_limit=&filter_offset=&filter_column=label&filter_pattern=12">
+ http://localhost/dev/piwiktrunk/?method=UserSettings.getResolution&idSite=1&date=2007-08-25&period=week&format=xml&filter_limit=&filter_offset=&filter_column=label&filter_pattern=12
</a>
<br>'
);
@@ -162,7 +162,7 @@ function main()
$request = new Piwik_API_Request('
method=UserSettings.getResolution
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=console
&filter_limit=
@@ -176,7 +176,7 @@ function main()
$request = new Piwik_API_Request('method=UserSettings.getOS
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=
@@ -190,7 +190,7 @@ function main()
$request = new Piwik_API_Request('
method=UserSettings.getConfiguration
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=10
@@ -204,7 +204,7 @@ function main()
$request = new Piwik_API_Request('
method=UserSettings.getBrowser
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=
@@ -218,7 +218,7 @@ function main()
$request = new Piwik_API_Request('
method=UserSettings.getBrowserType
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=
@@ -232,7 +232,7 @@ function main()
$request = new Piwik_API_Request('
method=UserSettings.getWideScreen
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=
@@ -246,7 +246,7 @@ function main()
$request = new Piwik_API_Request('
method=UserSettings.getPlugin
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=
@@ -260,7 +260,7 @@ function main()
$request = new Piwik_API_Request(
'method=Actions.getActions
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=html
&filter_limit=10
@@ -273,7 +273,7 @@ function main()
$request = new Piwik_API_Request(
'method=Actions.getActions
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=html
&expanded=true
@@ -291,7 +291,7 @@ function main()
'method=Actions.getActions
&idSubtable=5477
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=html
&expanded=false
@@ -304,7 +304,7 @@ function main()
$request = new Piwik_API_Request(
'method=Actions.getDownloads
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -314,7 +314,7 @@ function main()
$request = new Piwik_API_Request(
'method=Actions.getOutlinks
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -324,7 +324,7 @@ function main()
$request = new Piwik_API_Request(
'method=Provider.getProvider
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -335,7 +335,7 @@ function main()
$request = new Piwik_API_Request(
'method=UserCountry.getCountry
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
&filter_limit=10
@@ -348,7 +348,7 @@ function main()
$request = new Piwik_API_Request(
'method=UserCountry.getContinent
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -360,7 +360,7 @@ function main()
$request = new Piwik_API_Request(
'method=VisitFrequency.getSummary
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -371,7 +371,7 @@ function main()
$request = new Piwik_API_Request(
'method=VisitorInterest.getNumberOfVisitsPerVisitDuration
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -382,7 +382,7 @@ function main()
$request = new Piwik_API_Request(
'method=VisitorInterest.getNumberOfVisitsPerPage
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=month
&format=xml
'
@@ -395,7 +395,7 @@ function main()
$request = new Piwik_API_Request(
'method=VisitTime.getVisitInformationPerServerTime
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
'
@@ -407,7 +407,7 @@ function main()
$request = new Piwik_API_Request(
'method=Referers.getRefererType
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
'
@@ -418,7 +418,7 @@ function main()
$request = new Piwik_API_Request(
'method=Referers.getKeywords
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=10
@@ -430,7 +430,7 @@ function main()
$request = new Piwik_API_Request(
'method=Referers.getSearchEnginesFromKeywordId
&idSite=1
- &date=yesterday
+ &date=2007-08-25
&period=week
&format=xml
&idSubtable=1886
@@ -444,15 +444,145 @@ function main()
$request = new Piwik_API_Request(
'method=Referers.getSearchEngines
&idSite=1
- &date=yesterday
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+ Piwik::log("getKeywordsFromSearchEngineId");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getKeywordsFromSearchEngineId
+ &idSite=1
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ &idSubtable=1779
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+
+ Piwik::log("getCampaigns");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getCampaigns
+ &idSite=1
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+
+ Piwik::log("getKeywordsFromCampaignId");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getKeywordsFromCampaignId
+ &idSite=1
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ &idSubtable=2251
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+ Piwik::log("getWebsites");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getWebsites
+ &idSite=1
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+
+ Piwik::log("getUrlsFromWebsiteId");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getUrlsFromWebsiteId
+ &idSite=1
+ &date=2007-08-25
&period=week
&format=xml
&filter_limit=10
&filter_offset=0
+ &idSubtable=2432
'
);
dump(htmlentities($request->process()));
+ Piwik::log("getPartners");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getPartners
+ &idSite=1
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+
+ Piwik::log("getUrlsFromPartnerId");
+ $request = new Piwik_API_Request(
+ 'method=Referers.getUrlsFromPartnerId
+ &idSite=1
+ &date=2007-08-25
+ &period=week
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ &idSubtable=3090
+ '
+ );
+ dump(htmlentities($request->process()));
+
+
+ $referersNumeric=array(
+ 'getNumberOfDistinctSearchEngines',
+ 'getNumberOfDistinctKeywords',
+ 'getNumberOfDistinctCampaigns',
+ 'getNumberOfDistinctWebsites',
+ 'getNumberOfDistinctWebsitesUrls',
+ 'getNumberOfDistinctPartners',
+ 'getNumberOfDistinctPartnersUrls',
+ );
+ foreach($referersNumeric as $name)
+ {
+ Piwik::log("$name");
+ $request = new Piwik_API_Request(
+ "method=Referers.$name
+ &idSite=1
+ &date=2007-08-20
+ &period=day
+ &format=xml
+ &filter_limit=10
+ &filter_offset=0
+ "
+ );
+ dump(htmlentities($request->process()));
+ }
}
diff --git a/misc/generateDoc.sh b/misc/generateDoc.sh
index b318b1c186..0faa658e18 100755
--- a/misc/generateDoc.sh
+++ b/misc/generateDoc.sh
@@ -1,3 +1,3 @@
-rm -Rf ../documentation/
-mkdir ../documentation/
-../libs/PhpDocumentor-1.3.2/phpdoc -c phpdoc-config.ini
+rm -R documentation/
+mkdir documentation/
+libs/PhpDocumentor-1.3.2/phpdoc -c misc/phpdoc-config.ini
diff --git a/misc/phpdoc-config.ini b/misc/phpdoc-config.ini
index 99f120d629..ad01aec3d1 100755
--- a/misc/phpdoc-config.ini
+++ b/misc/phpdoc-config.ini
@@ -53,7 +53,7 @@ defaultpackagename = Piwik
;; where should the documentation be written?
;; legal values: a legal path
;target = /home/cellog/output
-target = ../documentation
+target = documentation
;; Which files should be parsed out as special documentation files, such as README,
;; INSTALL and CHANGELOG? This overrides the default files found in
@@ -72,7 +72,7 @@ readmeinstallchangelog = README, INSTALL, FAQ, LICENSE
;; legal values: directory paths separated by commas
;directory = /path1,/path2,.,..,subdirectory
;directory = /home/jeichorn/cvs/pear
-directory = ../modules,../core
+directory = modules,core,plugins
;target = /you-MUST/also-change-me/to-fit/your-environment
;; template base directory (the equivalent directory of <installdir>/phpDocumentor)
diff --git a/misc/stress.sh b/misc/stress.sh
index 0127ebedac..1482fba911 100755
--- a/misc/stress.sh
+++ b/misc/stress.sh
@@ -2,4 +2,4 @@ echo "
Stress testing piwik.php
========================
"
-ab -n500 -c50 "http://localhost/dev/piwiktrunk/piwik.php?url=http%3A%2F%2Flocalhost%2Fdev%2Fpiwiktrunk%2F&action_name=&idsite=1&res=1280x1024&col=24&h=18&m=46&s=59&fla=1&dir=0&qt=1&realp=1&pdf=0&wma=1&java=1&cookie=1&title=&urlref="
+ab -n5000 -c50 "http://localhost/dev/piwiktrunk/piwik.php?url=http%3A%2F%2Flocalhost%2Fdev%2Fpiwiktrunk%2F&action_name=&idsite=1&res=1280x1024&col=24&h=18&m=46&s=59&fla=1&dir=0&qt=1&realp=1&pdf=0&wma=1&java=1&cookie=1&title=&urlref="
diff --git a/modules/API/APIable.php b/modules/API/APIable.php
index f3ce32a1fe..9a9feea6f7 100755
--- a/modules/API/APIable.php
+++ b/modules/API/APIable.php
@@ -1,4 +1,10 @@
<?php
+/**
+ * This class is the parent class of all the modules that can be called using the
+ * API Proxy.
+ *
+ * @package Piwik_API
+ */
class Piwik_Apiable
{
static public $methodsNotToPublish = array();
@@ -7,6 +13,13 @@ class Piwik_Apiable
{
}
+ /**
+ * Register a public method as "not to be published in the API".
+ * Sometimes methods have to be marked as public to be used by other classes but
+ * we don't want these methods to be called from outside the application.
+ *
+ * @param string Method name not to be published
+ */
protected function doNotPublishMethod( $methodName )
{
if(!method_exists($this, $methodName))
@@ -16,4 +29,3 @@ class Piwik_Apiable
$this->methodsNotToPublish[] = $methodName;
}
}
-?> \ No newline at end of file
diff --git a/modules/API/Proxy.php b/modules/API/Proxy.php
index f051024eee..35d2b6e0e8 100755
--- a/modules/API/Proxy.php
+++ b/modules/API/Proxy.php
@@ -1,4 +1,15 @@
<?php
+/**
+ *
+ * The API Proxy receives all the API calls requests and forwards them to the given module.
+ *
+ * It registers all the APIable modules (@see Piwik_Apiable)
+ * The class checks that a call to the API has to correct number of parameters.
+ * The proxy has the knowledge of every method available, and their parameters and default value.
+ * It also logs the calls performances (time spent, parameter values, etc.)
+ *
+ * @package Piwik_API
+ */
class Piwik_API_Proxy
{
static $classCalled = null;
@@ -21,6 +32,17 @@ class Piwik_API_Proxy
return self::$instance;
}
+ /**
+ * Registers the API information of a given module.
+ *
+ * The module to register must be
+ * - extending the Piwik_Apiable class
+ * - a singleton (providing a getInstance() method)
+ * - the API file must be located in plugins/MODULE/API.php
+ * for example plugins/Referers/API.php
+ *
+ * The method will introspect the methods, their parameters, etc.
+ */
public function registerClass( $fileName )
{
if(isset($this->alreadyRegistered[$fileName]))
@@ -96,7 +118,7 @@ class Piwik_API_Proxy
$aParameters[$nameVariable] = $defaultValue;
}
$this->api[$class][$name]['parameters'] = $aParameters;
- $this->api[$class][$name]['numberOfRequiredParameters'] = $method->getNumberOfParameters();
+ $this->api[$class][$name]['numberOfRequiredParameters'] = $method->getNumberOfRequiredParameters();
Piwik::log("- $name is public ".$this->getStrListParameters($class, $name));
}
@@ -105,6 +127,12 @@ class Piwik_API_Proxy
$this->alreadyRegistered[$fileName] = true;
}
+ /**
+ * Returns the methods $class.$name parameters (and default value if provided)
+ * as a string.
+ *
+ * Example: [ idSite, period, date = today ]
+ */
private function getStrListParameters($class, $name)
{
$aParameters = $this->getParametersList($class, $name);
@@ -112,7 +140,7 @@ class Piwik_API_Proxy
foreach($aParameters as $nameVariable=> $defaultValue)
{
$str = $nameVariable;
- if(!empty($defaultValue))
+ if($defaultValue !== Piwik_API_Proxy::NO_DEFAULT_VALUE)
{
$str .= " = $defaultValue";
}
@@ -137,11 +165,17 @@ class Piwik_API_Proxy
return $this->api[$class][$name]['parameters'];
}
+ /**
+ * Returns the number of required parameters (parameters without default values).
+ */
private function getNumberOfRequiredParameters($class, $name)
{
return $this->api[$class][$name]['numberOfRequiredParameters'];
}
+ /**
+ * Returns true if the method is found in the API
+ */
private function isMethodAvailable( $className, $methodName)
{
return isset($this->api[$className][$methodName]);
@@ -153,6 +187,9 @@ class Piwik_API_Proxy
return $this;
}
+ /**
+ *
+ */
private function checkNumberOfParametersMatch($className, $methodName, $parameters)
{
$nbParamsGiven = count($parameters);
@@ -170,6 +207,11 @@ class Piwik_API_Proxy
}
}
+ /**
+ * Checks that the class is a Singleton (presence of the getInstance() method)
+ *
+ * @throws exception If the class is not a Singleton
+ */
private function checkClassIsSingleton($className)
{
if(!method_exists($className, "getInstance"))
@@ -178,6 +220,11 @@ class Piwik_API_Proxy
}
}
+ /**
+ * Checks that the method exists in the class
+ *
+ * @throws exception If the method is not found
+ */
public function checkMethodExists($className, $methodName)
{
if(!$this->isMethodAvailable($className, $methodName))
@@ -185,12 +232,25 @@ class Piwik_API_Proxy
throw new Exception("The method '$methodName' does not exist or is not available in the module '".$className."'.");
}
}
-
- public function getClassNameFromModule($module)
+
+ /**
+ * Returns the API class name given the module name.
+ *
+ * For exemple for $module = 'Referers' it returns 'Piwik_Referers_API'
+ * Piwik_Referers_API is the class that extends Piwik_Apiable
+ * and that contains the methods to be published in the API.
+ */
+ protected function getClassNameFromModule($module)
{
$class = Piwik::prefixClass($module ."_API");
return $class;
}
+
+ /**
+ * Method always called when making an API request.
+ * It checks several things before actually calling the real method on the given module.
+ * It also logs the API calls, with the parameters values, the returned value, the performance, etc.
+ */
public function __call($methodName, $parameterValues )
{
$returnedValue = null;
@@ -228,6 +288,7 @@ class Piwik_API_Proxy
}
catch( Exception $e)
{
+ //TODO replace with nice error message
Piwik::log("<br>\n Error during API call {$className}.{$methodName}...
<br>\n => ". $e->getMessage());
@@ -238,4 +299,3 @@ class Piwik_API_Proxy
return $returnedValue;
}
}
-?> \ No newline at end of file
diff --git a/modules/API/Request.php b/modules/API/Request.php
index 96211e1bc3..58204ac631 100644
--- a/modules/API/Request.php
+++ b/modules/API/Request.php
@@ -1,7 +1,31 @@
<?php
-
+/**
+ * An API request is the object used to make a call to the API and get the result.
+ * The request has the form of a normal GET request, ie. parameter_1=X&parameter_2=Y
+ *
+ * Example:
+ * $request = new Piwik_API_Request('
+ * method=UserSettings.getWideScreen
+ * &idSite=1
+ * &date=yesterday
+ * &period=week
+ * &format=xml
+ * &filter_limit=5
+ * &filter_offset=0
+ * ');
+ * $result = $request->process();
+ * echo $result;
+ *
+ * @package Piwik_API
+ */
class Piwik_API_Request
{
+ /**
+ * @param string GET request that defines the API call (must at least contain a "method" parameter)
+ * Example: method=UserSettings.getWideScreen&idSite=1&date=yesterday&period=week&format=xml
+ * If a request is not provided, then we use the $_REQUEST superglobal and fetch
+ * the values directly from the HTTP GET query.
+ */
function __construct($request = null)
{
$requestArray = $_REQUEST;
@@ -15,6 +39,11 @@ class Piwik_API_Request
$this->requestToUse = $requestArray;
}
+ /**
+ * Returns array( $class, $method) from the given string $class.$method
+ *
+ * @return array
+ */
private function extractModuleAndMethod($parameter)
{
$a = explode('.',$parameter);
@@ -25,68 +54,92 @@ class Piwik_API_Request
return $a;
}
+ /**
+ * Handles the request to the API.
+ * It first checks that the method called (parameter 'method') is available in the module (it means that the method exists and is public)
+ * It then reads the parameters from the request string and throws an exception if there are absent parameters.
+ * It then calls the API Proxy which will call the method.
+ * If the data resulted from the API call is a Piwik_DataTable then
+ * - we apply the standard filters if the parameters have been found
+ * in the URL. For example to offset,limit the Table you can add the following parameters to any API
+ * call that returns a DataTable: filter_limit=10&filter_offset=20
+ * - we apply the filters that have been previously queued on the DataTable
+ * - we apply the renderer that generate the DataTable in a given format (XML, PHP, HTML, JSON, etc.)
+ * the format can be changed using the 'format' parameter in the request.
+ * Example: format=xml
+ *
+ * @return mixed The data resulting from the API call
+ */
public function process()
{
- // read parameters
- $moduleMethod = Piwik_Common::getRequestVar('method', null, null, $this->requestToUse);
-
- list($module, $method) = $this->extractModuleAndMethod($moduleMethod);
-
- if(!Piwik_PluginsManager::getInstance()->isPluginEnabled($module))
- {
- throw new Exception("The plugin '$module' is not enabled.");
- }
- // call the method via the PublicAPI class
- $api = Piwik_Api_Proxy::getInstance();
- $api->registerClass($module);
-
- // read method to call meta information
- $className = "Piwik_" . $module . "_API";
-
- // check method exists
- $api->checkMethodExists($className, $method);
-
- $parameters = $api->getParametersList($className, $method);
-
- $finalParameters = array();
- foreach($parameters as $name => $defaultValue)
- {
- try{
- // there is a default value specified
- if($defaultValue !== Piwik_API_Proxy::NO_DEFAULT_VALUE)
- {
- $requestValue = Piwik_Common::getRequestVar($name, $defaultValue, null, $this->requestToUse);
- }
- else
- {
- $requestValue = Piwik_Common::getRequestVar($name, null, null, $this->requestToUse);
- }
- } catch(Exception $e) {
- Piwik::error("The required variable '$name' is not correct or has not been found in the API Request. <br>\n ".var_export($this->requestToUse, true));
- }
- $finalParameters[] = $requestValue;
- }
-
- $returnedValue = call_user_func_array( array( $api->$module, $method), $finalParameters );
-
- $toReturn = $returnedValue;
-
- // If the returned value is an object DataTable we
- // apply the set of generic filters if asked in the URL
- // and we render the DataTable according to the format specified in the URL
- if($returnedValue instanceof Piwik_DataTable)
- {
- $dataTable = $returnedValue;
+ try {
+
+ // read parameters
+ $moduleMethod = Piwik_Common::getRequestVar('method', null, null, $this->requestToUse);
- $this->applyDataTableGenericFilters($dataTable);
- $dataTable->applyQueuedFilters();
- $toReturn = $this->getRenderedDataTable($dataTable);
+ list($module, $method) = $this->extractModuleAndMethod($moduleMethod);
+ if(!Piwik_PluginsManager::getInstance()->isPluginEnabled($module))
+ {
+ throw new Exception("The plugin '$module' is not enabled.");
+ }
+ // call the method via the PublicAPI class
+ $api = Piwik_Api_Proxy::getInstance();
+ $api->registerClass($module);
+
+ // read method to call meta information
+ $className = "Piwik_" . $module . "_API";
+
+ // check method exists
+ $api->checkMethodExists($className, $method);
+
+ $parameters = $api->getParametersList($className, $method);
+
+ $finalParameters = array();
+ foreach($parameters as $name => $defaultValue)
+ {
+ try{
+ // there is a default value specified
+ if($defaultValue !== Piwik_API_Proxy::NO_DEFAULT_VALUE)
+ {
+ $requestValue = Piwik_Common::getRequestVar($name, $defaultValue, null, $this->requestToUse);
+ }
+ else
+ {
+ $requestValue = Piwik_Common::getRequestVar($name, null, null, $this->requestToUse);
+ }
+ } catch(Exception $e) {
+ Piwik::error("The required variable '$name' is not correct or has not been found in the API Request. <br>\n ".var_export($this->requestToUse, true));
+ }
+ $finalParameters[] = $requestValue;
+ }
+
+ $returnedValue = call_user_func_array( array( $api->$module, $method), $finalParameters );
+
+ $toReturn = $returnedValue;
+
+ // If the returned value is an object DataTable we
+ // apply the set of generic filters if asked in the URL
+ // and we render the DataTable according to the format specified in the URL
+ if($returnedValue instanceof Piwik_DataTable)
+ {
+ $dataTable = $returnedValue;
+
+ $this->applyDataTableGenericFilters($dataTable);
+ $dataTable->applyQueuedFilters();
+ $toReturn = $this->getRenderedDataTable($dataTable);
+
+ }
+ } catch(Exception $e ) {
+ $toReturn = 'XML ERROR TEMPLATE TODO';
}
-
return $toReturn;
}
+ /**
+ * Apply the specified renderer to the DataTable
+ * @return Piwik_DataTable
+ */
protected function getRenderedDataTable($dataTable)
{
// Renderer
@@ -98,6 +151,10 @@ class Piwik_API_Request
return $toReturn;
}
+ /**
+ * Applys generic filters to the DataTable object resulting from the API Call.
+ * @return void
+ */
protected function applyDataTableGenericFilters($dataTable)
{
@@ -111,20 +168,20 @@ class Piwik_API_Request
*/
$genericFilters = array(
'Pattern' => array(
- 'filter_column' => 'string',
- 'filter_pattern' => 'string',
+ 'filter_column' => array('string'),
+ 'filter_pattern' => array('string'),
),
'ExcludeLowPopulation' => array(
- 'filter_excludelowpop' => 'string',
- 'filter_excludelowpop_value' => 'float',
+ 'filter_excludelowpop' => array('string'),
+ 'filter_excludelowpop_value'=> array('float'),
),
'Sort' => array(
- 'filter_sort_column' => 'string',
- 'filter_sort_order' => 'string',
+ 'filter_sort_column' => array('string', Piwik_Archive::INDEX_NB_VISITS),
+ 'filter_sort_order' => array('string', 'desc'),
),
'Limit' => array(
- 'filter_offset' => 'integer',
- 'filter_limit' => 'integer',
+ 'filter_offset' => array('integer'),
+ 'filter_limit' => array('integer'),
),
);
@@ -133,10 +190,20 @@ class Piwik_API_Request
$filterParameters = array();
$exceptionRaised = false;
- foreach($parameters as $name => $type)
+ foreach($parameters as $name => $info)
{
+ // parameter type to cast to
+ $type = $info[0];
+
+ // default value if specified, when the parameter doesn't have a value
+ $defaultValue = null;
+ if(isset($info[1]))
+ {
+ $defaultValue = $info[1];
+ }
+
try {
- $value = Piwik_Common::getRequestVar($name, null, null, $this->requestToUse);
+ $value = Piwik_Common::getRequestVar($name, $defaultValue, $type, $this->requestToUse);
settype($value, $type);
$filterParameters[] = $value;
}
diff --git a/modules/Access.php b/modules/Access.php
index 6de0673257..28c44103a9 100755
--- a/modules/Access.php
+++ b/modules/Access.php
@@ -138,4 +138,3 @@ class Piwik_Access
}
}
-?> \ No newline at end of file
diff --git a/modules/ArchiveProcessing.php b/modules/ArchiveProcessing.php
index 46b8628870..beac05210d 100644
--- a/modules/ArchiveProcessing.php
+++ b/modules/ArchiveProcessing.php
@@ -295,4 +295,4 @@ abstract class Piwik_ArchiveProcessing
}
}
-?>
+
diff --git a/modules/ArchiveProcessing/Day.php b/modules/ArchiveProcessing/Day.php
index 4e17c58fbd..a38e2dcb2c 100644
--- a/modules/ArchiveProcessing/Day.php
+++ b/modules/ArchiveProcessing/Day.php
@@ -1,4 +1,13 @@
<?php
+/**
+ * Handles the archiving process for a day.
+ * The class provides generic methods to manipulate data from the DB, easily create Piwik_DataTable objects.
+ *
+ * All the logic of the archiving is done inside the plugins listening to the event 'ArchiveProcessing_Day.compute'
+ *
+ * @package Piwik_ArchiveProcessing
+ *
+ */
class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
{
@@ -181,4 +190,5 @@ class Piwik_ArchiveProcessing_Day extends Piwik_ArchiveProcessing
$oldRowToUpdate[Piwik_Archive::INDEX_BOUNCE_COUNT] += $newRowToAdd[Piwik_Archive::INDEX_BOUNCE_COUNT];
}
}
-?>
+
+
diff --git a/modules/ArchiveProcessing/Period.php b/modules/ArchiveProcessing/Period.php
index f08726daba..ce40097478 100644
--- a/modules/ArchiveProcessing/Period.php
+++ b/modules/ArchiveProcessing/Period.php
@@ -1,5 +1,7 @@
<?php
-
+/**
+ * @package Piwik_ArchiveProcessing
+ */
class Piwik_ArchiveProcessing_Period extends Piwik_ArchiveProcessing
{
function __construct()
diff --git a/modules/ArchiveProcessing/Record.php b/modules/ArchiveProcessing/Record.php
index aa775025fd..fa65d6b6bf 100644
--- a/modules/ArchiveProcessing/Record.php
+++ b/modules/ArchiveProcessing/Record.php
@@ -1,5 +1,43 @@
<?php
+/**
+ * A Record is a tuple (name, value) to be saved in the database.
+ * At its creation, the record registers itself to the RecordManager.
+ * The record will then be automatically saved in the DB once the Archiving process is finished.
+ *
+ * We have two record types available:
+ * - numeric ; the value will be saved as float in the DB.
+ * It should be used for INTEGER, FLOAT
+ * - blob ; the value will be saved in a binary field in the DB
+ * It should be used for all the other types: PHP variables, STRING, serialized OBJECTS or ARRAYS, etc.
+ *
+ * @package Piwik_ArchiveProcessing
+ * @subpackage Piwik_ArchiveProcessing_Record
+ */
+
+abstract class Piwik_ArchiveProcessing_Record
+{
+ public $name;
+ public $value;
+
+ function __construct( $name, $value)
+ {
+ $this->name = $name;
+ $this->value = $value;
+ Piwik_ArchiveProcessing_Record_Manager::getInstance()->registerRecord($this);
+ }
+ public function delete()
+ {
+ Piwik_ArchiveProcessing_Record_Manager::getInstance()->unregister($this);
+ }
+ public function __destruct()
+ {
+ }
+}
+/**
+ *
+ * @subpackage Piwik_ArchiveProcessing_Record
+ */
class Piwik_ArchiveProcessing_Record_Manager
{
protected $records = array();
@@ -17,16 +55,30 @@ class Piwik_ArchiveProcessing_Record_Manager
return self::$instance;
}
+ /**
+ * Method called by Record objects to register themselves.
+ * All records registered here will be saved in the DB at the end of the archiving process.
+ * @return void
+ */
public function registerRecord( $record )
{
$this->records[$record->name] = $record;
}
+ /**
+ * Removes a record from the Record Manager.
+ *
+ * @return void
+ */
public function unregister( $deleteRecord )
{
unset($this->records[$deleteRecord->name]);
}
+ /**
+ * Returns a string containing the "name : value" of the record
+ * @return string
+ */
public function toString()
{
$str = '';
@@ -37,16 +89,26 @@ class Piwik_ArchiveProcessing_Record_Manager
return $str;
}
+ /**
+ * @return string
+ */
public function __toString()
{
return $this->toString();
}
+ /**
+ * @return array of Records
+ */
public function getRecords()
{
return $this->records;
}
+ /**
+ * Delete all records saved in the Manager.
+ * @return void
+ */
public function deleteAll()
{
foreach($this->records as $key => $record)
@@ -56,27 +118,13 @@ class Piwik_ArchiveProcessing_Record_Manager
$this->records = array();
}
}
-
-abstract class Piwik_ArchiveProcessing_Record
-{
- public $name;
- public $value;
-
- function __construct( $name, $value)
- {
- $this->name = $name;
- $this->value = $value;
- Piwik_ArchiveProcessing_Record_Manager::getInstance()->registerRecord($this);
- }
- public function delete()
- {
- Piwik_ArchiveProcessing_Record_Manager::getInstance()->unregister($this);
- }
- public function __destruct()
- {
- }
-}
-
+
+/**
+ * Numeric record.
+ * Example: $record = new Piwik_ArchiveProcessing_Record_Numeric('nb_visitors_live', 15);
+ *
+ * @subpackage Piwik_ArchiveProcessing_Record
+ */
class Piwik_ArchiveProcessing_Record_Numeric extends Piwik_ArchiveProcessing_Record
{
function __construct( $name, $value)
@@ -90,7 +138,12 @@ class Piwik_ArchiveProcessing_Record_Numeric extends Piwik_ArchiveProcessing_Rec
}
}
-
+/**
+ * Blob record.
+ * Example: $record = new Piwik_ArchiveProcessing_Record_Blob('visitor_names', serialize(array('piwik-fan', 'php', 'stevie-vibes')));
+ * The value will be compressed before being saved in the DB.
+ * @subpackage Piwik_ArchiveProcessing_Record
+ */
class Piwik_ArchiveProcessing_Record_Blob extends Piwik_ArchiveProcessing_Record
{
public $name;
@@ -107,6 +160,26 @@ class Piwik_ArchiveProcessing_Record_Blob extends Piwik_ArchiveProcessing_Record
}
+/**
+ * Array of blob records.
+ * Useful for easily saving splited data in the DB.
+ *
+ * Example: $record = new Piwik_ArchiveProcessing_Record_Blob_Array(
+ * 'veryLongBook',
+ * 0 => serialize( array( '1st chapter very long, 6MB of data we dont want to save' )),
+ * 1 => serialize( array( '2nd chapter very long, 8MB of data we dont want to save' )),
+ * 2 => serialize( array( '3rd chapter very long, 7MB of data we dont want to save' )),
+ * 3 => serialize( array( '4th chapter very long, 10MB of data we dont want to save' )),
+ * );
+ *
+ * Will be saved in the DB as
+ * veryLongBook => X
+ * veryLongBook_1 => Y
+ * veryLongBook_2 => Z
+ * veryLongBook_3 => M
+ *
+ * @subpackage Piwik_ArchiveProcessing_Record
+ */
class Piwik_ArchiveProcessing_Record_Blob_Array extends Piwik_ArchiveProcessing_Record
{
public $name;
@@ -137,8 +210,7 @@ class Piwik_ArchiveProcessing_Record_Blob_Array extends Piwik_ArchiveProcessing_
{
throw new Exception( 'Not valid' );
}
-
}
-?>
+
diff --git a/modules/Auth.php b/modules/Auth.php
index 982ec466bb..49cecc573d 100644
--- a/modules/Auth.php
+++ b/modules/Auth.php
@@ -43,4 +43,5 @@ class Piwik_Auth extends Zend_Auth_Adapter_DbTable
}
}
-?>
+
+
diff --git a/modules/Common.php b/modules/Common.php
index 152c177938..d4101569fb 100644
--- a/modules/Common.php
+++ b/modules/Common.php
@@ -522,4 +522,5 @@ class Piwik_Common
}
}
-?>
+
+
diff --git a/modules/Config.php b/modules/Config.php
index ef1861fc2b..ff31e16e56 100755
--- a/modules/Config.php
+++ b/modules/Config.php
@@ -28,4 +28,4 @@ class Piwik_Config extends Zend_Config_Ini
Zend_Registry::set('tablesPrefix', $this->database->tables_prefix);
}
}
-?>
+
diff --git a/modules/DataFiles/Browsers.php b/modules/DataFiles/Browsers.php
index 842fadd891..53bdb89ec5 100644
--- a/modules/DataFiles/Browsers.php
+++ b/modules/DataFiles/Browsers.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Browser list
+ *
+ * @package Piwik_DataFiles
+ */
if(!isset($GLOBALS['Piwik_BrowserList'] ))
{
$GLOBALS['Piwik_BrowserList'] = array(
diff --git a/modules/DataFiles/Countries.php b/modules/DataFiles/Countries.php
index c0ba474657..38a0b48067 100644
--- a/modules/DataFiles/Countries.php
+++ b/modules/DataFiles/Countries.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Country code and continent database
+ *
+ * @package Piwik_DataFiles
+ */
if(!isset($GLOBALS['Piwik_CountryList']))
{
$GLOBALS['Piwik_CountryList'] = array(
@@ -222,4 +227,4 @@ if(!isset($GLOBALS['Piwik_CountryList']))
'zw' => array('afr'),
);
}
-?>
+
diff --git a/modules/DataFiles/OS.php b/modules/DataFiles/OS.php
index 99517e91aa..b68eafb8cb 100644
--- a/modules/DataFiles/OS.php
+++ b/modules/DataFiles/OS.php
@@ -1,4 +1,9 @@
<?php
+/**
+ * Operating systems database
+ *
+ * @package Piwik_DataFiles
+ */
if(!isset($GLOBALS['Piwik_Oslist']))
{
$GLOBALS['Piwik_Oslist'] = array(
diff --git a/modules/DataFiles/SearchEngines.php b/modules/DataFiles/SearchEngines.php
index f88a8ad7d3..aa49183e5a 100644
--- a/modules/DataFiles/SearchEngines.php
+++ b/modules/DataFiles/SearchEngines.php
@@ -1,5 +1,20 @@
<?php
-
+/**
+ * Search Engine database
+ *
+ * Detail of a line:
+ * Url => array( SearchEngineName, VariableKeyword, [charset used by the search engine])
+ *
+ * The main search engine URL has to be at the top of the list for the given search Engine.
+ *
+ * You can add new search engines icons by adding the icon
+ * in the plugins/Referers/images/SearchEngines directory
+ * using the format "mainSearchEngineUrl.png". Example: www.google.com.png
+ *
+ * Post your new search engines and logos in the forum, thank you for your help!
+ *
+ * @package Piwik_DataFiles
+ */
if(!isset($GLOBALS['Piwik_SearchEngines'] ))
{
$GLOBALS['Piwik_SearchEngines'] = array(
@@ -1047,4 +1062,4 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
}
}
-?>
+
diff --git a/modules/DataTable.php b/modules/DataTable.php
index c0cb2c312c..c14a6040ed 100644
--- a/modules/DataTable.php
+++ b/modules/DataTable.php
@@ -527,4 +527,3 @@ function Piwik_DataTable_orderRowByLabel($o1,$o2)
* [ keyword2, +1000% ]
* [ keyword3, -430% ]
*/
-?> \ No newline at end of file
diff --git a/modules/DataTable/Filter.php b/modules/DataTable/Filter.php
index d3a09464d2..11bc2ebf56 100644
--- a/modules/DataTable/Filter.php
+++ b/modules/DataTable/Filter.php
@@ -1,5 +1,18 @@
<?php
-
+/**
+ * A filter is applied instantly to a given DataTable and can
+ * - remove rows
+ * - change columns values
+ * - add/remove columns or details
+ * - add/remove/edit sub DataTable associated to some rows
+ * - whatever your imagination wants :)
+ *
+ * The concept is very simple: the filter is given the DataTable
+ * and can do whatever is necessary on the data (in the filter() method).
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
+ */
abstract class Piwik_DataTable_Filter
{
protected $table;
@@ -16,13 +29,13 @@ abstract class Piwik_DataTable_Filter
abstract protected function filter();
}
-require_once "DataTable/Filter/Limit.php";
-require_once "DataTable/Filter/Pattern.php";
-require_once "DataTable/Filter/Sort.php";
-require_once "DataTable/Filter/Empty.php";
require_once "DataTable/Filter/ColumnCallback.php";
-require_once "DataTable/Filter/ColumnCallbackReplace.php";
require_once "DataTable/Filter/ColumnCallbackAddDetail.php";
+require_once "DataTable/Filter/ColumnCallbackReplace.php";
require_once "DataTable/Filter/DetailCallbackAddDetail.php";
+require_once "DataTable/Filter/Empty.php";
require_once "DataTable/Filter/ExcludeLowPopulation.php";
+require_once "DataTable/Filter/Limit.php";
+require_once "DataTable/Filter/Pattern.php";
require_once "DataTable/Filter/ReplaceColumnNames.php";
+require_once "DataTable/Filter/Sort.php";
diff --git a/modules/DataTable/Filter/ColumnCallback.php b/modules/DataTable/Filter/ColumnCallback.php
index 78ac773979..6c2bb12c82 100644
--- a/modules/DataTable/Filter/ColumnCallback.php
+++ b/modules/DataTable/Filter/ColumnCallback.php
@@ -1,7 +1,9 @@
<?php
-
/**
- * Delete all rows of when a given function returns false for a given column
+ * Delete all rows of when a given function returns false for a given column.
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
*/
class Piwik_DataTable_Filter_ColumnCallback extends Piwik_DataTable_Filter
{
diff --git a/modules/DataTable/Filter/ColumnCallbackAddDetail.php b/modules/DataTable/Filter/ColumnCallbackAddDetail.php
index 4668303f1f..742892b199 100644
--- a/modules/DataTable/Filter/ColumnCallbackAddDetail.php
+++ b/modules/DataTable/Filter/ColumnCallbackAddDetail.php
@@ -4,9 +4,14 @@
* Add a new column to the table based on the value resulting
* from a callback function with the parameter being another column's value
*
- * For example from the "label" column we want to create a "short label" column
- * that is a shorter text.
+ * For example from the "label" column we can to create a "short label" column
+ * that is a shorter version of the label.
+ *
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
*/
+
class Piwik_DataTable_Filter_ColumnCallbackAddDetail extends Piwik_DataTable_Filter
{
private $columnToRead;
diff --git a/modules/DataTable/Filter/ColumnCallbackReplace.php b/modules/DataTable/Filter/ColumnCallbackReplace.php
index e52b54e320..76f0c0cc81 100644
--- a/modules/DataTable/Filter/ColumnCallbackReplace.php
+++ b/modules/DataTable/Filter/ColumnCallbackReplace.php
@@ -1,7 +1,10 @@
<?php
-
/**
- * Replace a column value with a new value resulting from the function call
+ * Replace a column value with a new value resulting
+ * from the function called with the column's value
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
*/
class Piwik_DataTable_Filter_ColumnCallbackReplace extends Piwik_DataTable_Filter
{
diff --git a/modules/DataTable/Filter/DetailCallbackAddDetail.php b/modules/DataTable/Filter/DetailCallbackAddDetail.php
index 67a53d0983..9c6b50fb6e 100644
--- a/modules/DataTable/Filter/DetailCallbackAddDetail.php
+++ b/modules/DataTable/Filter/DetailCallbackAddDetail.php
@@ -1,12 +1,14 @@
<?php
-
/**
* Add a new detail to the table based on the value resulting
* from a callback function with the parameter being another detail's value
*
* For example for the searchEngine we have a "details" information that gives
* the URL of the search engine. We use this URL to add a new "details" that gives
- * the path of the logo for this search engine URL.
+ * the path of the logo for this search engine URL (which has the format URL.png).
+
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
*/
class Piwik_DataTable_Filter_DetailCallbackAddDetail extends Piwik_DataTable_Filter
{
diff --git a/modules/DataTable/Filter/Empty.php b/modules/DataTable/Filter/Empty.php
index 6e76a402da..a7462f11ca 100644
--- a/modules/DataTable/Filter/Empty.php
+++ b/modules/DataTable/Filter/Empty.php
@@ -1,5 +1,10 @@
<?php
-
+/**
+ * Empty filter template.
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
+ */
class Piwik_DataTable_Filter_Empty extends Piwik_DataTable_Filter
{
@@ -16,4 +21,4 @@ class Piwik_DataTable_Filter_Empty extends Piwik_DataTable_Filter
}
}
}
-?>
+
diff --git a/modules/DataTable/Filter/ExcludeLowPopulation.php b/modules/DataTable/Filter/ExcludeLowPopulation.php
index d7630ea1ed..efa63fcde7 100644
--- a/modules/DataTable/Filter/ExcludeLowPopulation.php
+++ b/modules/DataTable/Filter/ExcludeLowPopulation.php
@@ -1,4 +1,13 @@
<?php
+/**
+ * Delete all rows that have a $columnToFilter value less than the $minimumValue
+ * For example we delete from the countries report table all countries that have less than 3 visits.
+ * It is very useful to exclude noise from the reports.
+ * You can obviously apply this filter on a percentaged column, eg. remove all countries with the column 'percent_visits' less than 0.05
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
+ */
class Piwik_DataTable_Filter_ExcludeLowPopulation extends Piwik_DataTable_Filter
{
static public $minimumValue;
@@ -27,4 +36,4 @@ class Piwik_DataTable_Filter_ExcludeLowPopulation extends Piwik_DataTable_Filter
return $value >= self::$minimumValue;
}
}
-?>
+
diff --git a/modules/DataTable/Filter/Limit.php b/modules/DataTable/Filter/Limit.php
index 6ec00244a5..ec50762844 100644
--- a/modules/DataTable/Filter/Limit.php
+++ b/modules/DataTable/Filter/Limit.php
@@ -1,5 +1,10 @@
<?php
-
+/**
+ * Delete all rows from the table that are not in the offset,offset+limit range
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
+ */
class Piwik_DataTable_Filter_Limit extends Piwik_DataTable_Filter
{
@@ -27,4 +32,4 @@ class Piwik_DataTable_Filter_Limit extends Piwik_DataTable_Filter
}
}
-?>
+
diff --git a/modules/DataTable/Filter/Pattern.php b/modules/DataTable/Filter/Pattern.php
index 52c1ff46bf..849ddc5c36 100644
--- a/modules/DataTable/Filter/Pattern.php
+++ b/modules/DataTable/Filter/Pattern.php
@@ -1,5 +1,12 @@
<?php
-
+/**
+ * Delete all rows for which the given $columnToFilter do not contain the $patternToSearch
+ * This filter is to be used on columns containing strings.
+ * Exemple: fron the keyword report, keep only the rows for which the label contains "piwik"
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
+ */
class Piwik_DataTable_Filter_Pattern extends Piwik_DataTable_Filter
{
private $columnToFilter;
@@ -24,4 +31,4 @@ class Piwik_DataTable_Filter_Pattern extends Piwik_DataTable_Filter
}
}
}
-?>
+
diff --git a/modules/DataTable/Filter/ReplaceColumnNames.php b/modules/DataTable/Filter/ReplaceColumnNames.php
index 6309b16938..8ae60e50bb 100644
--- a/modules/DataTable/Filter/ReplaceColumnNames.php
+++ b/modules/DataTable/Filter/ReplaceColumnNames.php
@@ -1,7 +1,18 @@
<?php
-
/**
- * Delete all rows of when a given function returns false for a given column
+ * This filter replaces column names using a mapping table that maps from the old name to the new name.
+ *
+ * Why this filter?
+ * For saving bytes in the database, you can change all the columns labels by an integer value.
+ * Exemple instead of saving 10000 rows with the column name 'nb_unique_visitors' which would cost a lot of memory,
+ * we map it to the integer 1 before saving in the DB.
+ * After selecting the DataTable from the DB though, you need to restore back the real names so that
+ * it shows nicely in the report (XML for example).
+ *
+ * You can specify the mapping array to apply in the constructor.
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
*/
class Piwik_DataTable_Filter_ReplaceColumnNames extends Piwik_DataTable_Filter
{
@@ -16,7 +27,13 @@ class Piwik_DataTable_Filter_ReplaceColumnNames extends Piwik_DataTable_Filter
Piwik_Archive::INDEX_SUM_VISIT_LENGTH => 'sum_visit_length',
Piwik_Archive::INDEX_BOUNCE_COUNT => 'bounce_count',
);
-
+ /**
+ * @param DataTable Table
+ * @param array Mapping to apply. Must have the format
+ * array( OLD_COLUMN_NAME => NEW_COLUMN NAME,
+ * OLD_COLUMN_NAME2 => NEW_COLUMN NAME2,
+ * )
+ */
public function __construct( $table, $mappingToApply = null )
{
parent::__construct($table);
diff --git a/modules/DataTable/Filter/Sort.php b/modules/DataTable/Filter/Sort.php
index a5c2463505..f4c6b24061 100644
--- a/modules/DataTable/Filter/Sort.php
+++ b/modules/DataTable/Filter/Sort.php
@@ -1,5 +1,10 @@
<?php
-
+/**
+ * Sort the DataTable based on the value of column $columnToSort ordered by $order.
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter
+ */
class Piwik_DataTable_Filter_Sort extends Piwik_DataTable_Filter
{
private $columnToSort;
@@ -51,4 +56,4 @@ class Piwik_DataTable_Filter_Sort extends Piwik_DataTable_Filter
$this->table->sort( array($this,"sort") );
}
}
-?>
+
diff --git a/modules/DataTable/Manager.php b/modules/DataTable/Manager.php
index cc93c61089..a7647d652d 100644
--- a/modules/DataTable/Manager.php
+++ b/modules/DataTable/Manager.php
@@ -1,5 +1,10 @@
<?php
-
+/**
+ * The DataTable_Manager registers all the instanciated DataTable and provides an
+ * easy way to access them.
+ *
+ * @package Piwik_DataTable
+ */
class Piwik_DataTable_Manager
{
static private $instance = null;
@@ -19,14 +24,24 @@ class Piwik_DataTable_Manager
protected $tables = array();
protected $count = 0;
- function addTable( $table )
+ /**
+ * Add a DataTable to the registry
+ */
+ public function addTable( $table )
{
$this->tables[] = $table;
$this->count++;
return $this->count;
}
- function getTable( $idTable )
+ /**
+ * Returns the DataTable associated to the ID $idTable.
+ * NB: The datatable has to have been instanciated before!
+ * This method will not fetch the DataTable from the DB.
+ *
+ * @exception If the table can't be found
+ */
+ public function getTable( $idTable )
{
// the array tables is indexed at 0
// but the index is computed as the count() of the array after inserting the table
@@ -40,15 +55,21 @@ class Piwik_DataTable_Manager
return $this->tables[$idTable];
}
- function deleteAll()
+ /**
+ * Delete all the registered DataTables
+ */
+ public function deleteAll()
{
Piwik::log("DELETE ALL ".$this->count()." TABLES");
$this->tables = array();
}
+ /**
+ * Returns the number of DataTable currently registered.
+ */
function count()
{
return count($this->tables);
}
}
-?>
+
diff --git a/modules/DataTable/Renderer.php b/modules/DataTable/Renderer.php
index a9a3a7412b..4e921d2386 100644
--- a/modules/DataTable/Renderer.php
+++ b/modules/DataTable/Renderer.php
@@ -1,6 +1,11 @@
<?php
-
-class Piwik_DataTable_Renderer
+/**
+ * A DataTable Renderer can produce an output given a DataTable object.
+ * All new Renderers must be copied in DataTable/Renderer and added to the factory() method.
+ *
+ * @package Piwik_DataTable
+ */
+abstract class Piwik_DataTable_Renderer
{
protected $table;
@@ -12,6 +17,22 @@ class Piwik_DataTable_Renderer
}
}
+ /**
+ * Computes the output and returns the string/binary
+ */
+ abstract public function render();
+
+ /**
+ * @see render()
+ */
+ public function __toString()
+ {
+ return $this->render();
+ }
+
+ /**
+ * Set the DataTable to be rendered
+ */
public function setTable($table)
{
if(!($table instanceof Piwik_DataTable))
@@ -21,11 +42,10 @@ class Piwik_DataTable_Renderer
$this->table = $table;
}
- public function __toString()
- {
- return $this->render();
- }
-
+ /**
+ * Returns the DataTable associated to the output format $name
+ * @exception If the renderer is unknown
+ */
static public function factory( $name )
{
$name = strtolower($name);
@@ -66,4 +86,4 @@ class Piwik_DataTable_Renderer
}
-?>
+
diff --git a/modules/DataTable/Renderer/Console.php b/modules/DataTable/Renderer/Console.php
index 3375bb52fe..e6a4b82980 100644
--- a/modules/DataTable/Renderer/Console.php
+++ b/modules/DataTable/Renderer/Console.php
@@ -1,5 +1,10 @@
<?php
-
+/**
+ * Simple output
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Renderer
+ */
class Piwik_DataTable_Renderer_Console extends Piwik_DataTable_Renderer
{
protected $prefixRows;
@@ -65,4 +70,4 @@ class Piwik_DataTable_Renderer_Console extends Piwik_DataTable_Renderer
}
}
-?>
+
diff --git a/modules/DataTable/Renderer/HTML.php b/modules/DataTable/Renderer/HTML.php
index 0e27fc25bd..d948766710 100644
--- a/modules/DataTable/Renderer/HTML.php
+++ b/modules/DataTable/Renderer/HTML.php
@@ -1,5 +1,11 @@
<?php
+/**
+ * Simple HTML output
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Renderer
+ */
class Piwik_DataTable_Renderer_HTML extends Piwik_DataTable_Renderer
{
protected $prefixRows;
@@ -34,6 +40,7 @@ class Piwik_DataTable_Renderer_HTML extends Piwik_DataTable_Renderer
$allColumns = array();
foreach($table->getRows() as $row)
{
+ //TODO put that in a Simple_PHP filter that will make it easy as well to export in CSV
foreach($row->getColumns() as $column => $value)
{
$allColumns[$column] = true;
@@ -123,4 +130,5 @@ class Piwik_DataTable_Renderer_HTML extends Piwik_DataTable_Renderer
}
}
-?>
+
+
diff --git a/modules/DataTable/Renderer/PHP.php b/modules/DataTable/Renderer/PHP.php
index 228275fea0..3708431fe2 100644
--- a/modules/DataTable/Renderer/PHP.php
+++ b/modules/DataTable/Renderer/PHP.php
@@ -1,4 +1,12 @@
<?php
+
+/**
+ * Returns the equivalent PHP array of the DataTable.
+ * You can specify in the constructor if you want the serialized version.
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Renderer
+ */
class Piwik_DataTable_Renderer_PHP extends Piwik_DataTable_Renderer
{
protected $serialize;
diff --git a/modules/DataTable/Renderer/XML.php b/modules/DataTable/Renderer/XML.php
index 0d6ebef305..90f03f46af 100644
--- a/modules/DataTable/Renderer/XML.php
+++ b/modules/DataTable/Renderer/XML.php
@@ -1,5 +1,12 @@
<?php
+/**
+ * XML export. Using the excellent Pear::XML_Serializer.
+ * We had to fix the PEAR library so that it works under PHP5 STRICT mode.
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Renderer
+ */
require_once "DataTable/Renderer/PHP.php";
class Piwik_DataTable_Renderer_XML extends Piwik_DataTable_Renderer
{
diff --git a/modules/DataTable/Row.php b/modules/DataTable/Row.php
index adc3c20665..8fac27225f 100644
--- a/modules/DataTable/Row.php
+++ b/modules/DataTable/Row.php
@@ -1,8 +1,18 @@
<?php
/**
- * IMPORTANT: A column named 'label' must not be composed only of the characters [0-9.]
- * Otherwise the methods to addDataTable, sumRow, etc. would fail because they would consider
- * the label as being a column to sum
+ * A DataTable is composed by rows.
+ * A row is composed by
+ * - columns often at least a 'label' column containing the description
+ * of the row, and some numeric values ('nb_visits', etc.)
+ * - details: other information never to be shown as "columns")
+ * - idSubtable: a row can be linked to a SubTable
+ *
+ * IMPORTANT: Make sure that the column named 'label' contains at least one non-numeric character.
+ * Otherwise the method addDataTable() or sumRow() would fail because they would consider
+ * the 'label' as being a numeric column to sum.
+ *
+ * @package Piwik_DataTable
+ *
*/
class Piwik_DataTable_Row
{
@@ -52,6 +62,9 @@ class Piwik_DataTable_Row
}
}
+ /**
+ * When destroyed, a row destroys its associated subTable if there is one
+ */
public function __destruct()
{
$idSubtable = $this->getIdSubDataTable();
@@ -61,6 +74,11 @@ class Piwik_DataTable_Row
}
}
+ /**
+ * Returns the given column
+ * @param string Column name
+ * @return mixed|false The column value
+ */
public function getColumn( $name )
{
if(!isset($this->c[self::COLUMNS][$name]))
@@ -70,26 +88,51 @@ class Piwik_DataTable_Row
return $this->c[self::COLUMNS][$name];
}
+ /**
+ * Returns the given detail
+ * @param string Detail name
+ * @return mixed|false The detail value
+ */
+ public function getDetail( $name )
+ {
+ if(!isset($this->c[self::DETAILS][$name]))
+ {
+ return false;
+ }
+ return $this->c[self::DETAILS][$name];
+ }
+
+ /**
+ * Returns the array of columns
+ *
+ * @return array array(
+ * 'column1' => VALUE,
+ * 'label' => 'www.php.net'
+ * 'nb_visits' => 15894,
+ * )
+ */
public function getColumns()
{
return $this->c[self::COLUMNS];
}
+ /**
+ * Returns the array of details
+ *
+ * @return array array(
+ * 'logo' => 'images/logo/www.google.png',
+ * 'url' => 'www.google.com'
+ * )
+ */
public function getDetails()
{
return $this->c[self::DETAILS];
}
- public function getDetail( $name )
- {
- if(!isset($this->c[self::DETAILS][$name]))
- {
- return false;
- }
- return $this->c[self::DETAILS][$name];
- }
-
/**
+ * Returns the ID of the subDataTable.
+ * If there is no such a table, returns null.
+ *
* @return int|null
*/
public function getIdSubDataTable()
@@ -97,6 +140,12 @@ class Piwik_DataTable_Row
return $this->c[self::DATATABLE_ASSOCIATED];
}
+ /**
+ * Sums a DataTable to this row subDataTable.
+ * If this row doesn't have a SubDataTable yet, we create a new one.
+ * Then we add the values of the given DataTable to this row's DataTable
+ * @see addDataTable() for the summing algorithm
+ */
public function sumSubtable(Piwik_DataTable $subTable)
{
$thisSubtableID = $this->getIdSubDataTable();
@@ -113,15 +162,6 @@ class Piwik_DataTable_Row
$thisSubTable->addDataTable($subTable);
}
- /**
- * Adds a subtable to a row.
- *
- */
- public function addSubtable(Piwik_DataTable $subTable)
- {
- $this->checkNoSubTable();
- $this->c[self::DATATABLE_ASSOCIATED] = $subTable->getId();
- }
protected function checkNoSubTable()
{
@@ -132,21 +172,51 @@ class Piwik_DataTable_Row
}
+ /**
+ * Set a DataTable to be associated to this row.
+ * If the row already has a DataTable associated to it, throws an Exception.
+ * @throws Exception
+ *
+ */
+ public function addSubtable(Piwik_DataTable $subTable)
+ {
+ $this->checkNoSubTable();
+ $this->c[self::DATATABLE_ASSOCIATED] = $subTable->getId();
+ }
+
+ /**
+ * Set a DataTable to this row. If there is already
+ * a DataTable associated, it is simply overwritten.
+ */
public function setSubtable(Piwik_DataTable $subTable)
{
$this->c[self::DATATABLE_ASSOCIATED] = $subTable->getId();
}
+ /**
+ * Set all the columns at once.
+ * @param array array(
+ * 'label' => 'www.php.net'
+ * 'nb_visits' => 15894,
+ * )
+ */
public function setColumns( $columns )
{
$this->c[self::COLUMNS] = $columns;
}
+ /**
+ * Set the $value value to the column named $name
+ */
public function setColumn($name, $value)
{
$this->c[self::COLUMNS][$name] = $value;
}
+ /**
+ * Add a new column to the row. If the column already exist, throw an exception
+ * @throws Exception
+ */
public function addColumn($name, $value)
{
if(isset($this->c[self::COLUMNS][$name]))
@@ -156,6 +226,11 @@ class Piwik_DataTable_Row
$this->c[self::COLUMNS][$name] = $value;
}
+
+ /**
+ * Add a new detail to the row. If the column already exist, throw an exception
+ * @throws Exception
+ */
public function addDetail($name, $value)
{
if(isset($this->c[self::DETAILS][$name]))
@@ -192,8 +267,11 @@ class Piwik_DataTable_Row
/**
- * 2rows are equal is exact same columns / details
- * and if subtable is there then subtable has to be the same!
+ * Helper function to test if two rows are equal.
+ *
+ * Two rows are equal
+ * - if they have exactly the same columns / details
+ * - if they have a subDataTable associated and that both of them are exactly the same.
*/
static public function isEqual( $row1, $row2 )
{
@@ -240,4 +318,4 @@ class Piwik_DataTable_Row
}
require_once "Row/DataTableSummary.php";
-?>
+
diff --git a/modules/DataTable/Row/DataTableSummary.php b/modules/DataTable/Row/DataTableSummary.php
index 6881c6b8d6..0dceb67c8f 100644
--- a/modules/DataTable/Row/DataTableSummary.php
+++ b/modules/DataTable/Row/DataTableSummary.php
@@ -1,5 +1,15 @@
<?php
-
+/**
+ * This class creates a row from a given DataTable.
+ * The row contains
+ * - for each numeric column, the resulting "summary" column is the sum of all the subRows
+ * - for every other column, it is ignored and will not be in the "summary row"
+ *
+ * @see Piwik_DataTable_Row::sumRow() for more information on the algorith
+ *
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Row
+ */
class Piwik_DataTable_Row_DataTableSummary extends Piwik_DataTable_Row
{
function __construct($subTable)
@@ -12,4 +22,4 @@ class Piwik_DataTable_Row_DataTableSummary extends Piwik_DataTable_Row
}
}
}
-?>
+
diff --git a/modules/DataTable/Simple.php b/modules/DataTable/Simple.php
index 4c86186024..70cb79fa51 100644
--- a/modules/DataTable/Simple.php
+++ b/modules/DataTable/Simple.php
@@ -1,11 +1,34 @@
<?php
+/**
+ * The DataTable_Simple is used to provide a very simple way to create simple DataGrid.
+ *
+ * A DataTable Simple basically is an array of name => value
+ *
+ * Returning a DataTable_Simple from a plugin API Call has huge advantages:
+ * - the generic filters can be applied automatically (offset, limit, pattern search, sort, etc.)
+ * - the renderer can be applied (XML, PHP, HTML, etc.)
+ *
+ * So you don't have to write specific renderer for your data, it is already available in all the formats supported natively by Piwik.
+ *
+ * NB: A DataTable_Simple actually is a DataTable with 2 columns: 'label' and 'value'.
+ *
+ * @package Piwik_DataTable
+ */
class Piwik_DataTable_Simple extends Piwik_DataTable
{
public function __construct()
{
parent::__construct();
}
-
+
+ /**
+ * Loads in the DataTable the array information
+ * @param array Array containing the rows information
+ * array(
+ * 'Label row 1' => Value row 1,
+ * 'Label row 2' => Value row 2,
+ * )
+ */
function loadFromArray($array)
{
foreach($array as $label => $value)
@@ -17,4 +40,5 @@ class Piwik_DataTable_Simple extends Piwik_DataTable
}
}
}
-?>
+
+
diff --git a/modules/Date.php b/modules/Date.php
index 507af231b3..0eec3c9206 100644
--- a/modules/Date.php
+++ b/modules/Date.php
@@ -42,4 +42,4 @@ class Piwik_Date extends Zend_Date
}
}
}
-?>
+
diff --git a/modules/ErrorHandler.php b/modules/ErrorHandler.php
index 7ae1fc9d9d..76a562da8a 100755
--- a/modules/ErrorHandler.php
+++ b/modules/ErrorHandler.php
@@ -1,10 +1,10 @@
<?php
function Piwik_ErrorHandler($errno, $errstr, $errfile, $errline)
{
- ob_start();
- debug_print_backtrace();
- $backtrace = ob_get_contents();
- ob_end_clean();
+// ob_start();
+// debug_print_backtrace();
+// $backtrace = ob_get_contents();
+// ob_end_clean();
Zend_Registry::get('logger_error')->log($errno, $errstr, $errfile, $errline, $backtrace);
switch($errno)
@@ -31,4 +31,4 @@ function Piwik_ErrorHandler($errno, $errstr, $errfile, $errline)
break;
}
}
-?>
+
diff --git a/modules/ExceptionHandler.php b/modules/ExceptionHandler.php
index 62c2441534..9446ef02a0 100644
--- a/modules/ExceptionHandler.php
+++ b/modules/ExceptionHandler.php
@@ -15,4 +15,4 @@ function Piwik_ExceptionHandler(Exception $exception)
print("'" . $e->getMessage()."'");
}
}
-?>
+
diff --git a/modules/Log.php b/modules/Log.php
index a5ea277e5a..b1b56363ac 100755
--- a/modules/Log.php
+++ b/modules/Log.php
@@ -125,4 +125,4 @@ class Piwik_Log_Formatter_FileFormatter implements Zend_Log_Formatter_Interface
-?>
+
diff --git a/modules/Log/APICall.php b/modules/Log/APICall.php
index 423760ded8..72574620d3 100644
--- a/modules/Log/APICall.php
+++ b/modules/Log/APICall.php
@@ -93,4 +93,4 @@ class Piwik_Log_Formatter_APICall_ScreenFormatter implements Zend_Log_Formatter_
}
}
-?>
+
diff --git a/modules/Log/Error.php b/modules/Log/Error.php
index 138375de11..dfd3558937 100644
--- a/modules/Log/Error.php
+++ b/modules/Log/Error.php
@@ -84,4 +84,4 @@ class Piwik_Log_Formatter_Error_ScreenFormatter implements Zend_Log_Formatter_In
}
}
-?>
+
diff --git a/modules/Log/Exception.php b/modules/Log/Exception.php
index bc3b925cb8..189fe55407 100644
--- a/modules/Log/Exception.php
+++ b/modules/Log/Exception.php
@@ -64,4 +64,4 @@ class Piwik_Log_Formatter_Exception_ScreenFormatter implements Zend_Log_Formatte
-?>
+
diff --git a/modules/Log/Message.php b/modules/Log/Message.php
index 121b7cfd00..e9890ada59 100644
--- a/modules/Log/Message.php
+++ b/modules/Log/Message.php
@@ -48,4 +48,4 @@ class Piwik_Log_Formatter_Message_ScreenFormatter implements Zend_Log_Formatter_
}
}
}
-?>
+
diff --git a/modules/Log/Null.php b/modules/Log/Null.php
index a108c3d554..0f9e628f32 100644
--- a/modules/Log/Null.php
+++ b/modules/Log/Null.php
@@ -13,4 +13,4 @@ class Piwik_Log_Null extends Zend_Log
}
}
-?>
+
diff --git a/modules/LogStats.php b/modules/LogStats.php
index ef10f58285..d603366f08 100644
--- a/modules/LogStats.php
+++ b/modules/LogStats.php
@@ -202,4 +202,4 @@ function printDebug( $info = '' )
}
}
}
-?>
+
diff --git a/modules/LogStats/Action.php b/modules/LogStats/Action.php
index fad520f6e2..7c10d8abc5 100644
--- a/modules/LogStats/Action.php
+++ b/modules/LogStats/Action.php
@@ -219,4 +219,4 @@ class Piwik_LogStats_Action
}
}
-?>
+
diff --git a/modules/LogStats/Config.php b/modules/LogStats/Config.php
index bd486ac519..1a25ef22d3 100644
--- a/modules/LogStats/Config.php
+++ b/modules/LogStats/Config.php
@@ -38,4 +38,4 @@ class Piwik_LogStats_Config
}
}
-?>
+
diff --git a/modules/LogStats/Cookie.php b/modules/LogStats/Cookie.php
index b682fdc037..0b095a4c4e 100644
--- a/modules/LogStats/Cookie.php
+++ b/modules/LogStats/Cookie.php
@@ -221,4 +221,4 @@ class Piwik_LogStats_Cookie
//$c->save();
//$c->deleteCookie();
-?>
+
diff --git a/modules/LogStats/Db.php b/modules/LogStats/Db.php
index 25f09d8784..6cd9e70287 100644
--- a/modules/LogStats/Db.php
+++ b/modules/LogStats/Db.php
@@ -123,4 +123,5 @@ class Piwik_LogStats_Db
}
}
}
-?>
+
+
diff --git a/modules/LogStats/Generator.php b/modules/LogStats/Generator.php
index 090434a8a8..4871c899a9 100644
--- a/modules/LogStats/Generator.php
+++ b/modules/LogStats/Generator.php
@@ -461,4 +461,4 @@ class Piwik_LogStats_Generator_Visit extends Piwik_LogStats_Visit
}
}
-?>
+
diff --git a/modules/LogStats/Visit.php b/modules/LogStats/Visit.php
index d42faee6d4..5e3537135b 100644
--- a/modules/LogStats/Visit.php
+++ b/modules/LogStats/Visit.php
@@ -738,4 +738,4 @@ class Piwik_LogStats_Visit
}
}
-?>
+
diff --git a/modules/Period.php b/modules/Period.php
index 53b7a570b7..f3082d2014 100644
--- a/modules/Period.php
+++ b/modules/Period.php
@@ -344,7 +344,3 @@ class Piwik_Period_Year extends Piwik_Period
}
}
-
-
-
-?>
diff --git a/modules/Piwik.php b/modules/Piwik.php
index 96a33bde85..4a7984fc3a 100755
--- a/modules/Piwik.php
+++ b/modules/Piwik.php
@@ -516,4 +516,4 @@ class Piwik
$db->query( "DROP TABLE IF EXISTS ". implode(", ", self::getTablesNames()) );
}
}
-?>
+
diff --git a/modules/Plugin.php b/modules/Plugin.php
index d9b72adbd0..057bdc26bb 100644
--- a/modules/Plugin.php
+++ b/modules/Plugin.php
@@ -84,4 +84,4 @@ abstract class Piwik_Plugin
return;
}
}
-?>
+
diff --git a/modules/PluginsManager.php b/modules/PluginsManager.php
index bf7caeca8f..090f4cc7f2 100644
--- a/modules/PluginsManager.php
+++ b/modules/PluginsManager.php
@@ -167,4 +167,3 @@ function Piwik_PostEvent( $eventName, $object = null, $info = array() )
}
-?>
diff --git a/modules/Site.php b/modules/Site.php
index 06b7043f81..aa892465bf 100644
--- a/modules/Site.php
+++ b/modules/Site.php
@@ -12,4 +12,4 @@ class Piwik_Site
return $this->id;
}
}
-?>
+
diff --git a/modules/SitesManager.php b/modules/SitesManager.php
index 6064e04009..d6bac0a111 100755
--- a/modules/SitesManager.php
+++ b/modules/SitesManager.php
@@ -2,7 +2,7 @@
require_once "API/APIable.php";
-class Piwik_SitesManager_API extends Piwik_APIable
+class Piwik_SitesManager_API extends Piwik_Apiable
{
static private $instance = null;
protected function __construct()
@@ -450,4 +450,4 @@ class Piwik_SitesManager_API extends Piwik_APIable
return $aUrls;
}
}
-?>
+
diff --git a/modules/TablePartitioning.php b/modules/TablePartitioning.php
index 081849896b..59a1d91771 100644
--- a/modules/TablePartitioning.php
+++ b/modules/TablePartitioning.php
@@ -98,4 +98,4 @@ class Piwik_TablePartitioning_Daily extends Piwik_TablePartitioning
}
}
-?>
+
diff --git a/modules/Timer.php b/modules/Timer.php
index fcbc9043a0..d26a8cef07 100644
--- a/modules/Timer.php
+++ b/modules/Timer.php
@@ -34,4 +34,3 @@ class Piwik_Timer
return "Time elapsed: ". $this->getTime() ."s";
}
}
-?> \ No newline at end of file
diff --git a/modules/Translate.php b/modules/Translate.php
index 3c8e7706dd..47a09fc1cf 100644
--- a/modules/Translate.php
+++ b/modules/Translate.php
@@ -49,4 +49,4 @@ function Piwik_Translate($index)
}
throw new Exception("Translation string '$index' not available.");
}
-?>
+
diff --git a/modules/UsersManager.php b/modules/UsersManager.php
index c6d7a90a8c..769f8ac00e 100755
--- a/modules/UsersManager.php
+++ b/modules/UsersManager.php
@@ -1,7 +1,7 @@
<?php
Zend_Loader::loadClass("Piwik_Access");
-class Piwik_UsersManager_API extends Piwik_APIable
+class Piwik_UsersManager_API extends Piwik_Apiable
{
static private $instance = null;
protected function __construct()
diff --git a/piwik.php b/piwik.php
index b242676181..7aadd64274 100644
--- a/piwik.php
+++ b/piwik.php
@@ -17,6 +17,8 @@
* - with the main algorithm working + one visitor requesting 5000 times
* Requests per second: 155.00 [#/sec] (mean)
*
+ * - august 28th, main algo + files in place + one visitor requesting 5000 times
+ * Requests per second: 118.55 [#/sec] (mean)
*/
error_reporting(E_ALL|E_NOTICE);
define('PIWIK_INCLUDE_PATH', '.');
@@ -48,4 +50,4 @@ $process = new Piwik_LogStats;
$process->main();
ob_end_flush();
printDebug($_COOKIE);
-?>
+
diff --git a/plugins/Referers.php b/plugins/Referers.php
index 9bc242b92f..5500eff3c3 100644
--- a/plugins/Referers.php
+++ b/plugins/Referers.php
@@ -59,6 +59,18 @@ class Piwik_Referers extends Piwik_Plugin
);
$this->archiveProcessing->archiveDataTable($dataTableToSum);
+
+ $dataNumericToSum = array(
+ 'Referers_distinctSearchEngines',
+ 'Referers_distinctKeywords',
+ 'Referers_distinctCampaigns',
+ 'Referers_distinctWebsites',
+ 'Referers_distinctWebsitesUrls',
+ 'Referers_distinctPartners',
+ 'Referers_distinctPartnersUrls',
+ );
+
+ $this->archiveProcessing->archiveNumericValuesSum($dataNumericToSum);
}
@@ -98,7 +110,9 @@ class Piwik_Referers extends Piwik_Plugin
$interestByNewsletter =
$keywordByCampaign =
$interestByCampaign =
- $interestByType = array();
+ $interestByType =
+ $distinctUrls[Piwik_Common::REFERER_TYPE_WEBSITE] =
+ $distinctUrls[Piwik_Common::REFERER_TYPE_PARTNER] = array();
while($rowBefore = $query->fetch() )
{
@@ -132,15 +146,6 @@ class Piwik_Referers extends Piwik_Plugin
case Piwik_Common::REFERER_TYPE_WEBSITE:
case Piwik_Common::REFERER_TYPE_PARTNER:
-
- // for a website we remove the HOST from the url, to save some bytes in the DB
- // for partners URLs we keep the full URL as the partner's name can be an alias and
- // so is not necessarily the hostname of the URL...
- if($row['referer_type']==Piwik_Common::REFERER_TYPE_WEBSITE
- && !empty($row['referer_url']))
- {
- $row['referer_url'] = Piwik_Common::getPathAndQueryFromUrl($row['referer_url']);
- }
if(!isset($interestByWebsite[$row['referer_type']][$row['referer_name']])) $interestByWebsite[$row['referer_type']][$row['referer_name']]= $archiveProcessing->getNewInterestRow();
$archiveProcessing->updateInterestStats( $row, $interestByWebsite[$row['referer_type']][$row['referer_name']]);
@@ -148,6 +153,11 @@ class Piwik_Referers extends Piwik_Plugin
if(!isset($urlByWebsite[$row['referer_type']][$row['referer_name']][$row['referer_url']])) $urlByWebsite[$row['referer_type']][$row['referer_name']][$row['referer_url']]= $archiveProcessing->getNewInterestRow();
$archiveProcessing->updateInterestStats( $row, $urlByWebsite[$row['referer_type']][$row['referer_name']][$row['referer_url']]);
+ if(!isset($distinctUrls[$row['referer_type']][$row['referer_url']]))
+ {
+ $distinctUrls[$row['referer_type']][$row['referer_url']] = true;
+ }
+
break;
case Piwik_Common::REFERER_TYPE_NEWSLETTER:
@@ -200,6 +210,29 @@ class Piwik_Referers extends Piwik_Plugin
// Piwik::log("Urls by partner website:");
// Piwik::log($urlByWebsite[Piwik_Common::REFERER_TYPE_PARTNER]);
+
+ $numberOfDistinctSearchEngines = count($keywordBySearchEngine);
+ $numberOfDistinctKeywords = count($searchEngineByKeyword);
+ $numberOfDistinctCampaigns = count($keywordByCampaign);
+ $numberOfDistinctWebsites = count($interestByWebsite[Piwik_Common::REFERER_TYPE_WEBSITE]);
+ $numberOfDistinctWebsitesUrls = count($distinctUrls[Piwik_Common::REFERER_TYPE_WEBSITE]);
+ $numberOfDistinctPartners = count($interestByWebsite[Piwik_Common::REFERER_TYPE_PARTNER]);
+ $numberOfDistinctPartnersUrls = count($distinctUrls[Piwik_Common::REFERER_TYPE_PARTNER]);
+
+ $numericRecords = array(
+ 'Referers_distinctSearchEngines' => $numberOfDistinctSearchEngines,
+ 'Referers_distinctKeywords' => $numberOfDistinctKeywords,
+ 'Referers_distinctCampaigns' => $numberOfDistinctCampaigns,
+ 'Referers_distinctWebsites' => $numberOfDistinctWebsites,
+ 'Referers_distinctWebsitesUrls' => $numberOfDistinctWebsitesUrls,
+ 'Referers_distinctPartners' => $numberOfDistinctPartners,
+ 'Referers_distinctPartnersUrls' => $numberOfDistinctPartnersUrls,
+ );
+ foreach($numericRecords as $name => $value)
+ {
+ $record = new Piwik_ArchiveProcessing_Record_Numeric($name, $value);
+ }
+
Piwik::printMemoryUsage("Middle of ".get_class($this)." ");
$data = $archiveProcessing->getDataTableSerialized($interestByType);
diff --git a/plugins/Referers/API.php b/plugins/Referers/API.php
index 3047972707..e8668f0f59 100644
--- a/plugins/Referers/API.php
+++ b/plugins/Referers/API.php
@@ -22,7 +22,7 @@ class Piwik_Referers_API extends Piwik_Apiable
return self::$instance;
}
- function getDataTable($name, $idSite, $period, $date, $idSubtable = null)
+ private function getDataTable($name, $idSite, $period, $date, $idSubtable = null)
{
Piwik::checkUserHasViewAccess( $idSite );
$archive = Piwik_Archive::build($idSite, $date, $period );
@@ -46,7 +46,6 @@ class Piwik_Referers_API extends Piwik_Apiable
function getSearchEnginesFromKeywordId($idSite, $period, $date, $idSubtable)
{
- require PIWIK_DATAFILES_INCLUDE_PATH . "/SearchEngines.php";
$dataTable = $this->getDataTable('Referers_searchEngineByKeyword',$idSite, $period, $date, $idSubtable);
$dataTable->queueFilter('Piwik_DataTable_Filter_ColumnCallbackAddDetail', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') );
$dataTable->queueFilter('Piwik_DataTable_Filter_DetailCallbackAddDetail', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromName') );
@@ -62,42 +61,102 @@ class Piwik_Referers_API extends Piwik_Apiable
}
function getKeywordsFromSearchEngineId($idSite, $period, $date, $idSubtable)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $idSubtable);
+ return $dataTable;
+ }
function getCampaigns($idSite, $period, $date)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_keywordByCampaign',$idSite, $period, $date);
+ return $dataTable;
+ }
+
function getKeywordsFromCampaignId($idSite, $period, $date, $idSubtable)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_keywordByCampaign',$idSite, $period, $date, $idSubtable);
+ return $dataTable;
+ }
function getWebsites($idSite, $period, $date)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_urlByWebsite',$idSite, $period, $date);
+ return $dataTable;
+ }
function getUrlsFromWebsiteId($idSite, $period, $date, $idSubtable)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_urlByWebsite',$idSite, $period, $date, $idSubtable);
+ $dataTable->queueFilter('Piwik_DataTable_Filter_ColumnCallbackAddDetail', array( 'label', 'url', create_function('$label', 'return $label;')) );
+ $dataTable->queueFilter('Piwik_DataTable_Filter_ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl'));
+ return $dataTable;
+ }
function getPartners($idSite, $period, $date)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_urlByPartner',$idSite, $period, $date);
+ return $dataTable;
+ }
+
function getUrlsFromPartnerId($idSite, $period, $date, $idSubtable)
- {}
+ {
+ $dataTable = $this->getDataTable('Referers_urlByPartner',$idSite, $period, $date, $idSubtable);
+ $dataTable->queueFilter('Piwik_DataTable_Filter_ColumnCallbackAddDetail', array( 'label', 'url', create_function('$label', 'return $label;')) );
+ $dataTable->queueFilter('Piwik_DataTable_Filter_ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl'));
+ return $dataTable;
+ }
+ private function getNumeric($name, $idSite, $period, $date)
+ {
+ Piwik::checkUserHasViewAccess( $idSite );
+ $archive = Piwik_Archive::build($idSite, $date, $period );
+ return $archive->getDataTableFromNumeric($name);
+ }
function getNumberOfDistinctSearchEngines($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctSearchEngines', $idSite, $period, $date);
+ }
+
function getNumberOfDistinctKeywords($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctKeywords', $idSite, $period, $date);
+ }
function getNumberOfDistinctCampaigns($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctCampaigns', $idSite, $period, $date);
+ }
function getNumberOfDistinctWebsites($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctWebsites', $idSite, $period, $date);
+ }
function getNumberOfDistinctWebsitesUrls($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctWebsitesUrls', $idSite, $period, $date);
+ }
function getNumberOfDistinctPartners($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctPartners', $idSite, $period, $date);
+ }
function getNumberOfDistinctPartnersUrls($idSite, $period, $date)
- {}
+ {
+ return $this->getNumeric('Referers_distinctPartnersUrls', $idSite, $period, $date);
+ }
+}
+
+function Piwik_getPathFromUrl($url)
+{
+ $path = Piwik_Common::getPathAndQueryFromUrl($url);
+ if(empty($path))
+ {
+ return 'index';
+ }
+ return $path;
}
+
function Piwik_getSearchEngineUrlFromName($name)
{
+ require_once PIWIK_DATAFILES_INCLUDE_PATH . "/SearchEngines.php";
if(isset($GLOBALS['Piwik_SearchEngines_NameToUrl'][$name]))
{
$url = 'http://'.$GLOBALS['Piwik_SearchEngines_NameToUrl'][$name];
@@ -109,8 +168,10 @@ function Piwik_getSearchEngineUrlFromName($name)
return $url;
}
+
function Piwik_getSearchEngineLogoFromName($url)
{
+ require_once PIWIK_DATAFILES_INCLUDE_PATH . "/SearchEngines.php";
$path = PIWIK_PLUGINS_PATH . '/Referers/images/searchEngines/%s.png';
$beginningUrl = strpos($url,'//')+2;
@@ -124,6 +185,7 @@ function Piwik_getSearchEngineLogoFromName($url)
return $normalPath;
}
+
function Piwik_getRefererTypeLabel($label)
{
$indexTranslation = '';
@@ -150,11 +212,4 @@ function Piwik_getRefererTypeLabel($label)
}
return Piwik_Translate($indexTranslation);
}
-//'Referers_keywordBySearchEngine',
-//'Referers_searchEngineByKeyword',
-//'Referers_type',
-
-//'Referers_keywordByCampaign',
-//'Referers_urlByWebsite',
-//'Referers_urlByPartner',
diff --git a/plugins/Referers/images/searchEngines/affiliate.espotting.fr.png b/plugins/Referers/images/searchEngines/affiliate.espotting.fr.png
new file mode 100644
index 0000000000..7a4f6fd510
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/affiliate.espotting.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/arianna.libero.it.png b/plugins/Referers/images/searchEngines/arianna.libero.it.png
new file mode 100644
index 0000000000..ec6500bd55
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/arianna.libero.it.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/class.hit-parade.com.png b/plugins/Referers/images/searchEngines/class.hit-parade.com.png
new file mode 100644
index 0000000000..3525114470
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/class.hit-parade.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/directory.google.com.png b/plugins/Referers/images/searchEngines/directory.google.com.png
new file mode 100644
index 0000000000..154ecfcfe0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/directory.google.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/dmoz.org.png b/plugins/Referers/images/searchEngines/dmoz.org.png
new file mode 100644
index 0000000000..2e83e81df0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/dmoz.org.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/find.copernic.com.png b/plugins/Referers/images/searchEngines/find.copernic.com.png
new file mode 100644
index 0000000000..d646c9fbb4
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/find.copernic.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/fr.dir.com.png b/plugins/Referers/images/searchEngines/fr.dir.com.png
new file mode 100644
index 0000000000..4dcd20f0f2
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/fr.dir.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/fr.wedoo.com.png b/plugins/Referers/images/searchEngines/fr.wedoo.com.png
new file mode 100644
index 0000000000..98ea792bc7
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/fr.wedoo.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/fulltext.centrum.cz.png b/plugins/Referers/images/searchEngines/fulltext.centrum.cz.png
new file mode 100644
index 0000000000..0530ca5bdd
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/fulltext.centrum.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/g.msn.com.png b/plugins/Referers/images/searchEngines/g.msn.com.png
new file mode 100644
index 0000000000..5ca23d7674
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/g.msn.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/go.mail.ru.png b/plugins/Referers/images/searchEngines/go.mail.ru.png
new file mode 100644
index 0000000000..5088758879
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/go.mail.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/hledani.tiscali.cz.png b/plugins/Referers/images/searchEngines/hledani.tiscali.cz.png
new file mode 100644
index 0000000000..e5b9a88685
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/hledani.tiscali.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/hotbox.png b/plugins/Referers/images/searchEngines/hotbox.png
new file mode 100644
index 0000000000..ad53185532
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/hotbox.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/images.google.com.png b/plugins/Referers/images/searchEngines/images.google.com.png
new file mode 100644
index 0000000000..154ecfcfe0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/images.google.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/images.yandex.ru.png b/plugins/Referers/images/searchEngines/images.yandex.ru.png
new file mode 100644
index 0000000000..bc3c364935
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/images.yandex.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/jyxo.cz.png b/plugins/Referers/images/searchEngines/jyxo.cz.png
new file mode 100644
index 0000000000..657306bcc7
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/jyxo.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/morfeo.centrum.cz.png b/plugins/Referers/images/searchEngines/morfeo.centrum.cz.png
new file mode 100644
index 0000000000..0530ca5bdd
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/morfeo.centrum.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/msxml.excite.com.png b/plugins/Referers/images/searchEngines/msxml.excite.com.png
new file mode 100644
index 0000000000..8ef8d0ba7c
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/msxml.excite.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/news.google.com.png b/plugins/Referers/images/searchEngines/news.google.com.png
new file mode 100644
index 0000000000..154ecfcfe0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/news.google.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/recherche.club-internet.fr.png b/plugins/Referers/images/searchEngines/recherche.club-internet.fr.png
new file mode 100644
index 0000000000..0ecaddec26
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/recherche.club-internet.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/recherche.francite.com.png b/plugins/Referers/images/searchEngines/recherche.francite.com.png
new file mode 100644
index 0000000000..672f662591
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/recherche.francite.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/recherche.toile.qc.ca.png b/plugins/Referers/images/searchEngines/recherche.toile.qc.ca.png
new file mode 100644
index 0000000000..71fb5e56b1
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/recherche.toile.qc.ca.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/rechercher.aliceadsl.fr.png b/plugins/Referers/images/searchEngines/rechercher.aliceadsl.fr.png
new file mode 100644
index 0000000000..3ee3bd24f9
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/rechercher.aliceadsl.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/rechercher.nomade.aliceadsl.fr.png b/plugins/Referers/images/searchEngines/rechercher.nomade.aliceadsl.fr.png
new file mode 100644
index 0000000000..bfecab9c17
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/rechercher.nomade.aliceadsl.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search-dyn.tiscali.it.png b/plugins/Referers/images/searchEngines/search-dyn.tiscali.it.png
new file mode 100644
index 0000000000..13ef7b5474
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search-dyn.tiscali.it.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.about.com.png b/plugins/Referers/images/searchEngines/search.about.com.png
new file mode 100644
index 0000000000..76ab165757
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.about.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.aol.com.png b/plugins/Referers/images/searchEngines/search.aol.com.png
new file mode 100644
index 0000000000..c509afb2ba
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.aol.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.atlas.cz.png b/plugins/Referers/images/searchEngines/search.atlas.cz.png
new file mode 100644
index 0000000000..8d69124ce9
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.atlas.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.bluewin.ch.png b/plugins/Referers/images/searchEngines/search.bluewin.ch.png
new file mode 100644
index 0000000000..520da0fc77
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.bluewin.ch.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.centrum.cz.png b/plugins/Referers/images/searchEngines/search.centrum.cz.png
new file mode 100644
index 0000000000..0530ca5bdd
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.centrum.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.earthlink.net.png b/plugins/Referers/images/searchEngines/search.earthlink.net.png
new file mode 100644
index 0000000000..cacacf21a3
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.earthlink.net.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.free.fr.png b/plugins/Referers/images/searchEngines/search.free.fr.png
new file mode 100644
index 0000000000..e1bcb89e9b
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.free.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.ke.wanadoo.fr.png b/plugins/Referers/images/searchEngines/search.ke.wanadoo.fr.png
new file mode 100644
index 0000000000..de46f2c077
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.ke.wanadoo.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.metacrawler.com.png b/plugins/Referers/images/searchEngines/search.metacrawler.com.png
new file mode 100644
index 0000000000..6b9e0d6901
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.metacrawler.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.msn.com.png b/plugins/Referers/images/searchEngines/search.msn.com.png
new file mode 100644
index 0000000000..6217b7151c
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.msn.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.netscape.com.png b/plugins/Referers/images/searchEngines/search.netscape.com.png
new file mode 100644
index 0000000000..a7dfae8e6f
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.netscape.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.seznam.cz.png b/plugins/Referers/images/searchEngines/search.seznam.cz.png
new file mode 100644
index 0000000000..49ea24c48c
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.seznam.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.skynet.be.png b/plugins/Referers/images/searchEngines/search.skynet.be.png
new file mode 100644
index 0000000000..3ebed64a4b
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.skynet.be.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.virgilio.it.png b/plugins/Referers/images/searchEngines/search.virgilio.it.png
new file mode 100644
index 0000000000..80874c36bb
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.virgilio.it.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.voila.com.png b/plugins/Referers/images/searchEngines/search.voila.com.png
new file mode 100644
index 0000000000..50f3d37353
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.voila.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.yaca.yandex.ru.png b/plugins/Referers/images/searchEngines/search.yaca.yandex.ru.png
new file mode 100644
index 0000000000..bc3c364935
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.yaca.yandex.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search.yahoo.com.png b/plugins/Referers/images/searchEngines/search.yahoo.com.png
new file mode 100644
index 0000000000..20ba5ed665
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search.yahoo.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search1.seznam.cz.png b/plugins/Referers/images/searchEngines/search1.seznam.cz.png
new file mode 100644
index 0000000000..49ea24c48c
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search1.seznam.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/search2.seznam.cz.png b/plugins/Referers/images/searchEngines/search2.seznam.cz.png
new file mode 100644
index 0000000000..49ea24c48c
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/search2.seznam.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/sm.aport.ru.png b/plugins/Referers/images/searchEngines/sm.aport.ru.png
new file mode 100644
index 0000000000..f8eb0bc5e3
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/sm.aport.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/translate.google.com.png b/plugins/Referers/images/searchEngines/translate.google.com.png
new file mode 100644
index 0000000000..154ecfcfe0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/translate.google.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/web.toile.com.png b/plugins/Referers/images/searchEngines/web.toile.com.png
new file mode 100644
index 0000000000..b5111f71f3
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/web.toile.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/web.volny.cz.png b/plugins/Referers/images/searchEngines/web.volny.cz.png
new file mode 100644
index 0000000000..c246b877d3
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/web.volny.cz.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.a9.com.png b/plugins/Referers/images/searchEngines/www.a9.com.png
new file mode 100644
index 0000000000..170bce68c8
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.a9.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.alltheweb.com.png b/plugins/Referers/images/searchEngines/www.alltheweb.com.png
new file mode 100644
index 0000000000..d11dcbdd42
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.alltheweb.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.altavista.com.png b/plugins/Referers/images/searchEngines/www.altavista.com.png
new file mode 100644
index 0000000000..67abe6bcaa
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.altavista.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.ask.com.png b/plugins/Referers/images/searchEngines/www.ask.com.png
new file mode 100644
index 0000000000..4d346a67a1
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.ask.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.eo.st.png b/plugins/Referers/images/searchEngines/www.eo.st.png
new file mode 100644
index 0000000000..19184f55db
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.eo.st.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.eu.ixquick.com.png b/plugins/Referers/images/searchEngines/www.eu.ixquick.com.png
new file mode 100644
index 0000000000..a688041220
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.eu.ixquick.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.euroseek.com.png b/plugins/Referers/images/searchEngines/www.euroseek.com.png
new file mode 100644
index 0000000000..35214de4af
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.euroseek.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.exalead.fr.png b/plugins/Referers/images/searchEngines/www.exalead.fr.png
new file mode 100644
index 0000000000..c77f6e1ecd
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.exalead.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.google.com.png b/plugins/Referers/images/searchEngines/www.google.com.png
new file mode 100644
index 0000000000..154ecfcfe0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.google.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.google.interia.pl.png b/plugins/Referers/images/searchEngines/www.google.interia.pl.png
new file mode 100644
index 0000000000..75a8d7c0f0
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.google.interia.pl.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.hotbot.com.png b/plugins/Referers/images/searchEngines/www.hotbot.com.png
new file mode 100644
index 0000000000..882c6f89bc
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.hotbot.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.icq.com.png b/plugins/Referers/images/searchEngines/www.icq.com.png
new file mode 100644
index 0000000000..f32a06f160
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.icq.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.looksmart.com.png b/plugins/Referers/images/searchEngines/www.looksmart.com.png
new file mode 100644
index 0000000000..31eba8236e
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.looksmart.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.mozbot.com.png b/plugins/Referers/images/searchEngines/www.mozbot.com.png
new file mode 100644
index 0000000000..1a284a60ad
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.mozbot.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.multimania.lycos.fr.png b/plugins/Referers/images/searchEngines/www.multimania.lycos.fr.png
new file mode 100644
index 0000000000..cb1478bb01
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.multimania.lycos.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.mywebsearch.com.png b/plugins/Referers/images/searchEngines/www.mywebsearch.com.png
new file mode 100644
index 0000000000..5a437790fd
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.mywebsearch.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.najdi.si.png b/plugins/Referers/images/searchEngines/www.najdi.si.png
new file mode 100644
index 0000000000..bd0be8a587
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.najdi.si.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.northernlight.com.png b/plugins/Referers/images/searchEngines/www.northernlight.com.png
new file mode 100644
index 0000000000..5408c4481e
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.northernlight.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.rambler.ru.png b/plugins/Referers/images/searchEngines/www.rambler.ru.png
new file mode 100644
index 0000000000..fc11bd0fab
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.rambler.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.reacteur.com.png b/plugins/Referers/images/searchEngines/www.reacteur.com.png
new file mode 100644
index 0000000000..26a9946586
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.reacteur.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.search.ch.png b/plugins/Referers/images/searchEngines/www.search.ch.png
new file mode 100644
index 0000000000..9b8211d192
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.search.ch.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.search.com.png b/plugins/Referers/images/searchEngines/www.search.com.png
new file mode 100644
index 0000000000..05344bc555
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.search.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.searchalot.com.png b/plugins/Referers/images/searchEngines/www.searchalot.com.png
new file mode 100644
index 0000000000..ae648faf4b
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.searchalot.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.teoma.com.png b/plugins/Referers/images/searchEngines/www.teoma.com.png
new file mode 100644
index 0000000000..09d7ad7179
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.teoma.com.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.webalta.ru.png b/plugins/Referers/images/searchEngines/www.webalta.ru.png
new file mode 100644
index 0000000000..ba7a30a043
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.webalta.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.weborama.fr.png b/plugins/Referers/images/searchEngines/www.weborama.fr.png
new file mode 100644
index 0000000000..7a9dce5a62
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.weborama.fr.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.ya.ru.png b/plugins/Referers/images/searchEngines/www.ya.ru.png
new file mode 100644
index 0000000000..bc3c364935
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.ya.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.yandex.ru.png b/plugins/Referers/images/searchEngines/www.yandex.ru.png
new file mode 100644
index 0000000000..bc3c364935
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.yandex.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www.zoeken.nl.png b/plugins/Referers/images/searchEngines/www.zoeken.nl.png
new file mode 100644
index 0000000000..3947c8f03e
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www.zoeken.nl.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/www3.zoek.nl.png b/plugins/Referers/images/searchEngines/www3.zoek.nl.png
new file mode 100644
index 0000000000..9e62e7daab
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/www3.zoek.nl.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/xx.gif b/plugins/Referers/images/searchEngines/xx.gif
new file mode 100644
index 0000000000..5ddb8b8edb
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/xx.gif
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/xx.png b/plugins/Referers/images/searchEngines/xx.png
new file mode 100644
index 0000000000..655abc953d
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/xx.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/ya.ru.png b/plugins/Referers/images/searchEngines/ya.ru.png
new file mode 100644
index 0000000000..bc3c364935
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/ya.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/yandex.ru.png b/plugins/Referers/images/searchEngines/yandex.ru.png
new file mode 100644
index 0000000000..bc3c364935
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/yandex.ru.png
Binary files differ
diff --git a/plugins/Referers/images/searchEngines/zoohoo.cz.png b/plugins/Referers/images/searchEngines/zoohoo.cz.png
new file mode 100644
index 0000000000..5aebf0909f
--- /dev/null
+++ b/plugins/Referers/images/searchEngines/zoohoo.cz.png
Binary files differ
diff --git a/plugins/Referers/lang/en.php b/plugins/Referers/lang/en.php
index 9d6248eaa6..bd1946605c 100644
--- a/plugins/Referers/lang/en.php
+++ b/plugins/Referers/lang/en.php
@@ -7,4 +7,4 @@ $translations = array(
'Referers_Newsletters' => 'Newsletters',
'Referers_Campaigns' => 'Campaigns',
);
-?>
+
diff --git a/plugins/UserCountry/flags/ad.png b/plugins/UserCountry/flags/ad.png
new file mode 100755
index 0000000000..847c63c19f
--- /dev/null
+++ b/plugins/UserCountry/flags/ad.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ae.png b/plugins/UserCountry/flags/ae.png
new file mode 100755
index 0000000000..a5e2499fe3
--- /dev/null
+++ b/plugins/UserCountry/flags/ae.png
Binary files differ
diff --git a/plugins/UserCountry/flags/af.png b/plugins/UserCountry/flags/af.png
new file mode 100755
index 0000000000..1f3a0f38dc
--- /dev/null
+++ b/plugins/UserCountry/flags/af.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ag.png b/plugins/UserCountry/flags/ag.png
new file mode 100755
index 0000000000..f418d0d28b
--- /dev/null
+++ b/plugins/UserCountry/flags/ag.png
Binary files differ
diff --git a/plugins/UserCountry/flags/al.png b/plugins/UserCountry/flags/al.png
new file mode 100755
index 0000000000..74a63561cd
--- /dev/null
+++ b/plugins/UserCountry/flags/al.png
Binary files differ
diff --git a/plugins/UserCountry/flags/am.png b/plugins/UserCountry/flags/am.png
new file mode 100755
index 0000000000..f6acfdb5af
--- /dev/null
+++ b/plugins/UserCountry/flags/am.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ao.png b/plugins/UserCountry/flags/ao.png
new file mode 100755
index 0000000000..f1ac05445d
--- /dev/null
+++ b/plugins/UserCountry/flags/ao.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ar.png b/plugins/UserCountry/flags/ar.png
new file mode 100755
index 0000000000..65e8f67216
--- /dev/null
+++ b/plugins/UserCountry/flags/ar.png
Binary files differ
diff --git a/plugins/UserCountry/flags/at.png b/plugins/UserCountry/flags/at.png
new file mode 100755
index 0000000000..5a8dbb4ba6
--- /dev/null
+++ b/plugins/UserCountry/flags/at.png
Binary files differ
diff --git a/plugins/UserCountry/flags/au.png b/plugins/UserCountry/flags/au.png
new file mode 100755
index 0000000000..e070dd8edb
--- /dev/null
+++ b/plugins/UserCountry/flags/au.png
Binary files differ
diff --git a/plugins/UserCountry/flags/az.png b/plugins/UserCountry/flags/az.png
new file mode 100755
index 0000000000..5d196bbf08
--- /dev/null
+++ b/plugins/UserCountry/flags/az.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ba.png b/plugins/UserCountry/flags/ba.png
new file mode 100755
index 0000000000..db1e0ccd72
--- /dev/null
+++ b/plugins/UserCountry/flags/ba.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bb.png b/plugins/UserCountry/flags/bb.png
new file mode 100755
index 0000000000..d97f8b25ef
--- /dev/null
+++ b/plugins/UserCountry/flags/bb.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bd.png b/plugins/UserCountry/flags/bd.png
new file mode 100755
index 0000000000..0aafdcbab7
--- /dev/null
+++ b/plugins/UserCountry/flags/bd.png
Binary files differ
diff --git a/plugins/UserCountry/flags/be.png b/plugins/UserCountry/flags/be.png
new file mode 100755
index 0000000000..5510342aaa
--- /dev/null
+++ b/plugins/UserCountry/flags/be.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bf.png b/plugins/UserCountry/flags/bf.png
new file mode 100755
index 0000000000..8aef105027
--- /dev/null
+++ b/plugins/UserCountry/flags/bf.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bg.png b/plugins/UserCountry/flags/bg.png
new file mode 100755
index 0000000000..3f3784e292
--- /dev/null
+++ b/plugins/UserCountry/flags/bg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bh.png b/plugins/UserCountry/flags/bh.png
new file mode 100755
index 0000000000..107db46f84
--- /dev/null
+++ b/plugins/UserCountry/flags/bh.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bi.png b/plugins/UserCountry/flags/bi.png
new file mode 100755
index 0000000000..988cf2a251
--- /dev/null
+++ b/plugins/UserCountry/flags/bi.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bj.png b/plugins/UserCountry/flags/bj.png
new file mode 100755
index 0000000000..14fd6f0c23
--- /dev/null
+++ b/plugins/UserCountry/flags/bj.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bn.png b/plugins/UserCountry/flags/bn.png
new file mode 100755
index 0000000000..a0612db57f
--- /dev/null
+++ b/plugins/UserCountry/flags/bn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bo.png b/plugins/UserCountry/flags/bo.png
new file mode 100755
index 0000000000..ba67b9fce6
--- /dev/null
+++ b/plugins/UserCountry/flags/bo.png
Binary files differ
diff --git a/plugins/UserCountry/flags/br.png b/plugins/UserCountry/flags/br.png
new file mode 100755
index 0000000000..8fb282d442
--- /dev/null
+++ b/plugins/UserCountry/flags/br.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bs.png b/plugins/UserCountry/flags/bs.png
new file mode 100755
index 0000000000..a094bc89fb
--- /dev/null
+++ b/plugins/UserCountry/flags/bs.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bt.png b/plugins/UserCountry/flags/bt.png
new file mode 100755
index 0000000000..695d897b65
--- /dev/null
+++ b/plugins/UserCountry/flags/bt.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bw.png b/plugins/UserCountry/flags/bw.png
new file mode 100755
index 0000000000..576233a3c8
--- /dev/null
+++ b/plugins/UserCountry/flags/bw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/by.png b/plugins/UserCountry/flags/by.png
new file mode 100755
index 0000000000..480b5956ae
--- /dev/null
+++ b/plugins/UserCountry/flags/by.png
Binary files differ
diff --git a/plugins/UserCountry/flags/bz.png b/plugins/UserCountry/flags/bz.png
new file mode 100755
index 0000000000..3254ac7664
--- /dev/null
+++ b/plugins/UserCountry/flags/bz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ca.png b/plugins/UserCountry/flags/ca.png
new file mode 100755
index 0000000000..f74f3747b5
--- /dev/null
+++ b/plugins/UserCountry/flags/ca.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cf.png b/plugins/UserCountry/flags/cf.png
new file mode 100755
index 0000000000..1e47f318d4
--- /dev/null
+++ b/plugins/UserCountry/flags/cf.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cg.png b/plugins/UserCountry/flags/cg.png
new file mode 100755
index 0000000000..e6d26cd552
--- /dev/null
+++ b/plugins/UserCountry/flags/cg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ch.png b/plugins/UserCountry/flags/ch.png
new file mode 100755
index 0000000000..a06c8e3594
--- /dev/null
+++ b/plugins/UserCountry/flags/ch.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ci.png b/plugins/UserCountry/flags/ci.png
new file mode 100755
index 0000000000..3d22ba6832
--- /dev/null
+++ b/plugins/UserCountry/flags/ci.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ck.png b/plugins/UserCountry/flags/ck.png
new file mode 100755
index 0000000000..571a6b7635
--- /dev/null
+++ b/plugins/UserCountry/flags/ck.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cl.png b/plugins/UserCountry/flags/cl.png
new file mode 100755
index 0000000000..e3752bd7f7
--- /dev/null
+++ b/plugins/UserCountry/flags/cl.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cm.png b/plugins/UserCountry/flags/cm.png
new file mode 100755
index 0000000000..889f6c9093
--- /dev/null
+++ b/plugins/UserCountry/flags/cm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cn.png b/plugins/UserCountry/flags/cn.png
new file mode 100755
index 0000000000..3c539df4a5
--- /dev/null
+++ b/plugins/UserCountry/flags/cn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/co.png b/plugins/UserCountry/flags/co.png
new file mode 100755
index 0000000000..460eaddcae
--- /dev/null
+++ b/plugins/UserCountry/flags/co.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cr.png b/plugins/UserCountry/flags/cr.png
new file mode 100755
index 0000000000..05f0b5cfe3
--- /dev/null
+++ b/plugins/UserCountry/flags/cr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cs.png b/plugins/UserCountry/flags/cs.png
new file mode 100755
index 0000000000..fab2cafe9e
--- /dev/null
+++ b/plugins/UserCountry/flags/cs.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cu.png b/plugins/UserCountry/flags/cu.png
new file mode 100755
index 0000000000..57eec0a21e
--- /dev/null
+++ b/plugins/UserCountry/flags/cu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cv.png b/plugins/UserCountry/flags/cv.png
new file mode 100755
index 0000000000..40b637f3ab
--- /dev/null
+++ b/plugins/UserCountry/flags/cv.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cy.png b/plugins/UserCountry/flags/cy.png
new file mode 100755
index 0000000000..257c628e39
--- /dev/null
+++ b/plugins/UserCountry/flags/cy.png
Binary files differ
diff --git a/plugins/UserCountry/flags/cz.png b/plugins/UserCountry/flags/cz.png
new file mode 100755
index 0000000000..96af880568
--- /dev/null
+++ b/plugins/UserCountry/flags/cz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/de.png b/plugins/UserCountry/flags/de.png
new file mode 100755
index 0000000000..7707c43321
--- /dev/null
+++ b/plugins/UserCountry/flags/de.png
Binary files differ
diff --git a/plugins/UserCountry/flags/dj.png b/plugins/UserCountry/flags/dj.png
new file mode 100755
index 0000000000..5cc56c7319
--- /dev/null
+++ b/plugins/UserCountry/flags/dj.png
Binary files differ
diff --git a/plugins/UserCountry/flags/dk.png b/plugins/UserCountry/flags/dk.png
new file mode 100755
index 0000000000..392989ae22
--- /dev/null
+++ b/plugins/UserCountry/flags/dk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/dm.png b/plugins/UserCountry/flags/dm.png
new file mode 100755
index 0000000000..a7b2507fe4
--- /dev/null
+++ b/plugins/UserCountry/flags/dm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/do.png b/plugins/UserCountry/flags/do.png
new file mode 100755
index 0000000000..627d6701fb
--- /dev/null
+++ b/plugins/UserCountry/flags/do.png
Binary files differ
diff --git a/plugins/UserCountry/flags/dz.png b/plugins/UserCountry/flags/dz.png
new file mode 100755
index 0000000000..f2f87465df
--- /dev/null
+++ b/plugins/UserCountry/flags/dz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ec.png b/plugins/UserCountry/flags/ec.png
new file mode 100755
index 0000000000..784ca3063b
--- /dev/null
+++ b/plugins/UserCountry/flags/ec.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ee.png b/plugins/UserCountry/flags/ee.png
new file mode 100755
index 0000000000..d13d2b848c
--- /dev/null
+++ b/plugins/UserCountry/flags/ee.png
Binary files differ
diff --git a/plugins/UserCountry/flags/eg.png b/plugins/UserCountry/flags/eg.png
new file mode 100755
index 0000000000..69376045d4
--- /dev/null
+++ b/plugins/UserCountry/flags/eg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/er.png b/plugins/UserCountry/flags/er.png
new file mode 100755
index 0000000000..31e2087b91
--- /dev/null
+++ b/plugins/UserCountry/flags/er.png
Binary files differ
diff --git a/plugins/UserCountry/flags/es.png b/plugins/UserCountry/flags/es.png
new file mode 100755
index 0000000000..071c892f55
--- /dev/null
+++ b/plugins/UserCountry/flags/es.png
Binary files differ
diff --git a/plugins/UserCountry/flags/et.png b/plugins/UserCountry/flags/et.png
new file mode 100755
index 0000000000..e5ff7b024e
--- /dev/null
+++ b/plugins/UserCountry/flags/et.png
Binary files differ
diff --git a/plugins/UserCountry/flags/fi.png b/plugins/UserCountry/flags/fi.png
new file mode 100755
index 0000000000..99b2d6eac2
--- /dev/null
+++ b/plugins/UserCountry/flags/fi.png
Binary files differ
diff --git a/plugins/UserCountry/flags/fj.png b/plugins/UserCountry/flags/fj.png
new file mode 100755
index 0000000000..50d87c5f52
--- /dev/null
+++ b/plugins/UserCountry/flags/fj.png
Binary files differ
diff --git a/plugins/UserCountry/flags/fm.png b/plugins/UserCountry/flags/fm.png
new file mode 100755
index 0000000000..13617857be
--- /dev/null
+++ b/plugins/UserCountry/flags/fm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/fr.png b/plugins/UserCountry/flags/fr.png
new file mode 100755
index 0000000000..b74ec942a3
--- /dev/null
+++ b/plugins/UserCountry/flags/fr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ga.png b/plugins/UserCountry/flags/ga.png
new file mode 100755
index 0000000000..b69a9c96c0
--- /dev/null
+++ b/plugins/UserCountry/flags/ga.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gb.png b/plugins/UserCountry/flags/gb.png
new file mode 100755
index 0000000000..bb6e8d1814
--- /dev/null
+++ b/plugins/UserCountry/flags/gb.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gd.png b/plugins/UserCountry/flags/gd.png
new file mode 100755
index 0000000000..2926e06a9e
--- /dev/null
+++ b/plugins/UserCountry/flags/gd.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ge.png b/plugins/UserCountry/flags/ge.png
new file mode 100755
index 0000000000..827385dbb3
--- /dev/null
+++ b/plugins/UserCountry/flags/ge.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gh.png b/plugins/UserCountry/flags/gh.png
new file mode 100755
index 0000000000..8b62bf646d
--- /dev/null
+++ b/plugins/UserCountry/flags/gh.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gm.png b/plugins/UserCountry/flags/gm.png
new file mode 100755
index 0000000000..8a47b0710a
--- /dev/null
+++ b/plugins/UserCountry/flags/gm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gn.png b/plugins/UserCountry/flags/gn.png
new file mode 100755
index 0000000000..5bb5db00aa
--- /dev/null
+++ b/plugins/UserCountry/flags/gn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gq.png b/plugins/UserCountry/flags/gq.png
new file mode 100755
index 0000000000..fcc94fbb19
--- /dev/null
+++ b/plugins/UserCountry/flags/gq.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gr.png b/plugins/UserCountry/flags/gr.png
new file mode 100755
index 0000000000..75e4705996
--- /dev/null
+++ b/plugins/UserCountry/flags/gr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gt.png b/plugins/UserCountry/flags/gt.png
new file mode 100755
index 0000000000..7e8213f712
--- /dev/null
+++ b/plugins/UserCountry/flags/gt.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gw.png b/plugins/UserCountry/flags/gw.png
new file mode 100755
index 0000000000..8061a014c0
--- /dev/null
+++ b/plugins/UserCountry/flags/gw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/gy.png b/plugins/UserCountry/flags/gy.png
new file mode 100755
index 0000000000..3fe78f030f
--- /dev/null
+++ b/plugins/UserCountry/flags/gy.png
Binary files differ
diff --git a/plugins/UserCountry/flags/hk.png b/plugins/UserCountry/flags/hk.png
new file mode 100755
index 0000000000..75b341426a
--- /dev/null
+++ b/plugins/UserCountry/flags/hk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/hn.png b/plugins/UserCountry/flags/hn.png
new file mode 100755
index 0000000000..b693e72893
--- /dev/null
+++ b/plugins/UserCountry/flags/hn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/hr.png b/plugins/UserCountry/flags/hr.png
new file mode 100755
index 0000000000..e552636fc1
--- /dev/null
+++ b/plugins/UserCountry/flags/hr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ht.png b/plugins/UserCountry/flags/ht.png
new file mode 100755
index 0000000000..d6b597416d
--- /dev/null
+++ b/plugins/UserCountry/flags/ht.png
Binary files differ
diff --git a/plugins/UserCountry/flags/hu.png b/plugins/UserCountry/flags/hu.png
new file mode 100755
index 0000000000..24f1bfe2b2
--- /dev/null
+++ b/plugins/UserCountry/flags/hu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/id.png b/plugins/UserCountry/flags/id.png
new file mode 100755
index 0000000000..6e65f8f015
--- /dev/null
+++ b/plugins/UserCountry/flags/id.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ie.png b/plugins/UserCountry/flags/ie.png
new file mode 100755
index 0000000000..094e5a8eb7
--- /dev/null
+++ b/plugins/UserCountry/flags/ie.png
Binary files differ
diff --git a/plugins/UserCountry/flags/il.png b/plugins/UserCountry/flags/il.png
new file mode 100755
index 0000000000..a4e24dda30
--- /dev/null
+++ b/plugins/UserCountry/flags/il.png
Binary files differ
diff --git a/plugins/UserCountry/flags/in.png b/plugins/UserCountry/flags/in.png
new file mode 100755
index 0000000000..3f7c0edb53
--- /dev/null
+++ b/plugins/UserCountry/flags/in.png
Binary files differ
diff --git a/plugins/UserCountry/flags/iq.png b/plugins/UserCountry/flags/iq.png
new file mode 100755
index 0000000000..36edac7653
--- /dev/null
+++ b/plugins/UserCountry/flags/iq.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ir.png b/plugins/UserCountry/flags/ir.png
new file mode 100755
index 0000000000..95ffb11d2f
--- /dev/null
+++ b/plugins/UserCountry/flags/ir.png
Binary files differ
diff --git a/plugins/UserCountry/flags/is.png b/plugins/UserCountry/flags/is.png
new file mode 100755
index 0000000000..4d90c1b704
--- /dev/null
+++ b/plugins/UserCountry/flags/is.png
Binary files differ
diff --git a/plugins/UserCountry/flags/it.png b/plugins/UserCountry/flags/it.png
new file mode 100755
index 0000000000..a3e3a7b81c
--- /dev/null
+++ b/plugins/UserCountry/flags/it.png
Binary files differ
diff --git a/plugins/UserCountry/flags/jm.png b/plugins/UserCountry/flags/jm.png
new file mode 100755
index 0000000000..a2c0e1c73c
--- /dev/null
+++ b/plugins/UserCountry/flags/jm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/jo.png b/plugins/UserCountry/flags/jo.png
new file mode 100755
index 0000000000..202f5163c2
--- /dev/null
+++ b/plugins/UserCountry/flags/jo.png
Binary files differ
diff --git a/plugins/UserCountry/flags/jp.png b/plugins/UserCountry/flags/jp.png
new file mode 100755
index 0000000000..0cd1398777
--- /dev/null
+++ b/plugins/UserCountry/flags/jp.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ke.png b/plugins/UserCountry/flags/ke.png
new file mode 100755
index 0000000000..a836331550
--- /dev/null
+++ b/plugins/UserCountry/flags/ke.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kg.png b/plugins/UserCountry/flags/kg.png
new file mode 100755
index 0000000000..345815148a
--- /dev/null
+++ b/plugins/UserCountry/flags/kg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kh.png b/plugins/UserCountry/flags/kh.png
new file mode 100755
index 0000000000..34283df5ab
--- /dev/null
+++ b/plugins/UserCountry/flags/kh.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ki.png b/plugins/UserCountry/flags/ki.png
new file mode 100755
index 0000000000..1f17af1408
--- /dev/null
+++ b/plugins/UserCountry/flags/ki.png
Binary files differ
diff --git a/plugins/UserCountry/flags/km.png b/plugins/UserCountry/flags/km.png
new file mode 100755
index 0000000000..d9722a5b08
--- /dev/null
+++ b/plugins/UserCountry/flags/km.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kn.png b/plugins/UserCountry/flags/kn.png
new file mode 100755
index 0000000000..1d109f3e09
--- /dev/null
+++ b/plugins/UserCountry/flags/kn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kp.png b/plugins/UserCountry/flags/kp.png
new file mode 100755
index 0000000000..730c8aab25
--- /dev/null
+++ b/plugins/UserCountry/flags/kp.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kr.png b/plugins/UserCountry/flags/kr.png
new file mode 100755
index 0000000000..d4f2ed0797
--- /dev/null
+++ b/plugins/UserCountry/flags/kr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kw.png b/plugins/UserCountry/flags/kw.png
new file mode 100755
index 0000000000..6f417c39a5
--- /dev/null
+++ b/plugins/UserCountry/flags/kw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/kz.png b/plugins/UserCountry/flags/kz.png
new file mode 100755
index 0000000000..888da17815
--- /dev/null
+++ b/plugins/UserCountry/flags/kz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/la.png b/plugins/UserCountry/flags/la.png
new file mode 100755
index 0000000000..68e007eb24
--- /dev/null
+++ b/plugins/UserCountry/flags/la.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lb.png b/plugins/UserCountry/flags/lb.png
new file mode 100755
index 0000000000..4ed12f8ce8
--- /dev/null
+++ b/plugins/UserCountry/flags/lb.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lc.png b/plugins/UserCountry/flags/lc.png
new file mode 100755
index 0000000000..02ff0afb93
--- /dev/null
+++ b/plugins/UserCountry/flags/lc.png
Binary files differ
diff --git a/plugins/UserCountry/flags/li.png b/plugins/UserCountry/flags/li.png
new file mode 100755
index 0000000000..bc587ce7fb
--- /dev/null
+++ b/plugins/UserCountry/flags/li.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lk.png b/plugins/UserCountry/flags/lk.png
new file mode 100755
index 0000000000..73ed79e1e1
--- /dev/null
+++ b/plugins/UserCountry/flags/lk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lr.png b/plugins/UserCountry/flags/lr.png
new file mode 100755
index 0000000000..f1271bdb1a
--- /dev/null
+++ b/plugins/UserCountry/flags/lr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ls.png b/plugins/UserCountry/flags/ls.png
new file mode 100755
index 0000000000..402fbcca54
--- /dev/null
+++ b/plugins/UserCountry/flags/ls.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lt.png b/plugins/UserCountry/flags/lt.png
new file mode 100755
index 0000000000..b89ccca0c4
--- /dev/null
+++ b/plugins/UserCountry/flags/lt.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lu.png b/plugins/UserCountry/flags/lu.png
new file mode 100755
index 0000000000..18ac3dd4ca
--- /dev/null
+++ b/plugins/UserCountry/flags/lu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/lv.png b/plugins/UserCountry/flags/lv.png
new file mode 100755
index 0000000000..f051b6d917
--- /dev/null
+++ b/plugins/UserCountry/flags/lv.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ly.png b/plugins/UserCountry/flags/ly.png
new file mode 100755
index 0000000000..cdcab768eb
--- /dev/null
+++ b/plugins/UserCountry/flags/ly.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ma.png b/plugins/UserCountry/flags/ma.png
new file mode 100755
index 0000000000..9092c35a1e
--- /dev/null
+++ b/plugins/UserCountry/flags/ma.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mc.png b/plugins/UserCountry/flags/mc.png
new file mode 100755
index 0000000000..e59a0d1235
--- /dev/null
+++ b/plugins/UserCountry/flags/mc.png
Binary files differ
diff --git a/plugins/UserCountry/flags/md.png b/plugins/UserCountry/flags/md.png
new file mode 100755
index 0000000000..38c0770791
--- /dev/null
+++ b/plugins/UserCountry/flags/md.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mg.png b/plugins/UserCountry/flags/mg.png
new file mode 100755
index 0000000000..e21e8cc76d
--- /dev/null
+++ b/plugins/UserCountry/flags/mg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mh.png b/plugins/UserCountry/flags/mh.png
new file mode 100755
index 0000000000..e0d678d4e7
--- /dev/null
+++ b/plugins/UserCountry/flags/mh.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mk.png b/plugins/UserCountry/flags/mk.png
new file mode 100755
index 0000000000..44204c9ab5
--- /dev/null
+++ b/plugins/UserCountry/flags/mk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ml.png b/plugins/UserCountry/flags/ml.png
new file mode 100755
index 0000000000..16eefa899e
--- /dev/null
+++ b/plugins/UserCountry/flags/ml.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mm.png b/plugins/UserCountry/flags/mm.png
new file mode 100755
index 0000000000..d466ce18e0
--- /dev/null
+++ b/plugins/UserCountry/flags/mm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mn.png b/plugins/UserCountry/flags/mn.png
new file mode 100755
index 0000000000..7bf6dc1029
--- /dev/null
+++ b/plugins/UserCountry/flags/mn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mr.png b/plugins/UserCountry/flags/mr.png
new file mode 100755
index 0000000000..ed19107951
--- /dev/null
+++ b/plugins/UserCountry/flags/mr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mt.png b/plugins/UserCountry/flags/mt.png
new file mode 100755
index 0000000000..161460167a
--- /dev/null
+++ b/plugins/UserCountry/flags/mt.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mu.png b/plugins/UserCountry/flags/mu.png
new file mode 100755
index 0000000000..97939ce837
--- /dev/null
+++ b/plugins/UserCountry/flags/mu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mv.png b/plugins/UserCountry/flags/mv.png
new file mode 100755
index 0000000000..61d2ed6d8a
--- /dev/null
+++ b/plugins/UserCountry/flags/mv.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mw.png b/plugins/UserCountry/flags/mw.png
new file mode 100755
index 0000000000..5447a47490
--- /dev/null
+++ b/plugins/UserCountry/flags/mw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mx.png b/plugins/UserCountry/flags/mx.png
new file mode 100755
index 0000000000..f584a82d50
--- /dev/null
+++ b/plugins/UserCountry/flags/mx.png
Binary files differ
diff --git a/plugins/UserCountry/flags/my.png b/plugins/UserCountry/flags/my.png
new file mode 100755
index 0000000000..9bfcbc2887
--- /dev/null
+++ b/plugins/UserCountry/flags/my.png
Binary files differ
diff --git a/plugins/UserCountry/flags/mz.png b/plugins/UserCountry/flags/mz.png
new file mode 100755
index 0000000000..372da92565
--- /dev/null
+++ b/plugins/UserCountry/flags/mz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/na.png b/plugins/UserCountry/flags/na.png
new file mode 100755
index 0000000000..bbdef51eb5
--- /dev/null
+++ b/plugins/UserCountry/flags/na.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ne.png b/plugins/UserCountry/flags/ne.png
new file mode 100755
index 0000000000..0d82e34f96
--- /dev/null
+++ b/plugins/UserCountry/flags/ne.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ng.png b/plugins/UserCountry/flags/ng.png
new file mode 100755
index 0000000000..d92fbdf2a0
--- /dev/null
+++ b/plugins/UserCountry/flags/ng.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ni.png b/plugins/UserCountry/flags/ni.png
new file mode 100755
index 0000000000..b658b73867
--- /dev/null
+++ b/plugins/UserCountry/flags/ni.png
Binary files differ
diff --git a/plugins/UserCountry/flags/nl.png b/plugins/UserCountry/flags/nl.png
new file mode 100755
index 0000000000..7fcf3389db
--- /dev/null
+++ b/plugins/UserCountry/flags/nl.png
Binary files differ
diff --git a/plugins/UserCountry/flags/no.png b/plugins/UserCountry/flags/no.png
new file mode 100755
index 0000000000..33f46ec8b6
--- /dev/null
+++ b/plugins/UserCountry/flags/no.png
Binary files differ
diff --git a/plugins/UserCountry/flags/np.png b/plugins/UserCountry/flags/np.png
new file mode 100755
index 0000000000..9ddeb8c6cd
--- /dev/null
+++ b/plugins/UserCountry/flags/np.png
Binary files differ
diff --git a/plugins/UserCountry/flags/nr.png b/plugins/UserCountry/flags/nr.png
new file mode 100755
index 0000000000..fabb453499
--- /dev/null
+++ b/plugins/UserCountry/flags/nr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/nu.png b/plugins/UserCountry/flags/nu.png
new file mode 100755
index 0000000000..b44137ce44
--- /dev/null
+++ b/plugins/UserCountry/flags/nu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/nz.png b/plugins/UserCountry/flags/nz.png
new file mode 100755
index 0000000000..20f3063a80
--- /dev/null
+++ b/plugins/UserCountry/flags/nz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/om.png b/plugins/UserCountry/flags/om.png
new file mode 100755
index 0000000000..b07880d87f
--- /dev/null
+++ b/plugins/UserCountry/flags/om.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pa.png b/plugins/UserCountry/flags/pa.png
new file mode 100755
index 0000000000..c66b2b9629
--- /dev/null
+++ b/plugins/UserCountry/flags/pa.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pe.png b/plugins/UserCountry/flags/pe.png
new file mode 100755
index 0000000000..e40902db5a
--- /dev/null
+++ b/plugins/UserCountry/flags/pe.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pg.png b/plugins/UserCountry/flags/pg.png
new file mode 100755
index 0000000000..beb54c478e
--- /dev/null
+++ b/plugins/UserCountry/flags/pg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ph.png b/plugins/UserCountry/flags/ph.png
new file mode 100755
index 0000000000..0bc9521610
--- /dev/null
+++ b/plugins/UserCountry/flags/ph.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pk.png b/plugins/UserCountry/flags/pk.png
new file mode 100755
index 0000000000..40e1642c38
--- /dev/null
+++ b/plugins/UserCountry/flags/pk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pl.png b/plugins/UserCountry/flags/pl.png
new file mode 100755
index 0000000000..55595d69fd
--- /dev/null
+++ b/plugins/UserCountry/flags/pl.png
Binary files differ
diff --git a/plugins/UserCountry/flags/po.png b/plugins/UserCountry/flags/po.png
new file mode 100755
index 0000000000..55595d69fd
--- /dev/null
+++ b/plugins/UserCountry/flags/po.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pt.png b/plugins/UserCountry/flags/pt.png
new file mode 100755
index 0000000000..41bc74389f
--- /dev/null
+++ b/plugins/UserCountry/flags/pt.png
Binary files differ
diff --git a/plugins/UserCountry/flags/pw.png b/plugins/UserCountry/flags/pw.png
new file mode 100755
index 0000000000..db73f34b51
--- /dev/null
+++ b/plugins/UserCountry/flags/pw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/py.png b/plugins/UserCountry/flags/py.png
new file mode 100755
index 0000000000..5770973536
--- /dev/null
+++ b/plugins/UserCountry/flags/py.png
Binary files differ
diff --git a/plugins/UserCountry/flags/qa.png b/plugins/UserCountry/flags/qa.png
new file mode 100755
index 0000000000..dc6c83bd40
--- /dev/null
+++ b/plugins/UserCountry/flags/qa.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ro.png b/plugins/UserCountry/flags/ro.png
new file mode 100755
index 0000000000..3bc7fc23b3
--- /dev/null
+++ b/plugins/UserCountry/flags/ro.png
Binary files differ
diff --git a/plugins/UserCountry/flags/rs.png b/plugins/UserCountry/flags/rs.png
new file mode 100755
index 0000000000..9176fbf73c
--- /dev/null
+++ b/plugins/UserCountry/flags/rs.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ru.png b/plugins/UserCountry/flags/ru.png
new file mode 100755
index 0000000000..9176fbf73c
--- /dev/null
+++ b/plugins/UserCountry/flags/ru.png
Binary files differ
diff --git a/plugins/UserCountry/flags/rw.png b/plugins/UserCountry/flags/rw.png
new file mode 100755
index 0000000000..63f3eabd1b
--- /dev/null
+++ b/plugins/UserCountry/flags/rw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sa.png b/plugins/UserCountry/flags/sa.png
new file mode 100755
index 0000000000..08d36aa091
--- /dev/null
+++ b/plugins/UserCountry/flags/sa.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sb.png b/plugins/UserCountry/flags/sb.png
new file mode 100755
index 0000000000..33de8a94e9
--- /dev/null
+++ b/plugins/UserCountry/flags/sb.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sc.png b/plugins/UserCountry/flags/sc.png
new file mode 100755
index 0000000000..da1c535b67
--- /dev/null
+++ b/plugins/UserCountry/flags/sc.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sd.png b/plugins/UserCountry/flags/sd.png
new file mode 100755
index 0000000000..811b2bb402
--- /dev/null
+++ b/plugins/UserCountry/flags/sd.png
Binary files differ
diff --git a/plugins/UserCountry/flags/se.png b/plugins/UserCountry/flags/se.png
new file mode 100755
index 0000000000..829a73503e
--- /dev/null
+++ b/plugins/UserCountry/flags/se.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sg.png b/plugins/UserCountry/flags/sg.png
new file mode 100755
index 0000000000..94835461a9
--- /dev/null
+++ b/plugins/UserCountry/flags/sg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/si.png b/plugins/UserCountry/flags/si.png
new file mode 100755
index 0000000000..9bbf8017dd
--- /dev/null
+++ b/plugins/UserCountry/flags/si.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sk.png b/plugins/UserCountry/flags/sk.png
new file mode 100755
index 0000000000..d1b3e65fe4
--- /dev/null
+++ b/plugins/UserCountry/flags/sk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sl.png b/plugins/UserCountry/flags/sl.png
new file mode 100755
index 0000000000..8e9ceecebf
--- /dev/null
+++ b/plugins/UserCountry/flags/sl.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sm.png b/plugins/UserCountry/flags/sm.png
new file mode 100755
index 0000000000..071b206ebb
--- /dev/null
+++ b/plugins/UserCountry/flags/sm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sn.png b/plugins/UserCountry/flags/sn.png
new file mode 100755
index 0000000000..6d5755f409
--- /dev/null
+++ b/plugins/UserCountry/flags/sn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/so.png b/plugins/UserCountry/flags/so.png
new file mode 100755
index 0000000000..82bcaf4dd5
--- /dev/null
+++ b/plugins/UserCountry/flags/so.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sr.png b/plugins/UserCountry/flags/sr.png
new file mode 100755
index 0000000000..bc1f73936d
--- /dev/null
+++ b/plugins/UserCountry/flags/sr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/st.png b/plugins/UserCountry/flags/st.png
new file mode 100755
index 0000000000..64e2c4a77f
--- /dev/null
+++ b/plugins/UserCountry/flags/st.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sv.png b/plugins/UserCountry/flags/sv.png
new file mode 100755
index 0000000000..42a3d1c438
--- /dev/null
+++ b/plugins/UserCountry/flags/sv.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sy.png b/plugins/UserCountry/flags/sy.png
new file mode 100755
index 0000000000..d7fd71a566
--- /dev/null
+++ b/plugins/UserCountry/flags/sy.png
Binary files differ
diff --git a/plugins/UserCountry/flags/sz.png b/plugins/UserCountry/flags/sz.png
new file mode 100755
index 0000000000..d21a6d72f9
--- /dev/null
+++ b/plugins/UserCountry/flags/sz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/td.png b/plugins/UserCountry/flags/td.png
new file mode 100755
index 0000000000..72a9572148
--- /dev/null
+++ b/plugins/UserCountry/flags/td.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tg.png b/plugins/UserCountry/flags/tg.png
new file mode 100755
index 0000000000..bb5a08a952
--- /dev/null
+++ b/plugins/UserCountry/flags/tg.png
Binary files differ
diff --git a/plugins/UserCountry/flags/th.png b/plugins/UserCountry/flags/th.png
new file mode 100755
index 0000000000..4e19b96f5f
--- /dev/null
+++ b/plugins/UserCountry/flags/th.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tj.png b/plugins/UserCountry/flags/tj.png
new file mode 100755
index 0000000000..7cc1a6a16c
--- /dev/null
+++ b/plugins/UserCountry/flags/tj.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tm.png b/plugins/UserCountry/flags/tm.png
new file mode 100755
index 0000000000..7b5ab2384b
--- /dev/null
+++ b/plugins/UserCountry/flags/tm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tn.png b/plugins/UserCountry/flags/tn.png
new file mode 100755
index 0000000000..010562bf2d
--- /dev/null
+++ b/plugins/UserCountry/flags/tn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/to.png b/plugins/UserCountry/flags/to.png
new file mode 100755
index 0000000000..2580a89472
--- /dev/null
+++ b/plugins/UserCountry/flags/to.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tr.png b/plugins/UserCountry/flags/tr.png
new file mode 100755
index 0000000000..b72f1d770c
--- /dev/null
+++ b/plugins/UserCountry/flags/tr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tt.png b/plugins/UserCountry/flags/tt.png
new file mode 100755
index 0000000000..74ffb3016c
--- /dev/null
+++ b/plugins/UserCountry/flags/tt.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tv.png b/plugins/UserCountry/flags/tv.png
new file mode 100755
index 0000000000..4310483730
--- /dev/null
+++ b/plugins/UserCountry/flags/tv.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tw.png b/plugins/UserCountry/flags/tw.png
new file mode 100755
index 0000000000..f1085b1081
--- /dev/null
+++ b/plugins/UserCountry/flags/tw.png
Binary files differ
diff --git a/plugins/UserCountry/flags/tz.png b/plugins/UserCountry/flags/tz.png
new file mode 100755
index 0000000000..97696c7c0b
--- /dev/null
+++ b/plugins/UserCountry/flags/tz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ua.png b/plugins/UserCountry/flags/ua.png
new file mode 100755
index 0000000000..7554cda9b9
--- /dev/null
+++ b/plugins/UserCountry/flags/ua.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ug.png b/plugins/UserCountry/flags/ug.png
new file mode 100755
index 0000000000..a4297bd2f9
--- /dev/null
+++ b/plugins/UserCountry/flags/ug.png
Binary files differ
diff --git a/plugins/UserCountry/flags/uk.png b/plugins/UserCountry/flags/uk.png
new file mode 100755
index 0000000000..bb6e8d1814
--- /dev/null
+++ b/plugins/UserCountry/flags/uk.png
Binary files differ
diff --git a/plugins/UserCountry/flags/us.png b/plugins/UserCountry/flags/us.png
new file mode 100755
index 0000000000..c305dc58c6
--- /dev/null
+++ b/plugins/UserCountry/flags/us.png
Binary files differ
diff --git a/plugins/UserCountry/flags/uy.png b/plugins/UserCountry/flags/uy.png
new file mode 100755
index 0000000000..8d8b7fc8a2
--- /dev/null
+++ b/plugins/UserCountry/flags/uy.png
Binary files differ
diff --git a/plugins/UserCountry/flags/uz.png b/plugins/UserCountry/flags/uz.png
new file mode 100755
index 0000000000..109b0a3f1f
--- /dev/null
+++ b/plugins/UserCountry/flags/uz.png
Binary files differ
diff --git a/plugins/UserCountry/flags/va.png b/plugins/UserCountry/flags/va.png
new file mode 100755
index 0000000000..dacef2d4c6
--- /dev/null
+++ b/plugins/UserCountry/flags/va.png
Binary files differ
diff --git a/plugins/UserCountry/flags/vc.png b/plugins/UserCountry/flags/vc.png
new file mode 100755
index 0000000000..9c4008f6c5
--- /dev/null
+++ b/plugins/UserCountry/flags/vc.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ve.png b/plugins/UserCountry/flags/ve.png
new file mode 100755
index 0000000000..58c9f4f7e8
--- /dev/null
+++ b/plugins/UserCountry/flags/ve.png
Binary files differ
diff --git a/plugins/UserCountry/flags/vi.png b/plugins/UserCountry/flags/vi.png
new file mode 100755
index 0000000000..d41e345751
--- /dev/null
+++ b/plugins/UserCountry/flags/vi.png
Binary files differ
diff --git a/plugins/UserCountry/flags/vn.png b/plugins/UserCountry/flags/vn.png
new file mode 100755
index 0000000000..7279723255
--- /dev/null
+++ b/plugins/UserCountry/flags/vn.png
Binary files differ
diff --git a/plugins/UserCountry/flags/vu.png b/plugins/UserCountry/flags/vu.png
new file mode 100755
index 0000000000..b2f5847733
--- /dev/null
+++ b/plugins/UserCountry/flags/vu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ws.png b/plugins/UserCountry/flags/ws.png
new file mode 100755
index 0000000000..4b5090da83
--- /dev/null
+++ b/plugins/UserCountry/flags/ws.png
Binary files differ
diff --git a/plugins/UserCountry/flags/xx.png b/plugins/UserCountry/flags/xx.png
new file mode 100755
index 0000000000..c322a28550
--- /dev/null
+++ b/plugins/UserCountry/flags/xx.png
Binary files differ
diff --git a/plugins/UserCountry/flags/ye.png b/plugins/UserCountry/flags/ye.png
new file mode 100755
index 0000000000..0cd596c253
--- /dev/null
+++ b/plugins/UserCountry/flags/ye.png
Binary files differ
diff --git a/plugins/UserCountry/flags/yu.png b/plugins/UserCountry/flags/yu.png
new file mode 100755
index 0000000000..a1eaa596bc
--- /dev/null
+++ b/plugins/UserCountry/flags/yu.png
Binary files differ
diff --git a/plugins/UserCountry/flags/za.png b/plugins/UserCountry/flags/za.png
new file mode 100755
index 0000000000..c6ad99e5e7
--- /dev/null
+++ b/plugins/UserCountry/flags/za.png
Binary files differ
diff --git a/plugins/UserCountry/flags/zm.png b/plugins/UserCountry/flags/zm.png
new file mode 100755
index 0000000000..4c0afc55dd
--- /dev/null
+++ b/plugins/UserCountry/flags/zm.png
Binary files differ
diff --git a/plugins/UserCountry/flags/zr.png b/plugins/UserCountry/flags/zr.png
new file mode 100755
index 0000000000..0a5dc58d2e
--- /dev/null
+++ b/plugins/UserCountry/flags/zr.png
Binary files differ
diff --git a/plugins/UserCountry/flags/zw.png b/plugins/UserCountry/flags/zw.png
new file mode 100755
index 0000000000..516ac1b212
--- /dev/null
+++ b/plugins/UserCountry/flags/zw.png
Binary files differ
diff --git a/plugins/UserSettings.php b/plugins/UserSettings.php
index ee1d2f348f..4462abf312 100644
--- a/plugins/UserSettings.php
+++ b/plugins/UserSettings.php
@@ -203,4 +203,4 @@ function Piwik_UserSettings_keepStrlenGreater($value)
return strlen($value) > 5;
}
-?>
+
diff --git a/tests/all_tests.php b/tests/all_tests.php
index a8a7c64e15..da922b11e2 100755
--- a/tests/all_tests.php
+++ b/tests/all_tests.php
@@ -78,4 +78,4 @@ $test->run(new HtmlReporter());
echo $timer."<br>";
Piwik::printMemoryUsage();
-?>
+
diff --git a/tests/modules/Common.test.php b/tests/modules/Common.test.php
index a6700c1463..bdb0bf414e 100755
--- a/tests/modules/Common.test.php
+++ b/tests/modules/Common.test.php
@@ -411,4 +411,4 @@ class Test_Piwik_Common extends UnitTestCase
$this->assertEqual($result, $expectedResult);
}
}
-?>
+
diff --git a/tests/modules/Date.test.php b/tests/modules/Date.test.php
index 641910f4da..e72e9ed2bc 100644
--- a/tests/modules/Date.test.php
+++ b/tests/modules/Date.test.php
@@ -37,4 +37,4 @@ class Test_Piwik_Date extends UnitTestCase
$this->assertEqual( strtotime(date("Y-m-d",time()-86400). " 00:00:00"), $date->get());
}
}
-?>
+
diff --git a/tests/modules/Period.test.php b/tests/modules/Period.test.php
index c2cac3bd43..d3d53ddc6d 100644
--- a/tests/modules/Period.test.php
+++ b/tests/modules/Period.test.php
@@ -467,4 +467,4 @@ class Test_Piwik_Period extends UnitTestCase
// $this->assertEqual( $week->toString(), $correct);
}
}
-?>
+
diff --git a/tests/modules/Piwik.test.php b/tests/modules/Piwik.test.php
index a33e4f9eaa..1c8f7be15d 100644
--- a/tests/modules/Piwik.test.php
+++ b/tests/modules/Piwik.test.php
@@ -50,4 +50,4 @@ class Test_Piwik extends UnitTestCase
}
}
}
-?>
+
diff --git a/tests/modules/SitesManager.test.php b/tests/modules/SitesManager.test.php
index 11885337e4..10500806df 100755
--- a/tests/modules/SitesManager.test.php
+++ b/tests/modules/SitesManager.test.php
@@ -753,4 +753,4 @@ class Test_Piwik_SitesManager extends Test_Database
}
}
-?>
+
diff --git a/tests/modules/TablePartitioning.test.php b/tests/modules/TablePartitioning.test.php
index c8d23c3c74..f11b54a81a 100755
--- a/tests/modules/TablePartitioning.test.php
+++ b/tests/modules/TablePartitioning.test.php
@@ -130,4 +130,4 @@ class Test_Piwik_TablePartitioning extends Test_Database
}
}
}
-?>
+
diff --git a/tests/modules/blank.test.php b/tests/modules/blank.test.php
index e106d54d8e..22b0745e13 100755
--- a/tests/modules/blank.test.php
+++ b/tests/modules/blank.test.php
@@ -40,4 +40,4 @@ class Test_Piwik_Blank extends UnitTestCase
}
}
}
-?>
+